Struts2注意点

来源:互联网 发布:sql语句查询多张表 编辑:程序博客网 时间:2024/05/17 18:19

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>

 

 

原创粉丝点击