★struts2框架中,从用户发出请求到获得响应整个过程的流转图。要求写出”类名”。p11的图。
流程:
-->FiterDispatcher -->ActionProxy -->ActionInvocation -->Interceptor(入) -->Action -->Result -->Interceptor(出) -->jsp/html -->响应
!!! struts2和servlet的区别:
servlet:控制器非单例(对于每次请求,都会创建1个action对象。防止多线程同步造成的低效)
struts2:又是pojo(原生java类)(容易从web中剥离,用junit作测试)。
★struts2 和 struts1的区别:
struts2:又是 pojo(原生java类)(容易从web中剥离,用junit作测试)。
struts1:struts1的控制器从ActionServlet派生,还有formdata对象来向页面传递数据。
★什么叫做pojo(plain original java object):原生java类,没有实现任何接口,没有派生任何的父类。
优点:容易测试。
class student {}
★junit 4:作用可以替代main函数对java 对象的方法进行测试。
class BookTest extends TestCase { public testXXXX1() { ... } }
★struts.xml文件:支持分成几个子文件。
<struts> <constant name="struts.i18n.encoding" value="gbk"/> 常量定义,处理 post参数 <package name="xxx" extends="struts-default" namespace="/"> <interceptors> --拦截器定义 ... </interceptors> <action name="xxx" class="全路径" method="xxx"> <result >/ok.jsp</result><!--没有name,默认是"success"。没有类型,默认是dispatcher(请求转发). type:dispatcher(请求转发,保留action数据) redirect(重定向 ) redirectAction(重定向到下一个action) chain(action链,链中的下一个action,采用请求转发.前一个action的数据还在) stream(采用字节流方式传递数据) . </action> </package> </struts>
★action对象的生命周期与request对象相同
★action对象的属性自动保存在 request作用域!
★拦截器的作用是:抽取中多个action中的公有功能模块。
★拦截器栈的作用是:把几个拦截器串起来。
★拦截器和过滤器的区别:
a:拦截器是struts2的一部分。而过滤器是java web程序的通用组件。
b:拦截器只能拦截发向action的请求。 过滤器可以拦截任何请求,包括img,html,jsp等。
c:struts2过滤器先执行,再执行拦截器。
★拦截器分两种:
1、action拦截器–> extends AbstractInterceptor
重写 intercept方法。
String result = invocation.invoke();–分界线。执行拦截器后面的action方法,获得返回值。
2、方法拦截器–>可以仅拦截action中的指定方法。
extends MethodFilterInterceptor。
★自定义校验器需要让action从ActionSupport派生。
★在action中重写validate()方法和validateXXX()方法的区别:
validate():执行所有的action业务方法前都校验.
validateXXX():仅执行actionXXX方法前校验。
只要在validate()或validateXXX()方法中用“addFieldError语句”抛出异常,action的业务方法进不执行,自动返回name=input的结果。
★执行顺序validateXXX()–>validate()–>XXX方法。
“如果validateXXX方法抛出异常,validate()方法仍然执行,但XXX方法不执行。”
★转换器的作用是:将表单参数转成自定义类型。
extends StrutsTypeConverter { public Object coverFromString(String para[],...) { ... } //将请求参数数组转成1个自定义类型的对象! }
★转换器的文件名 :xwork_conversion.properties
★无需转换器,实现快速转换的方法:
class BookAction { private Book book;get/set }
表单:<input name="book.bname"/> <input name="book.bnum"/>
★action中,如何获取request和 session对象?
a:action implements ServletRequestAware b:action代码中. ServeltContext.getContext().getRequest(); Context.getContext().getSession();
★action的结果类型默认是:dipatcher。
★dipatcher和redirect和redirectAction和chain的区别:
dipatcher和chain:能保留action的数据
redirect和redirectAction:无法保留action的数据。
★action如何向下一个action中传递数据:
a:放action的属性
b:放session中
★值栈是:request作用域的一种数据,按先进后出,后进先出的顺序被读取。
★如何通过struts2标签从值栈读取数据?
a:<s:property>标签 <s:property value="action的属性名"/> 等价于 <s:property value="#requestScope.action的属性名"/> 等价于 <s:property value="#attr.action的属性名"/> b:<s:iterator>标签 <s:iterator value="list" var="s"> .. </s:iterator> c:</s:iterator> <c:forEach items="${list}" var="s"> </c:forEach> <s:debug> //在页面中加入超链接,点击后显示所有作用域的数据。
★struts2实现国际化需要哪些配置文件?
struts.xml文件中指定文件名前缀。
还需在src根目录下加:
前缀_zh_CN.properties
前缀_en_US.properties。
如果要对某个action生效,Acton名_前缀_zh_CN.properties,放于action文件夹下。
★需要在页面中使用什么标签读取:
可以用<s:fieldText> <s:propery>读取
<s:text>不行。