一.Struts2的开发环境和配置
1. 在MyEclipse中新建一个工程,在工程的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>
<!-- Add packages here -->
</struts>
2. 在WebRoot/WEB-INF/lib目录中添加
struts2-core2-2.x.x.jar,
xwork.x.x.jar,
freemarker-2.3.x.jar,
commons-logging-1.1.x.jar,
commons-fileupload-1.2.1.jar
ognl-2.6.x.jar
至少这六个jar文件(可从http://struts.apache.org/download.cgi#struts2014下载struts-2.x.x-all.zip文件)
3. 配置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>
现在struts2的环境配置已经完成了。
二.简单的struts2程序
2.1.建立action
在src下建立一个包org.hwh.action,在包中建立一个java类Login
package org.hwh.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport { private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String execute() throws Exception { if("123".equals(name)&&"hwh".equals(pass)) { return SUCCESS; } else return "fail"; } }
|
程序说明:执行execute方法,返回success或fail
2.2.将此action配置到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.action.extension" value="action"></constant> <package name="org.hwh.struts2" namespace="" extends="struts-default"> <action name="login" class="org.hwh.struts2.Login"> <result name="success">/ok.jsp</result> <result name="fail">/fail.jsp</result> </action>
</package> <!-- Add packages here -->
</struts> |
程序解释:package节点中的name可以随便起,但是多个package的name不能重复
namespace作为访问此action时的路径,可以没有也可以是空字符,extends为继承的package名。
Action节点中的name是访问此action时的名字,class为action的包名,默认为ActionSupport,method默认执行execute方法。
Result节点中的name为execute方法的返回值,根据name的值跳转到不同页面,默认为success。
编写hello.jsp,ok.jsp,fail..jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> <title>-_-+</title> </head> <body> <form action="login" method="post"> <input type="text" name="name" value="${name }"><br> <input type="password" name="pass" value="${pass }"><br> <input type="submit" value="ok"> </form> </body> </html> |
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> </head> <body> <h1>OK!</h1> </body> </html> |
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> </head> <body> <h1>FAIL!</h1> </body> </html> |
部署到tomcat中后在浏览器中输入
http://localhost:8080/Struts2/login或http://localhost:8080/Struts2/login.action 可以直接访问此action。如果不想.action想.xxx怎么办呢?
<constant name="struts.action.extension" value="xxx"></constant> |
这样就可以.xxx了。
在浏览器中输入http://localhost:8080/Struts2/hello.jsp输入123,hwh提交给action页面显示OK!否则FAIL!
constant节点的其他属性
<!--指定请求action的后缀,默认为action --> <constant name="struts.action.extension" value="hou"></constant> <!--指定编码集 --> <constant name="struts.i18n.encoding" value="GBK"></constant> <!--设置浏览器是否缓存静态内容,默认为true,开发阶段最好为false --> <constant name="struts.serve.static.browserCache" value="false"></constant> <!--当struts的配置文件修改后,系统是否自动重新加载该文件(不用重启服务器),默认为false,开发阶段最好为true--> <constant name="struts.configuraction.xml.reload" value="true"></constant> <!--开发过程中打印更详细的错误信息--> <constant name="struts.devMode" value="true"></constant> <!--默认的试图主题--> <constant name="struts.ui.theme" value="simple"></constant> <!--与spring集成时,指定有spring负责action对象的创建--> <constant name="struts.objectFactory" value="spring"></constant> <!--设置struts2是否支持动态方法调用,默认为true --> <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant> <!-- 文件上传总大小限制 --> <constant name="struts.multipart.maxSize" value="10701096"></constant> |
2.3.action名称的搜索顺序
<package name="org.hwh.struts2" namespace="" extends="struts-default"> |
现在的namespace为空,即使你在访问的时候在浏览器中输入
http://localhost:8080/Struts2/sss/224/waa/login.action也没有问题,也可以执行此action
如果namespace=”/hou”那么访问此action时就要输入http://localhost:8080/Struts2/hou/login
在/hou下可以再加n层不存在的目录也能访问到action,但是如果/hou不存在就不行了。如果该namespace不存在则会去找默认的namespace(为空的),如果没有定义为空的namespace的package则会出错。
2.4. result配置的各种视图转发类型
<result type=””> </result> |
Type的类型有dispacher(默认),redirect(客户端跳转),redirectAction(跳转到action),plainText(可显示源码的跳转)
其中跳转到的action在同一个package配置中直接用就可以,如果不在同一package下
<result type=”redirectAction”> <param name=”actionName”>actionName</param> <param name=”namespace”>namespace</param> </result> |
2.5. 为Action属性注入值
<package name="org.hwh.struts2" namespace="/hou" extends="struts-default"> <action name="login" class="org.hwh.struts2.Login"> <param name="name">123</param> <param name="pass">hwh</param> <result name="success">/ok.jsp</result> <result name="fail">/fail.jsp</result> </action> </package> |
说明:action下的param节点可为action中的属性赋值。赋值之后跳转到的jsp页面中可以用${name},${pass}获得值。注意:param中的name的值应该与action中属性的名称一致。
三.Struts2的处理流程
说明:当用户请求到达时,filter会过滤用户请求。默认情况下,请求无后缀或后缀名为
.action时(请求为一个action)这个请求会被转入struts2框架中处理,否则struts2则会略过此请求。当请求进入框架时会先进过一系列的拦截器,然后到action,根据action的返回值返回到jsp或html页面。Struts1与struts2不同的地方在于struts2中的action是线程安全的。
四.Struts2中使用多个配置文件
在struts.xml文件中使用include:
<struts> <include file="a.xml"></include> <include file="b.xml"></include> </struts> |
注意:被包含的文件中<package>的name是唯一的。