首页 > 技术文章 > (2)struts2配置祥解

mao-19 2016-07-26 12:29 原文

struts工作流程

反射 :

 

 

1.构造对象使用构造器 

//类似为Servlet
public class AddAction {
    
    public AddAction(){
        System.out.println("框架反射创建AddAction实例");
    }

 2.web.xml

2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,

可以在一个<filter-mapping>元素中加入任意数目的<dispatcher>,使得filter将会作用于

直接从客户端过来的request,通过forward过来的request,通过include过来的request,通过<error-page>过来的request。

如果没有指定任何< dispatcher >元素,默认值是REQUEST。

<!-- Struts2核心过滤器,专用于过滤所有请求-->
  <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>
      <dispatcher>REQUEST</dispatcher>
  </filter-mapping>
</web-app>

由于AddAction中是转发所以不经过StrutsPrepareAndExecuteFilter。要使其经过改成dispatcher为FORWARD

*四)struts2其本配置详解(上)

(一)名称空间和访问Action路径规则

访问URL=名称空间 / <aciton标签的name属性值>

名称空间:页面名相同时,用namespace区分请求路径
(二)默认名称空间和测试Action的访问路径规则

默认命名空间是"/",可不写;
若名称空间是/,url=http:localhost:8080/day31/add

http://localhost:8080/day31/add?num1=100&num2=200

若名称空间是/xx,url=http://localhost:8080/day31/xx/add

 http://localhost:8080/day31/xx/add?num1=100&num2=200

 

为什么需要namespace?

如果名称空间是/,且<action>的name属性值为add
如果URL是:http://127.0.0.1:8080/day31/xx/yy/zz/add回车

http://127.0.0.1:8080/day31/xx/yy/zz/add(正确)
http://127.0.0.1:8080/day31/xx/yy/add(正确)
http://127.0.0.1:8080/day31/xx/add(正确)
http://127.0.0.1:8080/day31/add(正确)

如果名称空间是/xx,且<action>的name属性值为add
如果URL是:http://127.0.0.1:8080/day31/xx/yy/zz/add回车

http://127.0.0.1:8080/day31/xx/yy/zz/add(正确)
http://127.0.0.1:8080/day31/xx/yy/add(正确)
http://127.0.0.1:8080/day31/xx/add(正确)
http://127.0.0.1:8080/day31/add(出错)

结论:不管URL请求是什么,namespace的属性值,一定名称空间的底线,不能少于namespace的值,
但可以多于namespace的值。
路径中,大小写敏感

 

(3)如果没有指定<action>的method属性
默认执行Action中的execute()方法

(4)推荐,文件只存在加载和解析,没有编译,所以尽量在xml中配置

execute()方法使其return "success";

//转发到add.jsp中  由struts.xml中的result代替    
//request.getRequestDispatcher("/add.jsp").forward(request, response); return "success";

web.xml

<!-- struts2的核心配置文件,在应用部署时加载并解析 -->
<struts>
    <package name="base" extends="struts-default" namespace="/"><!-- struts2内部的一个核心包 -->
        <action name="add" class="cn.itcast.web.struts2.add.AddAction" >
            <result name="success" type="dispatcher">
                /add.jsp
            </result>
        </action>
    </package>
</struts>  

 

如果没有指定<result>的name属性
name默认为Action中execute()方法的返回值:小写字母"success"

(5)如果没有指定<result>的type属性
type默认为"dispatcher"
struts2专用转发

(6)设置访问Action的扩展名的二种设置方式【struts.properties和struts.xml】
struts.action.extension=action,,
struts2访问Action的扩展名默认为:无或者是.action(小写)
修改Actin访问的扩展名:
A)src/struts.xml文件配置扩展名(value中四种)

<!-- 修改action的扩展名方式1 -->
<constant name="struts.action.extension" value="xx,qq,aciton,,"></constant>

 

  http://localhost:8080/day31/add.qq?num1=100&num2=100

B)src/struts.properties文件配置扩展名

struts.action.extension=yy,do
struts.i18n.encoding=UTF-8


上述二种方式,最终都会替换框架默认的扩展名
加载的顺序是:先加载框架的,后加载程序员的
当properties和xml文件同时存在时,properties文件起决定作用。

*四)struts2其本配置详解(下)

(7)指定包含多个struts.xml配置文件的规则
src/struts.xml是总的配置文件,用总的配置文件能过<include>标签,去包含子的配置文件,
便用多个模块操作,一个模块使用一个xml文件。

 

get.jsp

<a href="/day31/get" style="text-decoration:none">
        这是GET请求    
</a>  

GetAction

package cn.itcast.web.struts2.add;

public class GetAction {
    public String execute(){
        return "success";
    }
}

WEB-INF下ok.jsp

<body>
    ok.jsp    
</body>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="get" extends="struts-default" namespace="/">
        <action 
            name="get" 
            class="cn.itcast.web.struts2.add.GetAction" 
            method="execute">
            <result name="success" type="dispatcher">
                /WEB-INF/ok.jsp
            </result>        
        </action>        
    </package>    
</struts>   

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="add" extends="struts-default" namespace="/">
        <action name="add" class="cn.itcast.web.struts2.add.AddAction">
            <result name="success" type="redirect">
                /add.jsp
            </result>
        </action>
    </package>    
</struts>  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<!-- struts2的核心配置文件,在应用部署时加载并解析 -->
<struts>
    <!-- 包含子的xml文件 -->
    <include file="cn/itcast/web/struts2/add/struts_add.xml"/>
    <include file="cn/itcast/web/struts2/get/struts_get.xml"/>
</struts>  

(8)Action采用单例还是非单例模式,需要解决线程安全问题吗?
一次请求创建一个Action实例,每次都不同。无线程安全问题

在AddAction中private Integer age;在execute中age++;不会有线程安全问题、

推荐阅读