Struts2考试题分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目1
以下不属于Struts2中result的type属性( )
A.action
B.redirect
C.redirectAction
D.dispatcher
题目2
下列有关拦截器说法错误的是?
A.struts通过拦截器完成执行action请求处理方法前一系列操作。
例如:数据封装、文件上传、数据校验等
B.在struts中,直接访问jsp页面,struts将使用默认拦截器栈处理当前请求。
C.在执行action时,struts将执行若干拦截器1、2、3,执行action完成后,将继续执行拦截器3、2、1
D. 默认情况,在一个action没有配置拦截器的引用,说明当前action将不使用拦截器
题目3
以下哪些是Action接口提供的返回值?
A.success
B.none
C.error
D.input
题目4
如果要实现struts2的数据检验功能
A普通的Action类可以实现
B继承自Action接口的可以实现
C继承自ActionSupport类可以实现
D继承自ActionValidate类可以实现
题目5
struts2默认的处理结果类型是:
A.dispatcher
B.redirect
C.chain
D.forward
题目6
在值栈的上下文Context中,存在一些固定的key表示不同的对象,以下描述正确的是?
A.request,表示request作用域的数据
B.session,表示session作用域的数据
C.application,表示application作用域的数据
D.parameters,表示请求参数的所有数据
题目7
以下属于struts2配置文件中的配置元素是:()多选)
A.<package>
B.<action>
C.<form-beans>
D.<action-mappings>
题目8
有关值栈 context Map栈数据操作描述正确的是?
A.ActionContext.getContext().put(key,value) 直接对context进行操作
B.使用<s:property value="#key"/>获得context中指定key的内容
C.ActionContext.getContext().getSession().put(key,value); 将数据放置context 固定key为session对应的map中
D.ActionContext.getContext().getApplication().put(key,value); 将数据放置context固定key为application对应的map中
题目9
有关<s:iterator/>描述正确的是?
A.value属性的值对应值栈中的相关的数据
B.默认情况,将遍历的每一个数据都临时压入到root的栈顶,遍历结束时再将数据移除
C.如果使用var属性,在值栈的context中存放一个键值对
D.如果使用status属性,可以获得当前遍历的状态。
例如:遍历的索引,是否为奇偶等
题目10
token令牌机制,下面说法正确的是?
A.如果要使token可用,必须在jsp表单中提供<s:token />,struts.xml 使用token拦截器
B.在struts2默认的拦截器栈中包含token拦截器
C.<s:token>标签的作用在jsp页面生成一个隐藏域数据
D.token拦截器可以通过includeMethods属性设置需要进行拦截的方法
题目11
下列有关ValueStack内部结构描述正确的是?
A.ValueStack内部有两个逻辑部分:root 和 context
B.ValueStack的上下文context中存放了request、session、application 的引用
C.ValueStack的root部分,可以用于存放对象。
在jsp页面中通过struts 标签,可以使用对象的属性,直接获得需要的数据。
D.ValueStack的context部分,struts将使用key=value的形式存放数据,在jsp页面中通过struts标签,可以使用”#key”方式获指定的数据
题目12
在struts2配置中用()元素配置常量
A.<action>
B.<package>
C.<constant>
D.<include>
题目13
下列有关访问struts2的action,说法错误的是?
A.action的访问路径,需要使用<package>标签的namespace属性的值和
<action>标签的name属性的值
B.如果访问路径是”/primer/helloWorldAction”,并在页面中成功显示,
<package>标签的namespace属性值可以是”/primer”
C.在配置<action>时,其中class属性是用来请求访问的Action类。
D.在struts.xml文件中必须配置拦截器
题目14
在Struts2中,可以在哪些配置文件中配置常量()多选
A.struts.xml
B.struts.properties
C.web.xml
D.server.xml
题目15
下面有关struts2配置文件说法正确的是?
A.default.properties文件,struts2提供的默认常量配置文件
B.struts-default.xml文件,struts2提供默认功能实现配置文件。
此文件中提供大量的拦截器,结果集类型等
C.struts.xml文件,是struts2预留给框架使用者,编写自定义配置信息的
D.struts-default.xml,struts-plugin.xml和struts.xml文件加载是没有顺序的
题目16
在<action>元素中,那个属性可以指定Action中要执行的方法的名称( )
A.method
C.class
D.methodName
题目17
以下配置文件,哪些是struts2的?
A.default.properties
B.action.xml
C.struts2.xml
D.struts.xml
题目18
有关值栈 root对象栈数据操作描述正确的是?
A.valueStack.push(obj) 将指定的对象压入到栈顶
B.在jsp页面,可以使用<s:property/> 获得栈顶的数据
C.valueStack.getRoot()不能获取对象栈
D.在jsp页面,可以使用<s:property value="name"/> 获得对象栈中name 属性的值
题目19
下列哪个校验器可以校验“两次密码输入不一致”()
A.required
B. requiredstring
C.stringlength
D.fieldexpression
题目20
关于struts2哪些api是正确的?
A.ServletActionContext.getRequest() 可以获得HttpServletRequest
B.ServletActionContext.getResponse() 可以获得HttpServletResponse
C.ServletActionContext.getServletContext() 可以获得ServletContext
D.ServletActionContext.getRequest().getSession() 可以获得HttpSession
题目21
struts2 action类的编写,下列说法正确的是?
A.action类可以不继承任何类,不实现任何接口
B.action类可以实现struts提供的接口Action
C.action类可以继承ActionSupport
D.action类中请求处理方法,必须是共有的,方法名称自定义,且没有参数。
题目22
struts2动态方法调用的格式为:
A.ActionName?methodName.action
B.ActionName!methodName.action
C.ActionName*methodName.action
D.
题目23
下列哪个结果类型用来转发到Action()单选
A.dispatcher
B.chain
C.redirectAction
D.stream
题目24
.在Action接口中提供的5个逻辑视图代表表单输入错误会跳转的视图名称是( )
A.SUCCESS
B.ERROR
C.INPUT
D.LOGIN
题目25
下列有关,表单回显正确的是?
A.只要将数据放置到request作用域,struts表单标签可以根据name属性进行回显
B.只要将数据放置到session作用域,struts表单标签可以根据name属性进行回显
C.只要将数据放置到application作用域,struts表单标签可以根据name 属性进行回显
D.只要将数据放置到对象栈root中,struts表单标签可以根据name属性进行回显
题目26
struts2在控制器类中一般需要添加相应属性的
A.setter方法
B. as方法
C.getter方法
D.is方法
题目27
当类型转换失败时,Struts会自动跳转到()结果单选
A.error
B.success
C.login
D.input
题目28
下列哪个常量用来配置Action的扩展名()单选
A.struts.i18n.encoding
B.struts.action.extension
C.struts.serve.static.browserCache
D.struts.devMode
题目29
请看代码
form.jsp
<s:form action=”myAction” namespace=”/” theme=”simple”>
用户名:<s:textfield name=”username” /><br/>
密码:<s:password name=”password” /><br/>
<s:submit value=”提交”/>
</s:form>
struts.xml
<package name=”xxx” namespace=”/” extends=”struts-default”> <action name=”myAction” class=”cn.itcast.web.action.MyAction”/>
</package>
User.java
public class User {
private String username;
private String password;
public void setUsername(String username) {
this. username = username;
}
public void setPassword(String password) {
this. password = password;
}
}
MyAction.java
package cn.itcast.web.action;
public class MyAction extends ActionSupport implements
ModelDriven<User>{
private User user = new User();
private String username;
private String password;
public void setUsername(String username) {
this. username = username;
}
public void setPassword(String password) {
this. password = password;
}
public User getModel() {
return er;
}
public String execute() {
System.out.println(username + “, “ + password);
return null;
}
}
当在form.jsp表单中,向用户名中输入zhangSan,向密码中输入123后提交,控制台会有什么样的输出结果()单选
A.null, null
B.zhangSan, 123
C.没有输出
D.抛出异常
题目30
下列对stringlength校验器描述正确的是()
A.可以配置minLength和maxLength参数
B.可以配置min和max参数
C.没有参数
D.可以配置minLength和maxLength,以及min和max参数
题目31
下列有关值栈描述错误的是?
A.valueStack是单例的,用于存放struts需要存放的数据
B.值栈被保存在HttpServletRequest作用域中
C.可以通过ActionContext.getValueStack()获得值栈
D.可以通过ActionContext.getContext().getValueStack()获得值栈
题目32
下列对局部xml配置校验说法正确的是()多选
A.配置文件必须放到当前Action同包下
B.配置文件名称必须是“当前Action类名-当前<action>的name名称-valid ation.xml”
C.在Action类中无需编写任何与参数校验相关的代码
D.可以使用@InputConfig注解来自定义校验失败后跳转的结果
题目33
以下有关struts.xml文件描述正确的是?
A.struts.xml文件必须放置在src下面
B.struts.xml文件中只能配置一个package
C.struts.xml文件可以放置在WEB-INF目录下
D.struts.xml文件名称可以自定义,只要以struts开头就可以
题目34
以下结果类型描述正确的是?
A. redirect,将请求重定向到另一个资源,一般重定向到jsp页面。
B. redirectAction,将请求重定向到另一个action
C. dispatcher,struts框架默认结果类型,将请求转发到另一个资源
D.stream确定result将从action获得流并发送到浏览器。
题目35(了解)
下列对全局类型转换器配置描述正确的是()多选
A.配置文件名称必须为xwork-conversion.properties
B.配置文件必须放到/WEB-INF/classes目录下
C.配置信息中属性名为目标类型名称
D.配置信息中属性值为目标类型的类型转换器类名
题目36(了解)
下列有关自定义类型转换器说法正确的是?
A.编写自定义转换器实现类,需要实现TypeConverter接口或继承默认实现类DefaultTypeConverter
B.转换器的转换方法,将有可能执行两次。
一次是表单提交数据字符串数组,
转换成指定对象;一次是标签回显指定对象,转换成字符串。
C.自定义转换可以被配置成全局转换,使用的固定的名称:
xwork-conversion.properties,此转换器将覆盖struts默认实现的转换(如果有)
D.自定义转换可以被配置成局部转换器,此类转换器只对当前action有效。
进行注册时,需要使用一定格式的文件名称:action类名
-conversion.properties
题目37
OGNL表达式中符合的使用,下面说话错误的是?
A.”#key”表示可以获得值栈 context中的指定key的数据
B.”${ognl}”表示在配置文件中执行ognl表达式
C.” %{‘#ername’}”,输出的内容是从request域中读取
username的值
D. ” %{‘#ername’}”,输出的内容是”#ername”
这个字符串
题目38
下面有关modelDriven机制,分析正确的是?
A.必须实现接口ModelDriven,通过在实现接口时,提供javabean类型作为
泛型参数。
B.需要实现接口的方法getModel()
C.编写一个成员变量,可以不实例化
D.在struts的默认拦截器栈中,已经使用了modelDriven拦截器,此拦截器
将当前action提供的javabean对象压入到栈顶,在通过其他拦截器从而完成整个数据的封装。
题目39
下面代码执行结果?
在action中进行如下操作:
ActionContext().getContext().put(“itcast”,”传智播客”);
重定向到jsp页面后,在jsp页面使用标签
<s:property value=”#itcast”>#
<s:property value=”itcast”>#
<s:property value=”#request.itcast”>#
A.传智播客###
B.传智播客#传智播客##
C.传智播客#传智播客#传智播客#
D.###
题目40
.下列有关struts2说法正确的是?
A.struts2 依赖于Servlet api,所有我们必须使用ServletActionContext 工具类提供的方法操作servlet的作用域
B.struts2的action是多实例的
C.在struts2中的action是需要依赖servlet容器的
D.在struts2中可以利用ognl表达式展现数据
struts token令牌机制
利用Struts同步令牌(Token)机制来解决Web应用中的重复提交问题。
该方法的基本原理是:服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session 中的令牌值进行比较,看是否匹配。
在处理完该request后,且在response发送给客户端之前,将会产生一个新的 Token,该Token除传给客户端以外,也会将用户session中保存的旧的T oken进行替换。
这样,如果用户会退到刚才的提交页面并再次提交的话,客户端传过来的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");//返回新增页面
}
通过调用saveToken(request),产生一个token值。
(注:每次调用saveToken方法产生的tok en值都不同)然后在记录新增页面中的<html:form>内部增加一个隐含表单字段,形式如下:
<div>
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
value="8b2d950f23b02c527988a14171254025">
</div>
然后再把token值"8b2d950f23b02c527988a14171254025"保存到当前会话中,也就是 sessi on.setAttribute( "org.apache.struts.action.TOKEN","8b2d950f23b02c527988a1417125 4025");
第二步:假如我们提交这个页面数据由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.actio n.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></html:form>这种形式,如果写成<form></form>这种形式的话,尽管调用saveToken(request)方法也不会在当前的<form></form>里面生成隐含表单,最终的结果都是"重复提交".
动态方法调用
在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action 对应多个请求的处理,以免Action太多
第一种方式:指定method属性
这种方式我们前面已经用到过,类似下面的配置就可以实现
<action name="chainAction" class="chapter2.action.Chapter2Action" method="chainAction">
<result name="chainAction" type="chain">redirect</result>
</action>
<action name="plainText" class="chapter2.action.Chapter2Action" method="plainText">
<result name="plainText"
type="plainText">/WEB-INF/JspPage/chapter2/plaintext.jsp</result>
</action>
第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用.
用这种方式需要先开启一个开关
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 将此常量设置为true,这种方式才能使用,使用见示例
Action
package chapter3.action;
public class Chapter3Action {
public String result1(){
return "result1";
}
public String result2(){
return "result2";
}
}
Jsp中访问方式
<body>
<a
href="basePath/chapter3/chapter3Action!result1">result1</a><br>
<ahref="
{basePath}/chapter3/chapter3Action!result2">result2</a><br>
</body>
如果配置了后缀,必须这样写:
/chapter4/chapter4Action!create.action
XML中配置方式
<package name="chapter3" namespace="/chapter3"
extends="struts-default">
<action name="chapter3Action"
class="chapter3.action.Chapter3Action">
<result
name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result> <result
name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result> <result
name="chapter3">/WEB-INF/JspPage/chapter3/chapter3.jsp</result> </action>
</package>
第三种方式:通配符方式(官网推荐使用)
首先得关闭开关
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
这一种方式是由第一种转变过来的,我们可以看到,第一种方式有很多重复的代码,那么我们可以进行变形,看下面的代码
<action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}">
<result name="test">/…/test.jsp</result>
</action>
chapter3_*这里的*就是你呆会要匹配的字符串,即你在后面的请求中得这样写 chapter3_create 或 chapter3_update
注意,这时你action中必须有create和update方法与之匹配,甚至还可以这样匹配
<action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}">
<result name="test">/…/{1}.jsp</result>
</action>
但是这时一定要有对应的JSP页面存在,并且相应的路径不能错,这就对我们的命名进行了强制性的规定,一定要规范.
课堂示例:
Action
public class Chapter4Action extends ActionSupport {
public String list(){
return "list";
}
public String create(){
return "create";
}
public String index(){
return "index";
}
}
XML:
<action name="chapter4_*" class="chapter4.action.Chapter4Action" method="{1}">
<result
name="{1}">/WEB-INF/JspPage/chapter4/chapter4_{1}.jsp</result>
</action>
访问Servlet API
有时我们需要用到Request, Response, S。