Struts2(一)

来源:互联网 发布:中国象棋软件让子 编辑:程序博客网 时间:2024/06/05 21:03

搭建Struts2开发环境的步骤

  • 搭建Struts2环境时,我们一般需要做以下几个步骤的工作:
    1》创建javaweb工程
    2》找到开发Struts2应用需要使用到的jar文件.
    3》在web.xml中加入Struts2 MVC框架启动配置
    4》创建jsp文件.
    5》创建action文件
    6》编写Struts2的配置文件

开发Struts2需要的jar文件

到http://struts.apache.org/download.cgi#struts2014下载struts-2.x.x-all.zip,目前最新版为2.3.1。下载完后解压文件,开发struts2应用需要依赖的jar文件在解压目录的lib文件夹下。不同的应用需要的JAR包是不同的。下面给出了开发Struts 2程序最少需要的JAR。
struts2-core-2.1.8.1.jar :Struts 2框架的核心类库
xwork-core-2.1.6.jar :XWork类库,Struts 2在其上构建
ognl-2.7.3.jar :对象图导航语言(Object Graph Navigation Language),
struts2框架通过其读写对象的属性
freemarker-2.3.15.jar :Struts 2的UI标签的模板使用FreeMarker编写
commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志
包来支持Log4J和JDK 1.4+的日志记录。
commons-fileupload-1.2.1.jar 文件上传组件,2.1.6版本后需要加入此文件
commons-io-1.3.2.jar,上传文件依赖的jar包

Struts2的启动配置

在struts2中,struts框架是通过Filter启动的。在web.xml中的配置如下:

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

在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。

注意:struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件

编写Struts2的配置文件

Struts2默认的配置文件为struts.xml ,该文件需要存放在WEB-INF/classes下,也就是当前工程的src目录下。

在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用,注意:name名称是唯一 。包的namespace属性用于定义该包的命名空间。该属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“/”

通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。而Struts2很多核心的功能都是通过这些内置的拦截器实现。如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。

Struts2的工作流程

这里写图片描述

拦截器概述(struts-default.xml)

这里写图片描述


Struts2基本配置

访问HelloWorld应用的路径的设置

 在struts2中,访问struts2中action的URL路径由两部份组成: 包的命名空间+action的名称例如: 访问本例子HelloWorldAction的URL路径为: /zhaojun/helloWorldAction  (注意:完整路径为:http://localhost:端口/内容路径/zhaojun/helloWorldAction)。另外我们也可以加上.action后缀访问此Action。 <package name=“hello" namespace=/zhaojunextends="struts-default">      <action name="helloWorldAction" class="cn.itcast.action.HelloWorldAction">        <result name="success" type="dispatcher">/success.jsp</result>      </action> </package>

Action名称的搜索顺序

1.获得请求路径的URI,例如url是:
http://server/struts2/path1/path2/path3/test.action
2.首先寻找namespace为/path1/path2/path3的package,
如果存在这个package,则在这个package中寻找名字为test的action,
如果不存在这个package则转步骤3;
3.寻找namespace为/path1/path2的package,
如果存在这个package,则在这个package中寻找名字为test的action,
如果不存在这个package,则转步骤4;
4.寻找namespace为/path1的package,
如果存在这个package,则在这个package中寻找名字为test的action,
如果仍然不存在这个package,就去默认的namaspace的package下面去找名
字为test的action(默认的命名空间为空字符串“/” ),
如果还是找不到,页面提示找不到action。

ActionSupport

                                                          类是默认的 Action 类. 在编写 Action 类时, 通常会对这个类进行扩展

这里写图片描述

Struts2处理的请求后缀

StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts 2框架处理,否则Struts 2框架将略过该请求的处理。

根据配置文件:struts2-core-2.1.8.1.jar包下的 org.apache.struts2/default.properties文件定义的常量决定
struts.action.extension=action,,

默认处理的后缀是可以通过常量”struts.action.extension“进行修改的,如下面配置Struts 2只处理以.do为后缀的请求路径:

<struts>    <constant name="struts.action.extension" value="do"/></struts>

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:

 <constant name="struts.action.extension" value="do,go"/>

细说常量定义

常量可以在struts.xml或struts.properties中配置,两种配置方式如下:
在struts.xml文件中配置常量

<struts>    <constant name="struts.action.extension" value="do"/></struts>

在struts.properties中配置常量, (struts.properties文件放置在src下)
struts.action.extension=do
因为常量可以在多个配置文件中进行定义,所以我们需要了解下struts2加载常量的搜索顺序:
1. struts.xml
2. struts.properties
如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.

指定多个struts配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过元素指定多个配置文件:

<struts>    <include file="cn/itcast/web/struts2/config/default-struts.xml"/>    <include file="cn/itcast/web/struts2/config/register-struts.xml"/></struts>

通过这种方式,我们就可以将Struts 2的Action按模块添加在多个配置文件中。
注意:每个包名是唯一的


与Servlet API解耦

与Servlet API解耦的访问方式

为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext 对应的 Map 对象来保存和读取数据.

访问request/session/application对象

ActionContext/ServletActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括request, session, application 等.
获取 HttpSession 对应的 Map 对象:
public Map getSession()

访问request/session/application对象

方案一:public String test(){HttpServletRequest request=ServletActionContext.getRequest();HttpServletResponse response=ServletActionContext.getResponse();Map map = ActionContext.getContext().getSession();ServletContext servletContext=ServletActionContext.getServletContext();return "success"; }方案二:public class HelloWorldAction {    private String name;    public String getName() {        return name;    }       public void setName(String name) {//框架注入方法        this.name = name;    }}

Struts2验证

校验

struts2校验有两种实现方法:
1. 手工编写代码实现
2. 基于XML配置方式实现
### 基本验证(对action的所有方法进行校验)
Jsp页面:
* 用户名不能为null ,””
* 密码不能为null, “” 并且密码的长度6位数字
Action中
* 要继承ActionSupport
* 重写Validateable接口中的validate()方法 ,在该方法中完成验证
* 步骤如下:
* validate()方法在其他的业务方法之前执行
* 验证出错转向的页面
struts.xml配置/login.jsp
其中input转向是在action中已经定义好的.
public static final String INPUT = “input”;
* 什么时候表示验证出错(转向input所指向的页面)
* this.addFieldError(“sss”, “错误信息”);方法指向的是一个集合
* 当集合不为空时,转向错误页面.

输入校验的流程

  1. 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

  2. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,拦截器将异常信息封装到fieldErrors里,然后执行第5步。如果类型转换没有出现异常,则直接进入第3步。

  3. 系统通过反射技术调用action中的validateXxx()方法,xxx为方法名。

  4. 调用action中的validate()方法。

  5. 经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

基本验证(对action的所有方法进行校验)

显示错误Jsp页面:
使用显示错误消息

基本验证(对action的指定方法进行校验)

  • validate()方法会校验action中所有与execute方法签名相同的方法。
  • 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。
  • 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败
    信息(为了使用addFieldError()方法,action可以继承ActionSupport),如果系统
    的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。
  • 在input视图中可以通过显示失败信息。
    validateXxx()方法使用例子:
    public String add() throws Exception{//业务方法
    return “success”;
    }
    对应的验证方法
    public void validateAdd(){//无需再写validate()方法了
    //验证代码
    }

附录1:在struts配置文件中增加补全功能

这里写图片描述

附录2: 常用的常量介绍

指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法

该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开

当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开

开发模式下使用,这样可以打印出更详细的错误信息

默认的视图主题

与spring集成时,指定由spring负责action对象的创建

上传文件的大小限制

… …

1 0
原创粉丝点击