JavaWeb框架SSH_Struts2_(二)
1. Struts2的核心配置(详解)
本章内容目录:
- 配置struts.xml文件
- struts.xml文件
- 常量配置
- 包配置
- 包含配置
- Action配置
- 实现Action控制类
- 配置Action
- 使用通配符
- Action访问Servlet API
- 通过ActionContext类访问
- 通过特定接口访问、
- 通过ServletActionContext访问
- Result结果类型
- 配置Result
- 预定义的结果类型
- dispatcher结果类型
- redirect结果类型
2. 具体内容
2.1 配置Struts.xml文件
2.1.1 Struts.xml文件
Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和请求的对应关系。Struts.xml文件可以被Struts2框架自动加载。
搭建好了的Struts2项目(可参考上一讲如何搭建Struts2项目),其配置文件Struts.xml如下所示:
待配置的分块如下(注意注释部分):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--constant元素用于常量的配置--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <constant name="struts.devMode" value="ture"/> <!--package元素用于包配置--> <package name="default"namespace="/"extends="struts-default"> <!--配置Action--> <action name="index"> <!--配置Result--> <result type="dispatcher"> <param name="location">/index.jsp</param> </result> </action> </package>
<!--include元素用于包含配置--> <include file="example.xml"/> </struts>
简单的包含关系:
2.1.2 常量配置
Struts2中常量配置共有3种方式:
- 在struts.xml文件中通过<constant>元素配置常量;
- 在struts.properties文件中配置常量;
- 在web.xml文件中通过<init-param>元素配置常量;
(1) 在Struts.xml文件中通过<constant>元素配置常量
在Struts.xml文件中通过<constant…/>来配置常量时,需要两个必填的属性name和value。
- name:该属性指定了常量的常量名;
- value:该属性指定了常量的常量值;
在Struts.xml文件中配置的示例代码如下:
<struts> <!--设置默认编码集为UTF-8--> <constant name="struts.enable.SlashesInActionNames" value="UTF-8"/> <!--设置使用开发模式--> <constant name="struts.devMode" value="ture"/> </struts>
要注意的是,在struts.properties文件能配置的常量都可以在struts.xml文件中用<constant…>元素来配置。
(2)在struts.properties文件是一个标准的properties文件,其格式为Key-Value对,即每个key对应一个value,key表示的是Struts2框架中的常量,而value表示的是常量值,具体配置如下:
###设置默认编码集为UTF-8 struts.il8n.encoding=UTF-8 ###设置action请求的扩展名为action或者没有扩展名 struts.action.extension=action, ###设置不使用开发模式 struts.devMode=false ###设置不开启动态方法调用 struts.enable.DynamicMethodInvocation=false
上述代码段中,=号的左边的是key,右边是key对应的value,另外,代码片段中的###表示的是properties文件中的解释信息(注释),用于解释说明。
(3)在web.xml文件中通过初始化参数配置常量
在web.xml文件中配置核心过滤器StrutsPrepareAndExecuteFilter时,通过初始化参数来配置常量。通过<filter>元素的<init-param>子元素指定,每个<init-param>元素配置了一个struts常量。在web.xml文件中通过初始化参数配置常量方式,如下列代码段所示:
<filter> <!--指定struts2的核心过滤器--> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <!--通过init-param元素配置struts2常量,配置默认编码集为UTF-8--> <init-param> <param-name>struts.il8n.encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
需要注意的是, <init-param>标签要放到<filter>之中。
此外,Struts2框架的加载常量有一定的顺序,通常搜索顺序如下:
- default.properties:该文件在struts2-core-2.3.24.jar文件中的org.apache.struts2包里面;
- struts-default.xml:该文件保存在struts2-core-2.3.24.jar文件中;
- struts-plugin.xml:该文件保存在struts-Xxx-2.3.24.jar等Struts2插件JAR包中;
- struts.xml:该文件是Web应用自己的Struts配置文件Struts2配置文件;
- struts.properties:该文件是Web应用默认的Struts配置文件;
- web.xml:该文件是Web应用的配置文件;
2.1.3 包配置
Struts2框架的核心组件是Action和拦截器,它使用包来管理Action和拦截器。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。在Struts.xml文件中,package元素定义了一个包配置,每个package元素定义了一个包配置。package常用属性如下表所示:
属性 | 说明 |
name | 必填属性,指定包的名字,此名字是该包被其他包引用的key |
namespace | 可选属性,该属性定义该包的命名空间 |
extends |
可选属性,指定该包继承自其他包,可以继承其他包的Action定义、 拦截器定义等。属性直常设为“strruts-default” |
abstract |
可选属性,他指定该包是否是一个抽象包,抽象包不能包含Action 定义。(例如:abstract=“true”—->抽象包) |
2.1.3 包含配置
Struts2默认只加载struts.xml文件,但一旦通过多个XML文件来配置Action,就必须通过struts.xml文件来包含其他配置文件。结下来示例一段代码来说明;
<struts> <!--包含4个配置文件--> <!-- 不指定路径,默认在src下时的方式 --> <include file="struts-shop.xml"/> <include file="struts-user.xml"/> <include file="struts-shoppingcart.xml"/> <!-- 配置文件在具体包中的方式 --> <include file="cn/intcast/action/struts-product.xml"/> </struts>
2.2 Action的配置
2.2.1 实现Action控制类
Action作为Struts框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是说,用户的每次请求动作都对应于一个相应的Action类里面,由这个Action类来进行处理。简而言之,Action就是用来处理一次用户请求的对象。
实现Action控制有3中方式:
(1) POJO的实现
Action可以不继承特殊的类或不实现任何特殊接口,仅仅是一个POJO。POJO全称是Plain Ordinary Java Object(简单的Java对象),只要具有一部分getter/setter方法的类就可以称作为POJO。一般这个POJO类中,要有一个公共的无参构造方法和一个execute()方法。execute方法是Action类的默认请求处理方法,其方法格式如下:
public String execute() throws Exeception { return "success"; }
execute()方法要求如下:
- 方法的权限修饰符为public
- 返回一个字符串,就是指示的下一个页面的Result
- 方法没有参数
也就是说满足上述要求的POJO都可以算作是Struts的Action实现,但在实际的开发中,通常会让开发者自己编写Action类实现Action接口或者继承ActionSupport类。
(2)实现Action接口
(3)继承ActionSupport类
(上述两个小部分都是java的简单实现,这篇文章不再赘述)
2.2.2 配置Action
Action映射是框架中的基本“工作单元”。Action映射就是将一个请求的URL映射到一个Action类,当一个Actio请求匹配某个Action名称时,框架就使用这个映射来确定如何处理请求。在Struts.xml文件中,通过<action>元素对请求的Action和Action类进行配置。
<action>元素中共有4个属性,具体说明如下:
属性 | 说明 |
name | 必填属性,标识Action,指定了Action所处理的请求的URL |
class | 可选属性,指定Action对应的实现类 |
method | 可选属性,指定请求Action时调用的方法 |
converter | 可选属性,指定类型转换器的类 |
需要注意的是,在配置action元素时,如果没有指定class属性直,则其默认直为com.opensymphony.work2.ActionSupport类,该默认类会使用默认的处理方法execute()方法来处理请求,实际上,ActionSupport类中的execute()不会做任何处理,而是直接返回success直。在配置<action>元素时,如果指定了method属性,则该Action可以调用method属性中指定的方法,如果不指定method属性,则Action会调用execute()方法。
接下来看一个struts.xml文件中配置的action元素,代码片段如下所示:(注意:action的配置在struts.xml的package包平配置的内部)
<action name="userAction"class="cn.itcast.action.UserAction"> <result>/success.jsp</result> </action>
<action>类的属性直将在其他地方引用,例如.jsp页面form表单的action属性直;class属性指明了Action的实现类。
2.2.3 使用通配符
在使用method属性时,由于在Action类中有多个业务逻矩处理方法,在配置Action时,就需要使用多个action元素。在实现同样功能的情况下减轻struts.xml配置文件的负担,借助于通配符映射。
使用通配符配置时,<package>元素的内容如下所示;
<package name="User"namespace="/user"extends="struts-default"> <action name="User_Action_*" class="cn.itcast.action.UserAction" method="(1)"> <result>/index.jsp</result> </action> </package>
注意对于result也可以采用通配符。
2.3 Action访问Servlet API
在struts2中,Action并没有直接和Servlet API进行耦合,也就是说,在Struts2的Action中不能直接访问Servlet API。在实现业务逻辑时,经常要访问Servlet中的对象,如session、request和application等。在struts2中,访问Servlet API有三种方法。
2.3.1 通过ActionContest类访问
ActionContext类访问Servlet API的常用方法:
方法声明 | 功能描述 |
void put(String key,Object value) | 将key-value键值对放入ActionContext中,模拟Servlet API中的HttpServletHttpServletRequest的setAttribute()方法 |
Object get(String key) | 通过参数key来查找当前ActionContext中的直 |
Map<String,Object> getApplication() |
返回一个Aplication级的Map对象 |
static ActionContext getContext() |
获取当前线程的ActionContext对象 |
Map<String,Object> getParameters() | 返回一个包含所有HttpServletRequest参数信息的Map对象 |
Map<String,Object> getSession() | 返回一个Map类型的HttpSession |
void setApplication (Map<String,Object>application) | 设置Application上下文 |
void setSession (Map<String,Object>session) | 设置一个Map类型的Session |
2.3.2 通过特定接口访问
- ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例;
- RequestResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例;
- SessionAware:实现该接口的Action可以直接访问Web应用的ServletContext实例;
2.3.3 通过ServletActionContext访问
- static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象;
- static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象;
- static ServletContext getServletContext():获取Web应用中的ServletContext对象;
- static PageContext getPageContext():获取Web应用中的PageContext对象。
2.4 Result结果类型
2.4.1 配置Result
在struts.xml文件中进行Result的配置,使用<result>元素来配置Result逻辑视图与无力视图之间的映射,<result>元素可以有name和type属性,但这两种属性都不是必选的;
- name属性:指定逻辑视图的名称,默认值是success;
- type属性:指定返回的视图资源类型,不同的类型代表不同的结果输出,默认值是dispatcher。
在Struts,xml文件中的<result>元素配置代码如下:
<action name="logiAction"class="cn.itcast.action.loginAction"> <result name="success"type="dispatcher"> <param name="location">/success.jsp</param> </result> </action>
注意:<param>子元素的name属性有两个直,分别如下:
- location:指定该逻辑视图所对应的实际视图资源;
- parse:指定在逻辑视图资源名称中是否可以使用OGNL表达式。默认值为true,表示可以使用,如果设为false,则表示不支持。
上述配置可以简化为:
<action name="logiAction" class="cn.itcast.action.loginAction"> <result>/success.jsp</result> </action>
需要注意的是,在Result中,指定实际资源位置时,可以使用绝对路径,也可以使用相对路径。绝对路径以斜杠(/)开头,例如<result>/success.jsp<result>,相当于当前Web应用程序的上下文路径;相对路径不以斜杠开头,例如<result>success.jsp</result>,相当于当前执行的Action路径。
2.4.2 预定义的结果类型
在struts2中,当框架调用Action对请求进行处理后,就要向用户呈现一个结果视图。在struts2中,预定义了多种ResultType,其实就是定义了多种展示结果技术。
每个<result-type>元素都是一种视图技术或者跳转方式的封装,其中的name属性指出在<result>元素中如何引用这种视图技术或者跳转方式,对应着<result>元素的type属性。struts2中预定义的ResultTyoe如下所示;
属性 | 说明 |
chain | 用来处理Action链,被跳转的Action中仍能获取送上个页面的直、如request信息 |
dispatcher | 用来转向页面,通常处理JSP,默认的结果类型 |
freemarker | 用来整合FreeWorker模板结果类型 |
httpheader | 用来处理特殊的HTTP行为结果类型 |
redirect | 重定向到一个URL,被跳转的页面中丢失传递的信息 |
redirectAction | 重定向到一个Action,跳转的页面中丢失传递的信息 |
stream | 向浏览器发送InputStream对象,通常用来处理文件下载,还可用于Ajax数据 |
velocity | 用来整合Velocity木板结果类型 |
xslt | 用来整合XML/ XSLT结果类型 |
plainText | 显示原始文件内容,例如文件源代码 |
postback | 使得当前请求参数以表单形式提交 |
上表列举了Struts2中预定义的全部11种结果类型,其中dispatcher是默认的结果类型,主要用来与JSP整合。在这全部11中结果类型中,dispatcher和redirect是比较常用的结果集。
需要注意的是,dispatcher结果类型是将请求转发到JSP视图资源,而redirect类型是将请求重定向到JSP视图资源。他们之间最大的差别就是一个是请求转发、一个是请求重定向。如果重定向了请求,那么将丢失所有参数,其中包括Action的处理结果。
2.4.3 dispatcher结果类型
dispatcher结果类型用来表示“转发”到指定的结果资源,他是struts2的默认结果类型。dispatcher结果类型实现的是org.apache. struts2. dispatcher.ServletDispatcherResult,该类有location和parse两个属性,可以通过struts.xml配置文件中的result元素的param资源书来设置,代码如下:
<result name="success"type="dispatcher"> <param name="location">/success.jsp</param> <param name="parse">true</param> </result>
上述代码中,location参数用于指定Action执行完毕后要转向的目标;parse参数是一个布尔型的直,默认是true,表示解析location参数中的OGNL表达式子,如果是faulse,则不解析。
2.4.4 redirect结果类型
redirect结果类型用来重定向到指定的结果资源,该资源可以是JSP文件,也可以是Action类。使用redirect结果类型时,系统将调用HttpServletResponse的sendRedirect()方法将请求重定向到指定的URL。
redirect结果类型实现的类是org.apache.struts2.dispatcher.ServletRedirectResult。在使用redirect时,用户要完成一次和服务器之间的交互,浏览器需要发送两次请求,请求过程如下图所示:
使用redirect结果类型的工作过程如下:
- 浏览器发送一个请求,Struts框架调用对应的Action实例对请求进行处理;
- Action返回“success”结果字符串,Struts2框架根据这个结果选择对应的结果类型,这里使用的是redirect结果类型;
- ServletRedirectResult在内部使用HttpServletResponse的sendRedirect()方法将请求重新定向到目标资源;
- 浏览器重新发送一个针对目标资源的新请求;
- 目标资源作为响应呈现给用户。
代码:
<action name="logiAction" class="cn.itcast.action.loginAction"> <result name="success"type="redirect">/success.jsp</result> <result name="error"type="dispatcher">/error.jsp</result> </action>
上述配置中,<result>元素使用redirect类型,表示当Action处理请求后重新生成一个请求。
PS:什么是请求转发和请求重定向,具体区别是什么?(明天补上,同学越去喝酒了,哈哈哈哈哈)