Struts2
将所有的请求都先经过一个前端控制器,在前端控制器中实现框架的部分功能,即通过过滤器来实现对所有请求的拦截。
配置文件加载顺序(我们可以更改的配置文件,且后加载的文件的值可覆盖前面的)
1. struts.xml
2. struts.properties
3. web.xml
在struts.xml文件中进行常量的配置
<struts>
<!--i18n:国际化. 解决post提交乱码 -->
<constantname="struts.i18n.encoding"value="UTF-8"></constant>
<!--指定反问action时的后缀名
http://localhost:8080/struts2_day01/hello/HelloAction.do
-->
<constantname="struts.action.extension"value="action"></constant>
<!--指定struts2是否以开发模式运行
1.热加载主配置.(不需要重启即可生效)
2.提供更多错误信息输出,方便开发时的调试
-->
<constantname="struts.devMode" value="true"></constant>
</struts>
分模块开发的配置
<struts>
<!-- 引入其他struts配置文件 -->
<includefile="cn/itheima/b_dynamic/struts.xml"></include>
<!—不指定路径默认在src下是的方式 -->
<include file=" c_default-struts.xml"></include>
</struts>
关于Action
推荐Action类继承ActionSupport类。
通过<action>标签中的method属性来配置具体执行Action中的哪个方法。
其通配符配置为:<action name="类名_*" class="完全限定类名" method="{1}"/>
Struts2相关的API:
ActionContext用来传送值到不同域的对象。
ActionContext context =ActionContext.getContext();
context.put(“name”,”yrf”);
context.getApplication().put(“name”,”yrf”);
context.getSession().put(“name”,”yrf”);
Struts2对数据的封装:
属性驱动,模型驱动(推荐)
模型驱动中Action类必须实现ModelDriven接口,并且要重写getModel()方法。使用这种方式,在JSP页面中可直接使用对象属性。需要注意的是在Action类中,手动构建对象时首先要创建对象。
转发过程
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
重定向过程
客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。
OGNL表达式与EL表达式类似,都是视图导航语言,但是比EL表达式更为强大。
EL表达式是从11个内置对象中取值:requestScope,sessionScope,applicationScope,pageScope,
pageContext,params,paramValues,header,headerValues,cookie,initParams
OGNL表达式是从OGNLContext对象中取值。
OGNLContext(OGNL上下文对象)包含两个部分,如下
例如:
OgnlContext oc = new OgnlContext();
Ognl.getValue(“属性名”, oc, oc.getRoot());
从Context中取值时只需要改变getValue方法的参数。
例如:
Ognl.getValue(“#对象.属性名”, oc, oc.getRoot());
给ROOT赋值,例如:Ognl.getValue(“属性名=’要赋的值’”, oc, oc.getRoot());
给Context赋值,例如:Ognl.getValue(“#对象.属性名=’要赋的值’”, oc, oc.getRoot());
且getValue方法为可变参数,可以给多个赋值参数,但是只能有一个取值参数,因为只返回最后一个参数的取值内容。例如:Ognl.getValue(“#对象.属性名=’要赋的值’”, “属性名”, oc, oc.getRoot());
Struts2与OGNL表达式的结合
在Struts2当中,OGNLContext就是ValueStack(值栈)。
拦截器
创建拦截器有三种方法:实现Inerceptor类,继承AbstractInterceptor类,继承MethodFilterInterceptor类(推荐)
继承MethodFilterInterceptor类后会重写doIntercept方法
Protected String doIntercept(ActionInvocation invocation) throw Exception{ //前处理 System.out.println(“MyInterceptor的前处理”); //放行 invocation.invoke(); //后处理 System.out.println(“MyInterceptor的后处理”);
//不放行就返回一个字符串,即不执行后续的拦截器以及Action,直接交给result跳转页面 return “success”; } |
自定义拦截器
<interceptors> 1. 注册拦截器 < interceptor name=”myInter” class=”完全限定名”></ interceptor> 2. 注册拦截器栈 <interceptor-stack name=”myStack”> <!--自定义拦截器引入--> <interceptor-ref name=” myInter”> <!—指定哪些方法不拦截--> <param name=”excludeMethods”>方法名,方法名,。。。</param> <!—指定哪些方法不拦截,与上面不拦截方法不能同时指定--> <param name=”includeMethods”>方法名,方法名,。。。</param> </ interceptor-ref > <!--默认的拦截器栈(20个)--> <interceptor-ref name=”defaultStack”></ interceptor-ref > </interceptor-stack> 3. 指定默认拦截器栈 <default-interceptor-ref name=” myStack”></default-interceptor-ref> </interceptors> |