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匹配成功,