题目 1 |
以下不属于Struts2中result的type属性( ) |
|
题目 2 |
下列有关拦截器说法错误的是? |
|
题目 3 |
以下哪些是Action接口提供的返回值? |
|
题目 4 |
如果要实现struts2的数据检验功能 |
|
题目 5 |
struts2默认的处理结果类型是: |
|
题目 6 |
在值栈的上下文Context中,存在一些固定的key表示不同的对象,以下描述正确的是? |
|
题目 7 |
以下属于struts2配置文件中的配置元素是:()多选) |
|
题目 8 |
有关值栈 context Map栈数据操作描述正确的是? |
|
题目 9 |
有关 |
|
题目 10 |
token令牌机制,下面说法正确的是? |
|
题目 11 |
下列有关ValueStack内部结构描述正确的是? |
|
题目 12 |
在struts2配置中用( )元素配置常量 |
|
题目 13 |
下列有关访问struts2的action,说法错误的是? |
|
题目 14 |
在Struts2中,可以在哪些配置文件中配置常量()多选 |
|
题目 15 |
下面有关struts2配置文件说法正确的是? |
|
题目 16 |
在 |
|
题目 17 |
以下配置文件,哪些是struts2的? |
|
题目 18 |
有关值栈 root对象栈数据操作描述正确的是? |
|
题目 19 |
下列哪个校验器可以校验“两次密码输入不一致”() |
|
题目 20 |
关于struts2哪些api是正确的? |
|
题目 21 |
struts2 action类的编写,下列说法正确的是? |
|
题目 22 |
struts2动态方法调用的格式为: |
|
题目 23 |
下列哪个结果类型用来转发到Action()单选 |
|
题目 24 |
.在Action接口中提供的5个逻辑视图代表表单输入错误会跳转的视图名称是( ) |
|
题目 25 |
下列有关,表单回显正确的是? |
|
题目 26 |
struts2在控制器类中一般需要添加相应属性的 |
|
题目 27 |
当类型转换失败时,Struts会自动跳转到()结果 单选 |
|
题目 28 |
下列哪个常量用来配置Action的扩展名()单选 |
|
题目 29 |
请看代码 public void setUsername(String username) { public class MyAction extends ActionSupport implements ModelDriven |
|
题目 30 |
下列对stringlength校验器描述正确的是() |
|
题目 31 |
下列有关值栈描述错误的是? |
|
题目 32 |
下列对局部xml配置校验说法正确的是()多选 |
|
题目 33 |
以下有关struts.xml文件描述正确的是? |
A.struts.xml文件必须放置在src下面 |
题目 34 |
以下结果类型描述正确的是? |
|
题目 35(了解) |
下列对全局类型转换器配置描述正确的是()多选 |
|
题目 36(了解) |
下列有关自定义类型转换器说法正确的是? |
|
题目 37 |
OGNL表达式中符合的使用,下面说话错误的是? |
|
题目 38 |
下面有关modelDriven机制,分析正确的是? |
|
题目 39 |
下面代码执行结果? |
|
题目 40 |
.下列有关struts2说法正确的是? |
|
struts token令牌机制
利用Struts同步令牌(Token)机制来解决Web应用中的重复提交问题。该方法的基本原理是:服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session中的令牌值进行比较,看是否匹配。在处理完该request后,且在response发送给客户端之前,将会产生一个新的 Token,该Token除传给客户端以外,也会将用户session中保存的旧的Token进行替换。这样,如果用户会退到刚才的提交页面并再次提交的话,客户端传过来的Token值和服务器端的不一致,从而有效地防止了重复提交地发生。
struts的Token机制实际上就是通过用户提交表单时,比较request中的请求参数“org.apache.struts.taglib.html.TOKEN”的值与当前会话中的属"org.apache.struts.action.TOKEN"的值是否相等,相等则是正常提交,不等则为重复提交。
下面我们看下一个完整的操作流程,这样便于理解:
首先我们要明白,重复提交是发生在什么情况下的,什么情况下需要处理重复提交。我们所要解决的重复提交一般是考虑用户新插入一条记录的情形,对于修改记录的重复提交一般不考虑,因为修改记录本身记录就存在ID,重复提交也只不过是重复更新数据库同一记录而已,对数据的正确性不会有影响。如果新插入一条记录不对重复提交进行处理的话,那么就会在数据库中重复插入同一记录,这样会在数据库产生冗余的重复记录。当我们要插入一条记录时,会分二步走。第一步我们要打开新增记录的页面。第二步,我们会在打开的页面中填写相关信息,然后提交,这个时候提交才算完成。
第一步:假如我们打开新增记录这个操作由add方法完成,代码如下:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
this.saveToken(request);//这个方法就是产生令牌值,struts已有的方法
return mapping.findForward("add");//返回新增页面
} value="8b2d950f23b02c527988a14171254025">
通过调用saveToken(request),产生一个token值。(注:每次调用saveToken方法产生的token值都不同)然后在记录新增页面中的
然后再把token值"8b2d950f23b02c527988a14171254025"保存到当前会话中,也就是 session.setAttribute( "org.apache.struts.action.TOKEN","8b2d950f23b02c527988a14171254025");
第二步:假如我们提交这个页面数据由save方法完成,代码如下:
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
if (this.isTokenValid(request)) {//正常提交 this.resetToken(request);//清空当前会话中的token值
return mapping.findForward("success");//返回保存成功页面
} else {//重复提交
this.saveToken(request);//注:此方法在这里可要也可不要。
return mapping.findForward("fail");//返回重复提交提示信息页面
}
}
判断是不是重复提交关键是isTokenValid(request)这个方法,这个方法由struts提供,如果返回结果为true则表示正常提交,false则为重复提交。isTokenValid(request)这个方法实际上主要做了三件事,
1.判断当前会话是否过期,如果过期,直接返回false
HttpSession session = request.getSession(false);
if (session == null) {
return false;
}
2.然后再判断当前会话中是否存在令牌属性"org.apache.struts.action.TOKEN",如果不存在,返回false
String saved =(String) session.getAttribute("org.apache.struts.action.TOKEN");
if (saved == null) {
return false; 为什么令牌属性"org.apache.struts.action.TOKEN"会不存在呢,那是因为当用户正常提交后,会调用this.resetToken(request);//清空当前会话中的token值。也就是说resetToken(request)方法中调用了 session.removeAttribute("org.apache.struts.action.TOKEN");
当用户重复提交时,我说了"this.saveToken(request);//此方法在这里可要也可不要。",下面我们分
析下,如果不调用这个方法,会话中就不会再重新保存token值,那么再刷新的时候,session中的token
值总是为null,isTokenValid(request)直接返回false,如果调用this.saveToken(request)的话,
session中会重新添加token属性值。这个时候isTokenValid(request)会进行下面第三步的判断。
3.从当前会话中取得token的值与当前request中得到的token值比较,相同返回true,不同返回false
String token = request.getParameter("org.apache.struts.taglib.html.TOKEN");
if (token == null) {
return false; return saved.equals(token);
如果是重复刷新,那么每次request中的令牌值都是一样的,但每次刷新当前会话中的令牌值都被重新替换了,所以会返回false
注:使用struts的表单提交Token机制时,提交的表单一定要写成<html:form>这种形式,如果写成这种形式的话,尽管调用saveToken(request)方法也不会在当前的里面生成隐含表单,最终的结果都是"重复提交".
动态方法调用
在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多
第一种方式:指定method属性
这种方式我们前面已经用到过,类似下面的配置就可以实现
method="chainAction">
method="plainText">
第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
用这种方式需要先开启一个开关
将此常量设置为true,这种方式才能使用,使用见示例
Action
package chapter3.action;
public class Chapter3Action {
public String result1(){
return "result1";
}
public String result2(){
return "result2";
}
}
Jsp中访问方式
result1a><br><ahref="
{basePath}/chapter3/chapter3Action!result2">result2
如果配置了后缀,必须这样写:
/chapter4/chapter4Action!create.action
XML中配置方式
第三种方式:通配符方式(官网推荐使用)
首先得关闭开关
这一种方式是由第一种转变过来的,我们可以看到,第一种方式有很多重复的代码,那么我们可以进行变形,看下面的代码
method="{1}">
on>
chapter3_*这里的*就是你呆会要匹配的字符串,即你在后面的请求中得这样写
http://...../ chapter3_create 或 http://...../ chapter3_update
注意,这时你action中必须有create和update方法与之匹配,甚至还可以这样匹配
method="{1}">
但是这时一定要有对应的JSP页面存在,并且相应的路径不能错,这就对我们的命名进行了强制性的规定,一定要规范.
课堂示例:
Action
public class Chapter4Action extends ActionSupport {
public String list(){
return "list";
}
public String create(){
return "create";
}
public String index(){
return "index";
}
}
XML:
访问Servlet API
有时我们需要用到Request, Response, S
本文来源:https://www.2haoxitong.net/k/doc/e83f96cfa300a6c30d229f2e.html
文档为doc格式