struts2的配置

来源:互联网 发布:软件测试作业 编辑:程序博客网 时间:2024/05/22 13:47

一、导入所需的jar包,如

图

二、修改web.xml文件,添加如下配置

 <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>    </filter-mapping>


三、在src目录下,添加struts.xml文件,内容如下

<?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>    <constant name="struts.i18n.encoding" value="UTF-8"/>      <constant name="struts.devMode" value="false"/>          <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>    <package name="methods" namespace="/say" extends="struts-default">        <default-action-ref name="index" />        <global-results>            <result name="error">/error.jsp</result>        </global-results>        <global-exception-mappings>            <exception-mapping exception="java.lang.Exception" result="error"/>        </global-exception-mappings>        <action name="add" class="com.test.action.SayHelloAction" method="add">            <result name="success"> /add.jsp </result>        </action>                <action name="save" class="com.test.action.SayHelloAction" method="save">            <result name="success"> /save.jsp </result>        </action>                <action name="delete" class="com.test.action.SayHelloAction" method="delete">            <result name="success">/delete.jsp</result>        </action>            </package>    <!-- Add packages here --></struts>

四、编写Action类。类要继承extends ActionSupport。

五、在struts.xml文件下,配置Action

1.    Action映射:
  action
映射是Struts2框架中的基本 工作单元action映射就是将一个请求URL(action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
                   action
元素的完整属性表

属性

是否必须

说明

name

action的名字,用于匹配URL

class

Action实现类的完整类名

method

执行Action类时调用的方法

convert

应用于action的类型转换的完整类名



 

 

 

 

       例如:
<action name="user" class="org.lesson05.UserAction">

                <result name="success">/user.jsp</result>

        </action>

    2. 使用method属性
           在配置action时,我们可以通过action元素的method属性来指定action调用的
       
 方法,所指定的方法,必须遵循与execute方法相同的格式。
          
 Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用
        method
属性。
          
 Struts.xml文件中为同一个Action类配置不同的别名
            
<!-- 使用method属性 -->

<package name="methods" namespace="/"

extends="struts-default">

        <!-- 对应着MethodAction里面的execute方法 -->

        <action name="list" class="org.lesson05.MethodAction">

            <result name="success">/Methods/list.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的add方法 -->

        <action name="add" class="org.lesson05.MethodAction"

method="add">

            <result name="success">/Methods/add.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的edit方法 -->

        <action name="edit" class="org.lesson05.MethodAction"

method="edit">

            <result name="success">/Methods/edit.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的delete方法 -->

        <action name="delete"

class="org.lesson05.MethodAction"

 method="delete">

            <result name="success">/Methods/delete.jsp</result>

        </action>

</package>

对应的MethodAction类,代码如下:
            
importcom.opensymphony.xwork2.ActionSupport;

public class MethodAction extends ActionSupport

{

 

    @Override

    public String execute() throws Exception

    {

       return SUCCESS;

    }

   

    public String add() throws Exception

    {

       return SUCCESS;

    }

   

    public String edit() throws Exception

    {

       return SUCCESS;

    }

   

    public String delete() throws Exception

    {

       return SUCCESS;

    }

}

           使用actionmethod属性可以任意指定处理请求的方法(只要该方法和execute

方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不

同的Action类。

           注意:Struts2在根据action元素的method属性查找方法时有两种途径:

           1.查找与method属性值完全一致的方法.
2.
查找doMethod()形式的方法.

   3.动态方法调用:

         另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用

Struts2的动态方法调用。

   动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格

式为 actionName!methodName.action

   例如,我们配置了如下的action

   <action name="user" class="org.lesson05.UserAction">

            <result name="success">/Methods/list.jsp</result>

   </action>

          当请求/user!delete.action时,就会自动调用UserAction中的delete()

提示,这种调用方式会带来安全隐患!

 

4模拟Struts1中的ForwardAction
             <action name="user">

       <result>/index.jsp</result>

              </action>

      这样写就可以了.

 

   5.默认的action

         如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。

         默认的action使用default-action-ref元素来声明,如下所示:

          <!-- 默认action -->

<package name="defaultAction" namespace="/default"

extends="struts-default">

        <default-action-ref name="error"></default-action-ref>    

        <action name="defaultaction"

class="org.lesson05.DefaultAction">

            <result name="success">/defaultAction.jsp</result>

        </action>

        <action name="error">

            <result>/error.jsp</result>

        </action>

    </package>

   注意:根据struts-2.0.dtd中定义的package元素的内容模型,

default-acion-ref必须在action元素之前使用。

   如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1action,那么名为erroraction将被调用。

    注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。

    注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。

 

6.通配符映射

      随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。

      通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。

             以下是在action映射中使用通配符:
              
 <action name="news*"          

class="org.struts2.lesson05.News{1}Action">

                    <result name="success">/WEB-INF/News/{1}.jsp</result>

        </action>

      我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。

      在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action

   执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp

      action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从19的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射:
    
 <action name="*_*" class="org.struts2.lesson05.{1}Action"  

method="{2}">

            <result>/WEB-INF/News/{0}.jsp</result>

        </action>

      当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配deleteclass属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。

      通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:

               <action name="News_*"

class="org.struts2.lesson05.NewsAction" method="{1}">

                    <result>/WEB-INF/News/{0}.jsp</result>

        </action>

       当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法。


六、通过注解方法配置Action,方法如下

 

要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar。

虽说是零配置的,但struts.xml还是少不了的,配置如下:

 

<?xml version="1.0" encoding="UTF-8" ?> 

<!DOCTYPE struts PUBLIC 

    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" 

    "http://struts.apache.org/dtds/struts-2.1.7.dtd"> 

   

<struts>   

    <!-- 请求参数的编码方式--> 

    <constant name="struts.i18n.encoding" value="UTF-8"/> 

    <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开--> 

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

    <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.configuration.xml.reload" value="true"/> 

    <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  --> 

    <constant name="struts.devMode" value="false"/>   

    <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  --> 

    <constant name="struts.serve.static.browserCache" value="false" /> 

    <!-- 指定由spring负责action对象的创建    

    <constant name="struts.objectFactory" value="spring" /> 

    --> 

    <!-- 是否开启动态方法调用--> 

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/> 

</struts> 

action类的注解:

 

 

package com.tjcyjd.web.action;   

   

import org.apache.struts2.convention.annotation.Action;   

import org.apache.struts2.convention.annotation.ExceptionMapping;   

import org.apache.struts2.convention.annotation.ExceptionMappings;   

import org.apache.struts2.convention.annotation.Namespace;   

import org.apache.struts2.convention.annotation.ParentPackage;   

import org.apache.struts2.convention.annotation.Result;   

import org.apache.struts2.convention.annotation.Results;   

   

import com.opensymphony.xwork2.ActionSupport;   

   

/** 

 * Struts2基于注解的Action配置

 *  

 */   

@ParentPackage("struts-default") 

@Namespace("/annotation_test") 

@Results( { @Result(name = "success", location = "/main.jsp"), 

        @Result(name = "error", location = "/error.jsp") }) 

@ExceptionMappings( { @ExceptionMapping(exception = "java.lange.RuntimeException", result = "error") }) 

public class LoginAction extends ActionSupport { 

    private static final long serialVersionUID = 2730268055700929183L;  

    private String loginName;   

    private String password;   

   

    @Action("login") //或者写成  @Action(value = "login")  

    public String login() throws Exception {   

   

        if ("yjd".equals(loginName) && "yjd".equals(password)) {   

            return SUCCESS;   

        } else {   

            return ERROR;   

        }   

    }   

    @Action(value = "add", results = { @Result(name = "success", location = "/index.jsp") })   

    public String add() throws Exception {   

        return SUCCESS;   

    }   

    public String getLoginName() {   

        return loginName;   

    }   

    public void setLoginName(String loginName) {   

        this.loginName = loginName;   

    }   

    public String getPassword() {   

        return password;   

    }   

    public void setPassword(String password) {   

        this.password= password;   

    }   

这样就完成了一个基于注解的action配置。

 

总结常用的注解如下:

 

Namespace:指定命名空间。

ParentPackage:指定父包。

Result:提供了Action结果的映射。(一个结果的映射)

Results:“Result”注解列表

ResultPath:指定结果页面的基路径。

Action:指定Action的访问URL。

Actions:“Action”注解列表。

ExceptionMapping:指定异常映射。(映射一个声明异常)

ExceptionMappings:一级声明异常的数组。

InterceptorRef:拦截器引用。

InterceptorRefs:拦截器引用组。

 

原创粉丝点击