【Struts2一】Struts2 Hello World

Struts2 Hello World应用的基本步骤

创建Struts2的Hello World应用,包括如下几步:

1.配置web.xml

2.创建Action

3.创建struts.xml,配置Action

4.启动web server,通过浏览器访问

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <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>

</web-app>

 Struts2通过过滤器Filter的方式处理指定URL格式的请求,

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

 的init方法默认从WEB-INF/classes目录下查找struts.xml文件并进行解析,所以,struts2.xml文件默认应该放到WEB-INF/classes目录下

创建Action

package com.tom.actions;

public class HelloWorldAction {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String executeAction() {
        setMessage("Welcome to the Struts2 world");
        return  "success";
    }
}

HelloWorldAction是一个Action,没有特别的东西,executeAction是在struts2.xml中指定来响应某个请求时要执行的方法,返回值必须是String类型(???),“success”这个返回值对应于strtus2.xml中定义的某个页面的转发(forward)

创建并配置struts.xml

Struts2默认从在WEB-INF/classes目录下加载struts.xml文件

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="/simple" namespace="/simple" extends="struts-default">
        <action name="helloworld" class="com.tom.actions.HelloWorldAction" method="executeAction">
            <result name="success">/htmls/user.jsp</result>
        </action>
    </package>
</struts>

解释:1.package

package类似于Java的包,表示将一个业务模块相关的Action组织到一起,比如针对用户管理模块的Action可以放到name="/user"的包中

2.namespace

namespace是包中所有定义的Action的访问url的共同前缀,比如根据上面的配置,HelloworldAction的访问url是http://ip:port/contextroot/simple/helloworld

3.extends

表示这个包继承自struts-default这个抽象定义的包,抽象包表示package有个属性abtract设置为true,抽象包不能定义任何Action,所有的package都应该直接或者简洁继承struts-default才能称为一个包,都泽就不是一个包,namespace等属性不能起到Action访问url前缀的作用

4.action

定义一个action,package底下可以定义多个action,name属性表示action的名字,也是访问Action的url的最后的一部分。class属性表示要执行的Action的类,method属性表示要执行哪个方法,不指定method属性,则默认执行execute方法

5.result表示结果的响应往哪forward,name值和action的方法返回之匹配,其中的/htmls/usr.jsp表示相对于web应用跟目录的相对路径,

创建user.jsp

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>User.jsp</title>
</head>
<body>
    Hello, ${message}
</body>
</html>

请求Action

http://localhost:8688/web/simple/helloworld

页面的url地址不变,页面显示Welcome to the Struts2 world

响应请求的Action的查找顺序

1.当请求http://localhost:8688/web/simple/helloworld时,能够找到HelloWorldAction

2.当请求http://localhost:8688/web/simple/A/B/C/D/helloworld时,同样能够找到HelloWorldAction,原因是struts2在查找响应请求的Action时,对于namespace有一个查找数序:

  a.首先查找值为simple/A/B/C/D的namespace,找到则找helloworld这个action,如果找到,则匹配上;否则,action查找失败,返回404

  b.如果查找不到值为simple/A/B/C的namespace,则找值为simple/A/B/C的namespace,找到则找helloworld这个action,如果找到,则匹配上;否则,action查找失败,返回404

  c.以此类推,最后查找值为simple的namespace,找到则找helloworld这个action,如果找到,则匹配上;否则,action查找失败,返回404(此时匹配了HelloWorldAction的配置,所以能够正确响应)

  d.如果simple这个namepace也没有找到,则查找默认的namespace(值为长度为零的字符串,namespace=""),如果没有找到这个默认的namespace,则返回404;如果找到默认的namespace,则在默认namespace下查找helloworld这个action,如果找到,则匹配上;否则,action查找失败,返回404

3. 根据上面的查找规则http://localhost:8688/web/XXX/simple/helloworld则匹配失败,即HelloWorldAction匹配不上,所以会返回404

4. 根据上面查找顺序的分析,不同package的name不能相同,同时不同package的namespace也不能相同,否则对同一个请求有可能出现有两个以上的Action匹配成功,

猜你喜欢

转载自bit1129.iteye.com/blog/2109365