【java-web框架】struts2复习

来源:互联网 发布:借身份证给别人开淘宝 编辑:程序博客网 时间:2024/06/05 11:12

1.struts2工作流程

1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器

web.xml配置

  <filter>        <filter-name>struts2</filter-name>        <filter-class>             org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter        </filter-class></filter> <filter-mapping>        <filter-name>struts2</filter-name>        <url-pattern>/*</url-pattern></filter-mapping>

struts.xml配置

<struts> <package name="default" namespace="/" extends="struts-default">        <action name="hello">            <result>                /Hello.jsp            </result>        </action>    </package></struts>

2.struts2工作原理

在Struts2框架中的处理大概分为以下几个步骤
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper


3.Struts2是怎样进行值封装的?

struts2的值封装实际上是采用了ognl表达式.
struts2的拦截器经过模型驱动时会先判断action是否实现了ModelDriven,如果是则拿到模型的实例放在了栈的顶部,
到属性驱动的时候会从栈里面把栈顶的实例给取出来,从页面传进来的值放在一个map集合当中,
通过map集合进行迭代会通过ognl技术把值封装到实例中。


4.校验

1 继承ActionSupport,重写validate方法(针对所有方法)(服务器端编程,不推荐)。
2 validateXxx方法(Xxx代表的是方法名,针对某个方法进行效验)。在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式
3 如果有错误就把错误信息放在FieldError中,并且跳转到指定的错误业务类,没有就会进行action方法的调用。
4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验)

5.Struts2 的国际化

在struts2中是使用了拦截器来实现国际化。

struts2的国际化分为三部分:
1.Action范围,这种范围是用Action的实现类的类名来作为前缀_语言名称国家地区名(大写).properties.
2.包范围,包范围是用package作为前缀_语言名称国家地区名(大写).properties。
3.全局范围,全局范围的前缀默认的是application,可以通过xml配置文件配置常量(使用constant标签注册i18l拦截器)来指定前缀,前缀_语言名称国家地区名(大写).properties。

国际化实现的原理:
通过i18n拦截器获得请求参数request——locale的值(zh或者是en)并把当前的值转化为locale对象,把locale对象存在ww_trans_i18n_locale的session作用域中,根据struts2的请求处理流程,拦截器只会在进入action的时候才会调用,所有我们一般把对jsp的访问转化为对action的访问。

6.OGNL

OGNL是:对象图形导航语言。
原ognl是单个对象的,在struts2的应用是多个对象的,struts2的类型转换也是通过ognl来实现的。
Struts2中默认的表达式语言就是ognl,struts2的取值设值都是通过ognl来实现的,struts2要依靠它的标签才可以使用ognl。

相对于jstl或者其他表达式语言,它有如下优势:
1 能够调用对象实例的方法
2 能够调用类的静态方法
3 操作集合对象
4 访问Ognl上下文

取值时ognl有三个参数:
1 表达式,2 ognl的上下文(map),3 对象实例(值栈)。

如果表达式带#号是从上下文中(map)拿值,否则是从值栈中拿值。
设值时有四个参数:
1 表达式,2 ognl的上下文(map),3 对象实例,4 设入的值
如果表达式带#号是把值设入上下文中(map),否则是把值设入值栈中。
在struts2中 ognl的实现关系:ActionConetxt。
ognl 3个常用的符号

  $  1 在校验框架中取资源文件中的值。2 可以在配置文件中传递参数。  % 使用百分号可以进行转义。  #  1 构造map,list集合。如#{'foo1':'bar1', 'foo2':'bar2'}。 2 取ognl上下文的值。parameters  包含当前HTTP请求参数的Map    #parameters.id[0]作用相当于request.getParameter("id")request     包含当前HttpServletRequest的属性(attribute)的Map    #request.userName相当于request.getAttribute("userName")session     包含当前HttpSession的属性(attribute)的Map   #session.userName相当于session.getAttribute("userName")application     包含当前应用的ServletContext的属性(attribute)的Map     #application.userName相当于application.getAttribute("userName")attr    用于按request > session > application顺序访问其属性(attribute)    #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止3 用来过滤集合。如books.{?#this.price<100};

7. Strust2如何访问Servlet API

1:通过ActionContext可以获得request,application,session三个作用域(struts2实际上是通过适配器来把servlet的api转换为一个map,
并把这些map放在ActionContext里面)。
2:通过ActionContext的子类ServletActionContext去获取原滋原味的API。
3:可以通过实现ServletRequestAware接口,重写里面的setServletRequest方法可以获得request,实际上是通过set的依赖注入。

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象,比如:在使用WebWork时,我们的上下文放有请求的参数(Parameter)、会话(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。
在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。
我们可以通过ActionContext的静态方法:ActionContext.getContext()来取得当前的ActionContext对象,我们看看这段代码:

public static ActionContext getContext() {ActionContext context = (ActionContext) actionContext.get();if (context == null) {OgnlValueStack vs = new OgnlValueStack();context = new ActionContext(vs.getContext());setContext(context);}return context;}
原创粉丝点击