2.  Struts2的核心配置

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-
struts.il8n.encoding=UTF- ###设置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.4  包含配置

  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结果类型的工作过程如下:

  1. 浏览器发送一个请求,Struts框架调用对应的Action实例对请求进行处理;
  2. Action返回“success”结果字符串,Struts2框架根据这个结果选择对应的结果类型,这里使用的是redirect结果类型;
  3. ServletRedirectResult在内部使用HttpServletResponse的sendRedirect()方法将请求重新定向到目标资源;
  4. 浏览器重新发送一个针对目标资源的新请求;
  5. 目标资源作为响应呈现给用户。

  代码:

    <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:什么是请求转发和请求重定向,具体区别是什么?(参考,http://blog.csdn.net/meiyalei/article/details/2129120)

解释一:

  一句话,转发是服务器行为,重定向是客户端行为。看两个动作的工作流程:

  转发过程:客户浏览器发送http请求----->web服务器接受此请求----->调用内部的一个方法在容器内部完成请求处理和转发动作----->将目标资源发送给客户。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

  重定向过程:客户浏览器发送http请求----->web服务器接受后发送302状态码响应及对应新的location给客户浏览器----->客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----->服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

解释二:

  请求重定向,其实是两次request, 第一次,客户端request,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候浏览器可以看到地址变了,而且浏览器的历史回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
  请求转发,是服务器内部把对一个request/response的处理权,移交给另外一个 对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。

解释三:

假设你去办理某个执照,

请求重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

请求转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

JavaWeb框架SSH_Struts2_(二)的更多相关文章

  1. JavaWeb框架_Struts2_(二)----->Struts2的核心配置

    2.  Struts2的核心配置 2.1  配置Struts.xml文件 2.1.1 Struts.xml文件 Struts2框架的核心配置文件是Struts.xml,该文件主要用来配置Action和 ...

  2. JavaWeb框架SSH_Struts2_(一)

    1. Struts2 框架入门及结合Intellj idea完成登陆demo测试   1.1  本章目录: 框架入门 Struts2简介 Struts2入门案例 Struts2执行流程分析 2. 具体 ...

  3. JavaWeb框架SSH_Struts2_(三)

    1. Struts2的拦截器(使用拦截器实现权限控制) 拦截器简介 拦截器概述 拦截器工作原理 拦截器的配置 Struts2的内建拦截器 内建拦截器的介绍 内建拦截器的配置 自定义拦截器 实现自定义拦 ...

  4. JavaWeb框架SSH_Struts2_(四)----->表达式语言OGNL

    1. 表达式语言OGNL OGNL简介 OGNL基本语法 常量 操作符 OGNL表达式 OGNL基础 OGNL上下文 OGNL值栈 OGNL的访问 2. 具体内容 2.1 OGNL简介 OGNL(Ob ...

  5. JavaWeb框架之Struts2 ---- 系列学习

    JavaWeb框架_Struts2_(七)----->文件的上传和下载 JavaWeb框架_Struts2_(六)----->Struts2的输入校验 JavaWeb框架_Struts2_ ...

  6. JavaWeb框架的基石

    JavaWeb框架的基石(一) 初学JavaWeb开发,请远离各种框架,从Servlet开始.         Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架 ...

  7. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  8. JavaScript 框架设计(二)

    JavaScript 高级框架设计 (二) 上一篇,JavaScript高级框架设计(一)我们 实现了对tag标签的选择 下来我们实现对id的选择,即id选择器. 我们将上一篇的get命名为getTa ...

  9. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

随机推荐

  1. 在不用Promise的情况下如何控制异步请求?

    如何更好的控制异步请求?相信大家一定首选Promise对象.确实,使用Promise控制异步请求确实非常方便,直接使用then()方法就可以实现当一个异步请求完成后再处理另一个请求或操作.同时,这样的 ...

  2. 如何开发webpack loader

    关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...

  3. UWP上可用的GB2312编码

    大概是在WP8的时候,网上有一个WP8可用的GB2312编码的解决方法,就是那个DBCSCodePage. 但是由于UAP开始,微软删掉了GetManifestResourceStream,所以这东西 ...

  4. linux下如何安装破解IntelliJ IDEA,及其基本使用教程;

    今天在linux下安装了IntelliJ idea,由于现在很多企业在linux平台下使用IntelliJ idea做java web的开发,所以对于IntelliJ idea的安装和学习是一件基本的 ...

  5. 如何设置App的启动图

    如何设置App的启动图,也就是Launch Image? Step1 1.点击Image.xcassets 进入图片管理,然后右击,弹出"New Launch Image" 2.如 ...

  6. JavaScript中的比较规则之“==”运算符

    "=="运算符(两个操作数的类型不相同时) 如果一个值是null,另一个值是undefined,则它们相等 如果一个值是数字,另一个值是字符串,先将字符串转换为数学,然后使用转换后 ...

  7. base64减少图片请求

    1. 使用base64减少 a)            2. 页面解析 CSS 生成的 CSSOM 时间增加 Base64 跟 CSS 混在一起,大大增加了浏览器需要解析CSS树的耗时.其实解析CSS ...

  8. Java正则表达式详解+练习

    一.导读 正则表达式,又称规则表达式.(英文名Regular Expression,所以代码中常以regex.regexp.RE表示).正则表达式简单说就是用于操作文本数据的规则表达式,在Java中我 ...

  9. CMake vs Make对比

    程序员现在已经使用了CMake和Make了很久.当您加入大公司或开始使用大型代码库开发项目时,您需要处理所有这些构建.你必须看到这些“CMakeLists.txt”文件浮动.你应该在终端上运行“cma ...

  10. aapt不是内部命令

    解决方法:在E:\sdk\build-tools\目录下的任意文件夹下查找aapt,复制到E:\sdk\platform-tools,具体盘符是情况而定,如果还不行,尝试配置环境变量!