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框架_Struts2_(二)----->Struts2的核心配置的更多相关文章

  1. JavaWeb框架_Struts2_(三)---->Struts2的拦截器

    2. Struts2的拦截器(使用拦截器实现权限控制) 2.1 拦截器的概述 拦截器是Struts2的核心组成部分,它可以动态的拦截Action调用的对象,类似与Servlet中的过滤器.Struts ...

  2. JavaWeb框架_Struts2_(六)----->Struts2的输入校验

    1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...

  3. JavaWeb框架_Struts2_(一)----->Struts2 框架入门

    1.  框架入门 2.1  Struts2简介 (1). Struts2是一种基于MVC模式的的轻量级Web开发框架. MVC模式:MVC全名是Model View Controller,是模型(mo ...

  4. JavaWeb框架_Struts2_(八)----->Struts2的国际化

    这一篇博文拖了蛮久了,现在先把它完成,结束struts2这个版块,当然这只是最基础的部分,做项目还需要更深的理解.下一个web后端的版块准备做Spring框架的学习-嗯,加油! 1. Struts2的 ...

  5. JavaWeb框架_Struts2_(五)----->Struts2的标签库

    1.  Struts2的标签库 1.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1 ...

  6. JavaWeb框架SSH_Struts2_(二)

    1.  Struts2的核心配置(详解) 本章内容目录: 配置struts.xml文件 struts.xml文件 常量配置 包配置 包含配置 Action配置 实现Action控制类 配置Action ...

  7. 图解Disruptor框架(二):核心概念

    图解Disruptor框架(二):核心概念 概述 上一个章节简单的介绍了了下Disruptor,这节就是要好好的理清楚Disruptor中的核心的概念.并且会给出个HelloWorld的小例子. 在正 ...

  8. JavaWeb框架_Struts2_(四)----->表达式语言OGNL

      2. 表达式语言OGNL 2.1 OGNL简介 OGNL(Object-Graph Navigation Language)对象图导航语言的缩写,OGNL是一种表达式语言(Expression L ...

  9. JavaWeb框架_Struts2_(七)----->文件的上传和下载

    这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量 ...

随机推荐

  1. Sourse Insight使用过程中的常使用功能简介

    1.查找定义: 在编辑区内,选中任意一个变量.函数.宏等,点击右键->Jump Definition,或者直接Ctrl+左击 2.编辑区切换

  2. Linux Shell基础 Shell的输入重定向和输出重定向

    概述 在 Linux 中输入设备指的是键盘,输出设备指的是显示器.在 Linux 中,所有的内容都是文件,计算机硬件也是文件,标准输入设备(键盘)和标准输出设备(显示器)也是文件.这些设备的设备文件名 ...

  3. poj 3617输出格式问题

    注意是说的80个字母一行....

  4. cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector

    各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...

  5. 安装使用snmp监控命令

    1.安装snmp windows下载安装https://sourceforge.net/projects/net-snmp/ centos yum install -y net-snmp net-sn ...

  6. C#反射第二天

    原文:http://blog.csdn.net/zhaoguiqun/article/details/5954720 1.什么是反射Reflection,中文翻译为 反射.     这是.Net中获取 ...

  7. Ubuntu下用crontab 部署定时任务

    用php做了一个网站,其中一个统计工能,需要每周定时用行.想看看有什么方法,之前看别人的东西,一般有2中方式,一个是php自带的定时任务,一个是用系统 带的,linux下的crontab和window ...

  8. SPOJ1825 FTOUR2 - Free tour II

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. pandas read_sql与read_sql_table、read_sql_query 的区别

    一:创建链接数据库引擎 from sqlalchemy import create_engine db_info = {'user':'user', 'password':'pwd', 'host': ...

  10. CentOS 6.6 中 mysql_5.6 主从数据库配置

    [mysql5.6 主从复制] 1.配置主从节点的服务配置文件 1.1.配置master节点 [mysqld] binlog-format=row log-bin=master-bin log-sla ...