您的位置:首页 > 编程语言 > Java开发

【java-web框架】struts2复习

2017-05-25 16:29 429 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts java