Struts2--请求的配置与注解

来源:互联网 发布:网卡mac地址修改 编辑:程序博客网 时间:2024/06/09 20:27

官方文档:http://struts.apache.org/docs/
1 基于配置文件的处理请求Demo
在SayHello.jsp页面填写对谁说Hello,提交后后台处理跳转到处理页面。
web.xml配置

<!-- 核心控制器 -->    <filter>        <filter-name>struct2</filter-name>        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>struct2</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>    <welcome-file-list>        <welcome-file>index.html</welcome-file>    </welcome-file-list>

核心控制器StrutsPrepareAndExecuteFilter过滤请求
Struts.xml配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- extends必须写,直接或者 间接继承struts-default namespace中必须添加/-->    <package name="default" namespace="/" extends="struts-default">        <!-- name对应请求名,不能在字符前添加/  class对应请求处理函数-->        <action name="HelloWorld" class="com.tang.struct.HelloWorld">            <!-- name对应execute的返回值,对应返回不同的页面 -->            <result name="success">/HelloWorld.jsp</result>        </action>    </package></struts>

将指定URL配置由指定的类的指定方法来处理。result可以配置成转发请求的形式。如下例:

<result name="success" type="redirectAction">list</result>

请求处理类及方法:

public class HelloWorld extends ActionSupport {    //请求的字段,对应于请求URL中?后的字段    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    /**     * 处理URL请求     */    public String execute() {        name = "Hello, " + name + "!";        System.out.println("输出");        return SUCCESS;    }}

URL?后的字段对应类中的属性。
入口页面:

<html>    <head>        <title>Say Hello</title>    </head>    <body>        <h3>Say "Hello" to: </h3>        <s:form action="HelloWorld">            在action后添加/            Name: <s:textfield name="name" />            <s:submit />        </s:form>    </body></html>

中的name映射到控制层中类的属性中。
结果跳转页面:

<html>    <head>        <title>Hello</title>    </head>    <body>        <h3><s:property value="name" /></h3>    </body></html>

中的name值对应execute中重新赋值的变量。
1.2 请求链,将该个请求转到指定空间中的指定处理name名,即为一个链条。需要配置Chaining Interceptor拦截器,默认在struts-default.xml中已配置。
JSP页面:

<body>    <form action="hello01/hello01" method="post">        用户名:<input type="text" name="name"/><br>        <input type="submit" value="登录"/>    </form>  </body>

第一个请求处理类:

public class Hello01Action {    private String name;    public String hello01(){        System.out.println("hello01"+name);        return Action.SUCCESS;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

第二个请求:

public class Hello02Action {    private String name;    public String hello02(){        System.out.println("hello02"+name);        return null;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

配置信息:

<struts>    <package name="hello01" extends="struts-default" namespace="/hello01">        <action name="hello01" class="com.tang.struts01.Hello01Action" method="hello01">            <result type="chain">                <!-- 将请求转到另外一个namespace的指定action -->                <param name="namespace">/hello02</param>                <param name="actionName">hello02</param>            </result>        </action>    </package>    <package name="hello02" extends="struts-default" namespace="/hello02">        <action name="hello02" class="com.tang.struts02.Hello02Action" method="hello02">        </action>    </package></struts>

在两个请求处理方法中均打印出传递属性。
运行结果:
这里写图片描述
1.3 action创建监听类,用来监控action的创建,具体看代码中的注释:

public class MyActionEventListener implements ActionEventListener {    /**     * 当action抛出异常时执行     * @param stack 当前stack     */    @Override    public String handleException(Throwable arg0, ValueStack arg1) {        // TODO Auto-generated method stub        System.out.println("handleException");        return null;    }    /**     * 在action创建之后执行     * @param action 当前action     * @param stack 当前stack     * @return 当前action     */    @Override    public Object prepare(Object arg0, ValueStack arg1) {        // TODO Auto-generated method stub        System.out.println("prepare");        return arg0;    }}

2 基于注解的配请求映射。
Struts.xml中不用配置任何。映射请求均在方法中。
请求处理类:

import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Namespace;import org.apache.struts2.convention.annotation.ParentPackage;import org.apache.struts2.convention.annotation.Result;import com.opensymphony.xwork2.ActionSupport;//设置该类的命名空间@ParentPackage(value="struts-default")@Namespace("/")public class HelloAction extends ActionSupport{    //使用注解将URL请求映射到该方法中    @Action(value="/hello",            results={@Result(name="success",location="/index.jsp")})    public String execute(){        System.out.println("hello action");        return "success";    }}

可让不同的URL由相同的方法来处理,该注解可让多个URL映射到相同的方法中,同时也可返回多个JSP文件中。
如下:

@Actions({    @Action("/different/url"),    @Action("/another/url")  })

也可在类级别通过注解方式配置返回页面,如下:

@Results({  @Result(name="failure", location="fail.jsp")})public class HelloWorld extends ActionSupport {  @Action(value="/different/url",    results={@Result(name="success", location="http://struts.apache.org", type="redirect")}  )  public String execute() {    return SUCCESS;  }}

3 namespace
3.1 注解
处理类:

@Namespace("/custom")public class HelloWorld extends ActionSupport {    @Action("/different/url")    public String execute() {        System.out.println("execute");        return null;    }    @Action("/url")    public String doSomething() {        System.out.println("doSomething");        return null;    }}

结果:
http://localhost:8080/Struts04/custom/different/url映射到了doSomething()方法中。
http://localhost:8080/Struts04/custom/url 映射到了doSomething()方法中。
http://localhost:8080/Struts04/different/url链接能映射到execuet()方法中。
http://localhost:8080/Struts04/url 映射到了doSomething()方法中。
这其中的映射为也是醉了。暂不解其中原理。

原创粉丝点击