Struts 2
Struts 2
工作原理
Struts 2自带
自定义
能力目标
熟悉Struts 2工作原理
熟练使用和配置
本章简介
上一章我们深入学习了Struts 2框架的配置,包括Action的配置、Result的配置等等,使我们对Struts 2框架有了更深的了解。Struts 2的核心包括Action、Result和。是Struts 2的一个重要特性,实际上Struts 2框架的核心功能都是由负责完成的。
(Interceptor)能动态拦截Action调用的对象。它提供了一种机制使开发者可以在一个Action执行之前或执行之后插入需要的代码,同时它也是提供了一种可以提取Action中可重用代码的方式。本章将重点学习Struts 2。
核心技能部分
在第五章学习Struts 2体系结构时已经提到了,它主要出现在Action执行之前或执行之后,大家可以先回顾一下。对于Web应用程序来说,有很多的业务都是通用的,例如对请求数据的封装、数据的校验、防止表单重复提交等。早期的MVC框架将这些业务功能都写死在核心控制器中了,这直接导致框架的灵活性和可扩展性严重下降。
Struts 2将它的核心功能放到中实现而不是集中在核心控制器里,并且每个完成一个业务功能,不同的还能自由组合,这使得开发人员能够更加高效、灵活的使用Struts 2框架进行开发。
是动态拦截Action调用的对象,的方法可以在Action执行之前或之后自动执行,从而将通用的操作动态地插入到Action执行的前后,这跟我们平时组装电脑很类似,业务功能变成了可插拔式,需要哪个功能就“插入”一个,不需要就“拔出”,非常有利于系统的解耦。
单一的还可以灵活的组合在一起构成栈。是一个类,通过在struts.xml中进行配置来发挥作用。
5.1.1 工作原理
围绕着Action和Result的执行而执行,如图5-1-1所示。Action被一系列的包裹,首先执行Action之前的,并按照顺序依次执行1、2、……,在Action和Result执行过之后,会再一次执行,并按照相反的顺序依次执行,图5-1-2清晰的显示了这种顺序。在这一系列执行过程中,任何一个都可以直接返回,从而终止余下的的执行。
图5.1.1 工作原理
图5.1.2 Struts 2时序图
5.1.2 Struts 2自带
Struts 2框架提供了一系列功能强大的,它们实现了框架的大部分功能,同时在实际开发中我们也可以灵活应用这些Struts 2自带的。打开Struts 2源文件中的struts-default.xml文件,如图5.1.所示,Struts 2自带的就配置在这个文件里。
图5.1. Struts 2自带
单个由<interceptor>元素配置,name属性设置的逻辑名,class属性设置的实现类。
下面对Struts 2自带的进行简单介绍:
Ø checkbox:添加了对表单中checkbox自动处理的代码,将没有选中的checkbox的内容
设定为false,而HTML默认情况下不提交没有选中的checkbox。
conversionError:将错误信息从ActionContext中添加到Action的属性字段中。
createSession:自动创建HttpSession,用来为需要使用到HttpSession的服务。
execAndWait:在后台执行Action,同时将用户带到一个中间的等待页面。
exception:捕获异常并能根据异常类型映射到用户自定义的错误页面。
fileUpload:提供文件上传功能。
params:将请求中的参数设置到Action的属性上。
scope:将Action状态存入session和application的简单方法。
servletConfig:提供访问HttpServletRequest和HttpServletRespe的方法,以Map的方
式访问。
token:防止表单重复提交。
tokenSession:和token一样,不过双击的时候把请求的数据存储在session中。
validation:执行数据校验。
workflow:调用Action的validate方法,一旦有错误返回就终止执行流程。
上面列出了Struts 2常用的,在实际应用中,我们经常需要组合不同的形成一个栈,Struts 2框架在struts-default.xml中定义了一个默认的栈defaultStack,如图5.1.4所示,这个栈组合了多个,并且这些的顺序都是经过精心设计的,能满足大多数Web应用的需求。在struts.xml中,我们自定义的包(package)通常都要继承struts-default包,而此包指定了defaultStack栈为默认栈,所以如果用户的自定义包继承了struts-default包,也会自动将defaultStack做为默认。如果用户没有为Action指定,系统将会自动把defaultStack栈作用于此Action。
图5.1.4 defaultStack栈
的使用分为三个步骤:
(1) 实现类
(2) 在struts.xml中定义或栈
() 为Action配置或栈
如果我们使用的是Struts 2自带的,那么只需要进行第三步即可;如果我们使用的是自己开发的,就需要进行以上三步。下面是配置语法。
代码语言:javascript代码运行次数:0运行复制<struts>
<package name ="admin" extends="struts-default">
<!—定义 -- >
<interceptors>
<interceptorname="1" class="的实现类" />
... ...
<interceptor-stack name="栈1">
<interceptor-ref name="1"/>
<interceptor-ref name="2"/>
... ...
</interceptor-stack>
</interceptors>
<!—使用 -- >
<action name="checkLogin" class="tmq.action.DefaultAction" >
<result name="success">/success.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="1" />
<interceptor-ref name="栈1"/>
</action>
</package>
</struts>
所有的或栈都定义在<interceptors>元素内,单个由它的子元素<interceptor>s定义,name属性定义的逻辑名,class属性用来指定的实现类。
栈由<interceptor-stack>元素定义,并需要通过子元素<interceptor-ref>来引用已经定义好的作为栈元素,<interceptor-ref>的name属性用来设置想要引用的的逻辑名。
定义好或栈以后,需要在Action的配置中为<action>元素配置或栈,此时使用的也是<interceptor-ref>,name同样设置为想要引用的的逻辑名,这里可以直接使用Struts的自带的。
5..1 如何使用自定义的
虽然Struts 2提过了如此丰富的,但是在实际应用中,我们仍需要自己开发以满足经常变化的业务需求。
自定义的类通常需要实现xwork2.interceptor.lnterceptor 接口,该接口的源代码如下所示。
代码语言:javascript代码运行次数:0运行复制public interface Interceptor {
void destroy();
void init();
String intercept (ActionInvocation invocation) throws Exception;
}
}
该接口定义了三个方法:
init(),该方法执行于执行拦截之前,且每个只执行一次。因此,该方法的
主要用于打开某些资源。
destroy(),该方法与init()方法对应。在实例被销毁之前,系统将回调此方法,销
毁在init()方法中打开的资源。
intercept(Actionlnvocationinvocation),该方法是用户需要实现的动作,返回一个result配置字符串作为逻辑视图。该方法的ActionInvocation参数包含被拦截的Action的引用,可以通过调用该参数的invoke方法,将控制权转给下一个或者Action。详见表7-1-1所示。
表7-1-1 Actionlnvocation类的常用方法
方法 | 描述 |
---|---|
Object getAction() | 获得与关联的Action,注意进行强制类型转换。 |
String invoke()throws Exception | 继续执行后面的或Action,可能抛出任何异常。 |
除此之外,Struts2还提供了一个xwork2.interceptor.Abstractlnterceptor类,该类提供了一个init方法和destroy方法的空实现。如果自定义的不需要申请资源,就无须实现这两个方法。所以,继承自Abstractlnterccptor类来实现自定义会更加简便。
示例5.1
考虑一般的WEB应用,基本都可分为前台和后台两部分,后台主要是对整个WEB应用进行管理,所以要使用后台必须先登录,后台部分可能包含了很多的Action和JSP视图,我们必须保证用户不能直接访问后台的每一个Action和JSP视图,或者说要想访问就必须先登录,这属于访问控制,这种情况非常适合使用来解决,接下来我们使用重构登录案例,把登录验证用来实现。
(1) 实现类
代码语言:javascript代码运行次数:0运行复制public class LoginInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation ai) throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession();
User user = (User)session.getAttribute("loginUser");
if(user!=null)
return ai.invoke(); //登录成功则继续执行后面的或Action
else
return "error";
}
}
(2) 实现Action。
public class LoginAction extends ActionSupport{
private String name;
private String pwd;
//省略getter和setter方法
public String execute()
{
return SUCCESS;
}
}
由于我们把登录业务放在了中实现,所以Action中就无需编写业务实现代码了,直接在execute方法中返回了SUCCESS。
() 登录视图页面login.jsp
代码语言:javascript代码运行次数:0运行复制<body>
<form action="login.action" method="post">
<table width="97" height="169" border="0" align="center">
<tr>
<td colspan="2" align="center">管理员登录</td>
</tr>
<tr>
<td width="16" align="right">登录名称:</td>
<td width="218"><input name="name" type="text" class="txt"></td>
</tr>
<tr>
<td align="right">登录密码:</td>
<td><input name="pwd" type="password" class="txt"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
(4) 在struts.xml配置文件中配置LoginAction的。
代码语言:javascript代码运行次数:0运行复制<struts>
<package name="admin" extends="struts-default">
<interceptors>
<interceptor name="loginInter" class="com.zy.LoginInterceptor"/>
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="loginInter" />
</interceptor-stack>
</interceptors>
<action name="login" class="com.zy.LoginAction">
<result name="success" type="redirect">/index.jsp</result>
<result name="error" type="redirect">/login.jsp</result>
<interceptor-ref name="loginStack" />
</action>
</package>
</struts>
在上述代码中,我们首先使用<interceptor>在配置文件中定义了自己开发的,然后把该和Struts 2默认的defaultStack组成了一个栈,最后为名字是“login”的action指定了这个栈。
如果其他的Action也需要进行登录访问控制,就只需要为该Action配置实现登录验证的即可。
5..2 默认
通常情况下,WEB应用的后台部分可能包含了很多的Action和JSP视图,为了实现访问控制,我们要给后台的每个Action都配置,虽然能够实现,但是过于繁琐,更好的解决方案就是给这些后台Action配置一个默认的(栈)。
默认(栈)定义在包(package)中,该包(package)中的所有Action都共享使用该默认(栈),每个包(package)中只能定义一个默认(栈)。
在struts.xml文件中使用<default-interceptor-ref>元素来配置默认(栈),它是包(package)的子元素,该元素的name属性值是一个已经定义好的某个(栈)的名字。参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制<struts>
<package name ="admin" extends="struts-default">
<interceptors>
<interceptor name="loginInter" class="com.zy.LoginInterceptor"/>
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="loginInter" />
</interceptor-stack>
</interceptors>
<!-- 为此包配置一个默认或栈 -- >
代码语言:javascript代码运行次数:0运行复制<default-interceptor-ref name="loginStack"/>
<!-- Action,可以有多个 -- >
<action name="login" class="com.zy.LoginAction">
<result name="success" type="redirect">/index.jsp</result>
<result name="error" type="redirect">/login.jsp</result>
</action>
<action>
……
</action>
……
</package>
</struts>
注意:
如果包中的某些Action没有显式的指定任何,则默认将会起作用。如果包中的某个Action显式指定了某个,则默认的将不会起作用,如果该Action还必须使用默认,那么就需要手动的配置该默认的引用。
5.4.1 方法过滤
在默认情况下,如果我们为某个Action指定了,那么这个就会拦截Action中的所有方法。但是有时候,实际需求并不希望拦截Action中所有的方法,而是只需要拦截其中的某些方法,这时就需要使用Struts 2提供的方法过滤功能。例如:在一个Action中我们实现了对商品的增、删、改、查等业务方法,管理员和普通用户都可以进行增、改、查操作,但是只有管理员可以进行删除操作,因此我们可以通过一个只拦截Action中的删除方法,在拦截时判断当前的用户是否为管理员。
为了实现方法过滤,Struts 2提供了一个MethodFilterInterceptor抽象类。这个类重写了AbstractInterceptor类中的intercept方法,但是提供了doIntercept(ActionInvocation invocation)的抽象方法。如果开发者要实现方法过滤,则应该继承MethodFiledIntercepor抽象类,并重写doIntercept(ActionInvocation invocation)方法。
示例5.2
下面我们通过一个示例来演示如何使用方法过滤,可以拦截Action中删除管理员的方法,不拦截添加和查询管理员的方法。
(1) 实现类,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制public class AdminInterceptor extends MethodFilterInterceptor {
protected String doIntercept(ActionInvocation ai) throws Exception {
println("起作用了");
return ai.invoke();
}
}
此处只是为了演示方法过滤的使用,所以在doIntercept方法中仅仅进行了控制台输出。
(2) 实现Action,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制public class AdminAction {
public String add()
{
println("添加管理员");
return "success";
}
public String query()
{
println("查询管理员");
return "success";
}
public String del()
{
println("删除管理员");
return "success";
}
}
上述代码分别模拟实现了添加、查询和删除管理员的方法。本示例要求可以拦截删除管理员的方法,不拦截添加和查询管理员的方法。
() struts.xml文件的配置代码如下所示。
代码语言:javascript代码运行次数:0运行复制<struts>
<package name="admin" extends="struts-default">
<interceptors>
<interceptor name="adminInter" class="com.zy.AdminInterceptor"/>
</interceptors>
<action name="admin_*" class="com.zy.AdminAction" method="{1}">
<result name="success" type="redirect">/index.jsp</result>
<interceptor-ref name="adminInter">
<param name="includeMethods">del</param>
<param name="excludeMethods">query</param>
</interceptor-ref>
</action>
</package>
</struts>
从上面的代码可以看出,在struts.xml文件中定义实现方法过滤的与普通是一样的,都是使用<interceptor>进行定义。不同的是,在为<action>元素指定时,方法过滤可以使用<param>元素设置拦截哪些方法,不拦截哪些方法。
<param>元素的name属性是必须的,主要有两个取值:
includeMethods:设置需要拦截(过滤)的方法,只需把Action中的方法名罗列出来即可,多个方法之间用逗号隔开
excludeMethods:设置不需要拦截(过滤)的方法,只需把Action中的方法名罗列出来即可,多个方法之间用逗号隔开
注意
如果一个方法既被指定在excludeMethods中,同时又被指定在includeMethods中,则此方法会被拦截,即includeMethods的优先级高于excludeMethods。
如果一个方法既没有被指定在excludeMethods中,同时又没有被指定在includeMethods中,则此方法不会被拦截。
接下来我们开始测试,直接通过URL访问Action并调用相应的方法。
访问http://localhost:8080/Struts7-adv/admin_add.action,运行效果如图5.1.5所示。
图5.1.5 添加管理员
访问http://localhost:8080/Struts7-adv/admin_query.action,运行效果如图5.1.6所示。
图5.1.6 查询管理员
访问http://localhost:8080/Struts7-adv/admin_del.action,运行效果如图5.1.7所示。
图5.1.7 删除管理员
5.4.2 拦截顺序
前面学习工作原理时,我们介绍了的执行时序图,首先执行Action之前的,并按照顺序依次执行1、2、 ……,在Action和Result执行过之后,会再一次执行,并按照相反的顺序依次执行,下面我们通过一个案例来演示的执行顺序。
示例5.
代码语言:javascript代码运行次数:0运行复制public class SortInterceptor1 extends AbstractInterceptor{
public String intercept(ActionInvocation ai) throws Exception {
println("1开始执行...");
String result=ai.invoke();
println("1执行完毕...");
return result;
}
}
public class SortInterceptor2 extends AbstractInterceptor{
public String intercept(ActionInvocation ai) throws Exception {
println("2开始执行...");
String result=ai.invoke();
println("2执行完毕...");
return result;
}
}
public class SortInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation ai) throws Exception {
println("开始执行...");
String result=ai.invoke();
println("执行完毕...");
return result;
}
}
上述代码创建了三个类,代码比较简单,这里不再多述。下面是Action类的参考代码。
public class SortAction extends ActionSupport {
public String execute()
{
println("Action执行...");
return "success";
}
}
该Action只有一个execute方法,不再多述,重点看下面的struts.xml配置文件,参考代码如下所示。
<struts>
<package name="sort" extends="struts-default">
<interceptors>
<interceptor name="sortInter1" class="com.zy.SortInterceptor1"/>
<interceptor name="sortInter2" class="com.zy.SortInterceptor2"/>
<interceptor name="sortInter" class="com.zy.SortInterceptor"/>
</interceptors>
<action name="sort" class="com.zy.SortAction">
<result name="success" type="redirect">/index.jsp</result>
<interceptor-ref name="sortInter1"/>
<interceptor-ref name="sortInter2"/>
<interceptor-ref name="sortInter"/>
</action>
</package>
</struts>
在配置文件中,我们定义了三个并为名字是“sort”的action元素指定了这三个。运行效果如图5.1.8所示。
图5.1.8 执行顺序
在Action执行之前,三个按照配置的顺序依次执行;在Action执行之后;三个按照相反的顺序依次执行。
本章总结
是动态拦截Action调用的对象,的方法可以在Action执行之前或之后自动执行,从而将通用的操作动态地插入到Action执行的前后,这跟我们平时组装电脑很类似,业务功能变成了可插拔式,需要哪个功能就“插入”一个,不需要就“拔出”,非常有利于系统的解耦。
Ø 系统。在struts-default.xml中配置了一组,并组成了默认栈,自定义Action通过package的extends属性直接或者间接的继承到了的配置。
Ø 自定义。
(1)创建类,实现xwork2.interceptor.lnterceptor 接口。
(2)使用<interceptor>在配置文件中定义了自己开发的,然后把该和Struts 2默认的defaultStack组成了一个栈。
()在Action的配置中引用该栈。
Ø 默认。默认(栈)定义在包(package)中,该包(package)中的所有Action都共享使用该默认(栈),每个包(package)中只能定义一个默认(栈)。在struts.xml文件中使用<default-interceptor-ref>元素来配置默认(栈)。
Ø 方法过滤
(1)继承MethodFiledIntercepor抽象类,并重写doIntercept(ActionInvocation invocation方法。
(2)为<action>元素指定时,方法过滤可以使用<param>元素设置拦截哪些方法,不拦截哪些方法。
任务实训部分
1:计算器除0
训练技能点
动态方法调用
自定义
需求说明
在上一章的任务实训部分我们实现了一个简单的计算器,现在要求:当用户进行除法运
算时,如果除数为0则不进行运算并跳转到一个提示“除数不能为0”的页面,必须使
用实现。
实现步骤
(1) 创建Action类,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制public class CalculatorAction {
private double num1;
private double num2;
private double result;
public String jia()
{
result=num1+num2;
return "result";
}
public String jian()
{
result=num1-num2;
return "result";
}
public String cheng()
{
result=num1*num2;
return "result";
}
public String chu()
{
result=num1/num2;
return "result";
}
//省略getter和setter方法
}
(2) 创建与Action对应的视图页面,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制<body>
<form name="frm" method="post">
<table width="298" border="0" align="center">
<tr>
<td colspan="2" align="center">简易计算器</td>
</tr>
<tr>
<td width="76" align="center">第一个数</td>
<td width="206"><input type="text" name="num1" value="${num1}"></td>
</tr>
<tr>
<td align="center">第二个数</td>
<td><input type="text" name="num2" value="${num2}"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="+" οnclick="submitForm('jia')">
<input type="button" value="-" οnclick="submitForm('jian')">
<input type="button" value="*" οnclick="submitForm('cheng')">
<input type="button" value="/" οnclick="submitForm('chu')"></td>
</tr>
<tr>
<td align="center">结果</td>
<td><input type="text" name="result" readonly value="${result}"></td>
</tr>
</table>
</form>
</body>
<script>
function submitForm(op)
{
frm.action="cal_"+op+".action";
frm.submit();
}
</script>
() 创建除0,参考代码如下所示。
public class CalculatorInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation ai) throws Exception {
CalculatorAction ca=(CalculatorAction)ai.getAction();
if(ai.getProxy().getMethod().equals("chu")&&ca.getum2()==0)
return "error";
else
return ai.invoke();
}
}
在类中需要解决的一个问题是:判断此次请求调用的是否是Action中的chu()方法。ActionInvocation类的getProxy()方法可以获得当前Action的代理对象,该对象的getMethod()方法可以获得当前请求调用的方法名。
(4) 下面是struts.xml文件的参考代码
代码语言:javascript代码运行次数:0运行复制<struts>
<ctant name="struts." value="utf-8"></ctant>
<package name="shangji" extends="struts-default">
<interceptors>
<interceptor name="calInter" class="com.
CalculatorInterceptor"/>
</interceptors>
<action name="cal_*" class="com.CalculatorAction" method="{1}">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="calInter"/>
<result name="result" type="dispatcher">/calculator.jsp</result>
<result name="error" type="redirect">/error.html</result>
</action>
</package>
</struts>
我们为action指定了两个,一个是Struts 2默认的defaultStack栈,另一个是我们自定义的。运行效果如图5.2.1和图5.2.2所示,当我们进行除0运算时,页面跳转到了error.html。
图5.2.1 计算器
图5.2.2 提示
2:脏字过滤
训练技能点
自定义
需求说明
很多网站都有评论功能,即用户可以对商品、新闻等进行评论,但是个别用户发表的评论可能带有一些“脏字”,例如“妈的”等等。现在要求当用户发表的评论中带有“妈的”文字时不予执行并要求重新发表评论,必须使用实现。
实现步骤
(1) 创建Action类,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制public class WordAction {
private String title; //标题
private String context; //正文
public String pub()
{
//省略将评论插入到数据库中的代码
return "success";
}
//省略getter和setter方法
}
(2) 创建与之对应的视图页面,参考代码如下所示。
代码语言:javascript代码运行次数:0运行复制<body>
<form method="post" action="pub.action">
<table border="0" align="center">
<tr>
<td>标题:</td>
<td><input name="title" type="text" size="0"></td>
</tr>
<tr>
<td>正文:</td>
<td><textarea name="context" cols="28" rows="10"></textarea></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
() 创建脏字过滤,参考代码如下所示。
public class WordInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation ai) throws Exception {
WordAction wa=(WordAction)ai.getAction();
if(wa.getTitle().indexOf("妈的")!=-1||
wa.getContext().indexOf("妈的")!=-1)
return "input";
else
return ai.invoke();
}
}
(4) 下面是struts.xml文件的参考代码
代码语言:javascript代码运行次数:0运行复制<struts>
<ctant name="struts." value="utf-8"></ctant>
<package name="shangji" extends="struts-default">
<interceptors>
<interceptor name="wordInter" class="com.zy.word.
WordInterceptor"/>
</interceptors>
<action name="pub" class="com.zy.word.WordAction" method="pub">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="wordInter"/>
<result name="success" type="redirect">/success.html</result>
<result name="input" type="redirect">/pub.html</result>
</action>
</package>
</struts>
运行效果如图5.2.所示,当我们发表的评论中带有“妈的”文字时会重新回到发表评论的页面。
图5.2. 脏字过滤
:限时访问
训练技能点
自定义
全局结果
需求说明
很多商业网站或软件都需要经常性的进行数据备份或维护,假如现在某个网站从凌晨1点到凌晨4点要进行维护,这个时间段暂停服务,即所有对本网站的访问都将被重置到一个带有提示信息的网页,如图5.2.4所示,要求用实现。
实现步骤
代码语言:javascript代码运行次数:0运行复制public class TimeInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation ai) throws Exception {
Calendar cale=Calendar.getInstance();
int curr=cale.get(Calendar.HOUR_OF_DAY);
if(curr>1&&curr<)
return "tishi";
else
return ai.invoke();
}
}
这里我们只给出类的参考代码,在intercept()方法中最重要的是获得当前的时间,这里使用Calendar类的相关方法获得当前的小时数。
图5.2.4 限时访问
4:为管理员登录增加
训练技能点
自定义
默认
需求说明
在第五章我们实现了管理员登录以及对管理员的增删改查等操作,现在要求为登录、增加、删除、修改和查询管理员添加默认,管理员必须登录成功才能进行增删改查操作,没有登录直接返回到登录页面。
巩固练习
一、选择题
1. 以下关于的说法错误的是()。
A. 可以在Action执行前后做一些操作
B. Struts自带的用户无法使用
C. 是一个特殊的Action
D. 只在Action之前发挥作用
2.自定义中的invoke()代码表示()。
A. 不执行目标Action的方法,直接返回
B. 执行目标Action的方法,直接返回结果视图
C. 在自定义中,该代码是必需的
D. 在自定义中,该代码是可选的
.开发自定义的步骤是()。
A. 在struts.xml文件中定义
B. 创建类
C. 在struts.xml文件中为action元素指定
D. 继承struts-default
4.下面()用来将请求中的参数设置到Action的属性上。
A. token
E. params
F. workflow
G. validation
5.下面关于<interceptor>元素说法错误的是()。
A. name属性指定的名称
H. name属性的值必须被某个Action所引用
I. 该元素是<package>的子元素
J. class属性指定的实现类
二、上机练习
在实训任务4的基础上扩展功能,管理员admin是超级管理员,只有他登录的时候才
可以进行任何操作,其他管理员登录后只能进行查询操作,用实现。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-0-10,如有侵权请联系 cloudcommunity@tencent 删除配置strutsaction登录框架#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:Struts 2基础入门
推荐阅读
留言与评论(共有 8 条评论) |
本站网友 永州皮肤病医院 | 1分钟前 发表 |
<param>元素的name属性是必须的 | |
本站网友 天摇地动 | 16分钟前 发表 |
同时又没有被指定在includeMethods中 | |
本站网友 黄牛抢票 | 16分钟前 发表 |
下面对Struts 2自带的进行简单介绍:Ø checkbox:添加了对表单中checkbox自动处理的代码 | |
本站网友 张一山的父母 | 3分钟前 发表 |
(1) 实现类代码语言:javascript代码运行次数:0运行复制public class LoginInterceptor implements Interceptor { public void destroy() { } public void init() { } public String intercept(ActionInvocation ai) throws Exception { HttpSession session = ServletActionContext.getRequest().getSession(); User user = (User)session.getAttribute("loginUser"); if(user!=null) return ai.invoke(); //登录成功则继续执行后面的或Action else return "error"; } } (2) 实现Action | |
本站网友 闫琦 | 9分钟前 发表 |
把登录验证用来实现 | |
本站网友 lvyou | 19分钟前 发表 |
当我们进行除0运算时 | |
本站网友 重庆美仑美奂 | 7分钟前 发表 |
然后把该和Struts 2默认的defaultStack组成了一个栈 |