<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- struts2的action必须放在一个指定的包空间下定义 --> <package name="default" extends="struts-default"> <!-- 定义处理请求URL为login.action的Action --> <action name="login" class="org.qiujy.web.struts.action.LoginAction"> <!-- 定义处理结果字符串和资源之间的映射关系 --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- struts2的action必须放在一个指定的包空间下定义 --> <package name="qiujy" extends="struts-default"> <!-- 定义处理请求URL为login.action的Action --> <action name="login" class="org.qiujy.web.struts2.action.LoginAction"> <!-- 定义处理结果字符串和资源之间的映射关系 --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> <package name="my" extends="struts-default" namespace="/manage"> <!-- 定义处理请求URL为login.action的Action --> <action name="backLogin" class="org.qiujy.web.struts2.action.LoginAction"> <!-- 定义处理结果字符串和资源之间的映射关系 --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package>
</struts>
对于包default:没有指定namespace属性。如果某个包没有指定namespace属性,即该包使用默认的命名空间,默认的命名空间总是""。如上配置了两个包:default和my,配置my包时指定了该包的命名空间为/manage。
<struts> <include file="struts-default.xml"/> <include file="struts-user.xml"/> <include file="struts-book.xml"/> <include file="struts-shoppingCart.xml"/></struts>
见后面章节介绍。1.4. 拦截器配置:
<struts> <constant name="struts.custom.i18n.resources" value="messages"/> </struts>
package org.qiujy.web.struts2.action; import com.opensymphony.xwork2.ActionSupport; /** *@authorqiujy *@version1.0 */ publicclass LoginAction extends ActionSupport{ private String userName; private String password; private String msg; //结果信息属性 /** *@returnthemsg */ public String getMsg() { returnmsg; } /** *@parammsgthemsgtoset */ publicvoid setMsg(String msg) { this.msg = msg; } /** *@returntheuserName */ public String getUserName() { returnuserName; } /** *@paramuserNametheuserNametoset */ publicvoid setUserName(String userName) { this.userName = userName; } /** *@returnthepassword */ public String getPassword() { returnpassword; } /** *@parampasswordthepasswordtoset */ publicvoid setPassword(String password) { this.password = password; } /** *处理用户请求的excute()方法 *@return结果导航字符串 *@throwsException */ public String execute() throws Exception{ if("test".equals(this.userName) && "test".equals(this.password)){ msg = "登录成功,欢迎" + this.userName; return this.SUCCESS; }else{ msg = "登录失败,用户名或密码错"; return this.ERROR; } } }
2.2. Action访问Servlet API:往success.jsp和error.jsp页面中添加 EL表达式来显示结果信息。则最终效果跟以前一样。
public String execute() throws Exception{ if("test".equals(this.userName) && "test".equals(this.password)){ msg = "登录成功,欢迎" + this.userName; //获取ActionContext实例,通过它来访问Servlet API ActionContext context = ActionContext.getContext(); //看session中是否已经存放了用户名,如果存放了:说明已经登录了; //否则说明是第一次登录成功 if(null != context.getSession().get("uName")){ msg = this.userName + ":你已经登录过了!!!"; }else{ context.getSession().put("uName", this.userName); } returnthis.SUCCESS; }else{ msg = "登录失败,用户名或密码错"; returnthis.ERROR; } }
另外,Struts2中还提供了一个ServletActionContext类,Action只要继承自该类,就可以直接访问Servlet API。具体方法参看struts2的API文档。 Struts2中通过ActionContext来访问Servlet API,让Action彻底从Servlet API 中分离出来,最大的好处就是可以脱离Web容器测试Action。
<form method="post" action="userOpt!login.action">
package org.qiujy.web.struts2.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** *@authorqiujy *@version1.0 */ publicclass LoginAction extends ActionSupport{ private String userName; private String password; private String msg; //结果信息属性 /** *@returnthemsg */ public String getMsg() { returnmsg; } /** *@parammsgthemsgtoset */ publicvoid setMsg(String msg) { this.msg = msg; } /** *@returntheuserName */ public String getUserName() { returnuserName; } /** *@paramuserNametheuserNametoset */ publicvoid setUserName(String userName) { this.userName = userName; } /** *@returnthepassword */ public String getPassword() { returnpassword; } /** *@parampasswordthepasswordtoset */ publicvoid setPassword(String password) { this.password = password; } /** *处理用户请求的login()方法 *@return结果导航字符串 *@throwsException */ public String login() throws Exception{ if("test".equals(this.userName) && "test".equals(this.password)){ msg = "登录成功,欢迎" + this.userName; //获取ActionContext实例,通过它来访问Servlet API ActionContext context = ActionContext.getContext(); //看session中是否已经存放了用户名,如果存放了:说明已经登录了; //否则说明是第一次登录成功 if(null != context.getSession().get("uName")){ msg = this.userName + ":你已经登录过了!!!"; }else{ context.getSession().put("uName", this.userName); } returnthis.SUCCESS; }else{ msg = "登录失败,用户名或密码错"; returnthis.ERROR; } } public String regist() throws Exception{ //将用户名,密码添加到数据库中 //... msg = "注册成功。"; returnthis.SUCCESS; } }
2. struts.xml文件:没有什么变化,跟以前一样配置
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="my" extends="struts-default" namespace="/manage"> <!-- 定义处理请求URL为login.action的Action --> <action name="userOpt" class="org.qiujy.web.struts2.action.LoginAction"> <!-- 定义处理结果字符串和资源之间的映射关系 --> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>用户登录页面</title> </head> <body> <h2>用户入口</h2> <hr> <form action="manage/userOpt!login.action" method="post"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="userName"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td colspan="2"> <input type="submit" value=" 确定 "/> </td> </tr> </table> </form> </body> </html> regist.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>用户注册页面</title> </head> <body> <h2>用户注册</h2> <hr> <form action="manage/userOpt!regist.action" method="post"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="userName"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td colspan="2"> <input type="submit" value=" 注册 "/> </td> </tr> </table> </form> </body> </html>
4. 运行结果:
![](http://www.java3z.com/cwbwebhome/article/article2/img4/struts2_ch2_2.gif)
![](http://www.java3z.com/cwbwebhome/article/article2/img4/struts2_ch2_1.gif)
![](http://www.java3z.com/cwbwebhome/article/article2/img4/struts2_ch2_3.gif)
![](http://www.java3z.com/cwbwebhome/article/article2/img4/struts2_ch2_4.gif)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="my" extends="struts-default" namespace="/manage"> <action name="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> <action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
<action name="user_*" class="org.qiujy.web.struts2.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action>
如上,<action name=”user_*”>定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法。
<global-results> <result name="error">/Error.jsp</result> <result name="invalid.token">/Error.jsp</result> <result name="login" type="redirect-action">Logon!input</result> </global-results>
名字 说明
chain 用来处理Action链
dispatcher 用来转向页面,通常处理JSP,这是默认的结果类型
freeMarker 处理FreeMarker模板
httpHeader 用来控制特殊的Http行为
redirect 重定向到一个URL
redirect-action 重定向到一个Action
stream 向浏览器发送InputSream对象,通常用来处理文件下载
velocity 处理Velocity模板
xslt 处理XML/XLST模板
plaintext 显示原始文件内容,例如文件源代码
tiles 结合Tile使用
private String nextAction; public String getNextAction() { return nextAction; }
<action name="fragment" class="FragmentAction"> <result name="next" type="redirect-action"></result> </action>
package org.qiujy.domain; publicclass User { private String userName; private String password; /** *@returntheuserName */ public String getUserName() { returnuserName; } /** *@paramuserNametheuserNametoset */ publicvoid setUserName(String userName) { this.userName = userName; } /** *@returnthepassword */ public String getPassword() { returnpassword; } /** *@parampasswordthepasswordtoset */ publicvoid setPassword(String password) { this.password = password; } }
2. 业务控制器:UserAction.java
package org.qiujy.web.struts2.action; import org.qiujy.domain.User; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; publicclass UserAction extends ActionSupport{ //定义用于封装请求参数的模型对象 private User user = new User(); private String msg; //结果信息属性 /** *@returntheuser */ public User getUser() { returnuser; } /** *@paramusertheusertoset */ publicvoid setUser(User user) { this.user = user; } /** *@returnthemsg */ public String getMsg() { returnmsg; } /** *@parammsgthemsgtoset */ publicvoid setMsg(String msg) { this.msg = msg; } /** *处理用户请求的login()方法 *@return结果导航字符串 *@throwsException */ public String login() throws Exception{ String userName = user.getUserName(); String password = user.getPassword(); if("test".equals(userName) && "test".equals(password)){ msg = "登录成功,欢迎" + userName; //获取ActionContext实例,通过它来访问Servlet API ActionContext context = ActionContext.getContext(); //看session中是否已经存放了用户名,如果存放了:说明已经登录了;否则说明是第一次登录成功 if(null != context.getSession().get("uName")){ msg = userName + ":你已经登录过了!!!"; }else{ context.getSession().put("uName", userName); } returnthis.SUCCESS; }else{ msg = "登录失败,用户名或密码错"; returnthis.ERROR; } } public String regist() throws Exception{ //将用户名,密码添加到数据库中 //... msg = "注册成功。"; returnthis.SUCCESS; } }
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="my" extends="struts-default" namespace="/manage"> <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <title>用户登录页面</title> </head> <body> <h2>用户入口</h2> <hr> <form action="manage/userOpt!login.action" method="post"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="user.userName"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="user.password"/></td> </tr> <tr> <td colspan="2"> <input type="submit" value=" 确定 "/> </td> </tr> </table> </form> </body> </html>
5. 运行效果:同以前一样。其它页面略。
public String regist() throws Exception{ //将用户名,密码添加到数据库中 //... //msg = "注册成功。"; if(true){ throw new java.sql.SQLException("没有数据库驱动程序"); } return this.SUCCESS; }
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="my" extends="struts-default" namespace="/manage"> <!-- 定义全局处理结果 --> <global-results> <!-- 逻辑名为sql的结果,映射到/exception.jsp页面 --> <result name="sql">/exception.jsp</result> </global-results> <global-exception-mappings> <!-- 当Action抛出SQLException异常时,转入名为sql的结果 --> <exception-mapping exception="java.sql.SQLException" result="sql"/> </global-exception-mappings> <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>异常信息</title> </head> <body> <h2> 出现异常啦 </h2> <hr/> <h3 style="color:red"> <!-- 获得异常对象 --> <s:property value="exception.message"/> </h3> <br/> <!-- 异常堆栈信息 --> <s:property value="exceptionStack"/> </html>
7. Struts2的国际化:
1. 在工程中加入Struts支持
2. 编辑ApplicationResource.properties文件,在其中加入要使用国际化的信息, 例如: lable.welcome.china=Welcome!!!
3. 创建英文资源文件ApplicationResource_en.properites
4. 创建临时中文资源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中国欢迎您!
5. 对临时中文资源文件进行编码转换。可以使用myeclipse的插件,也可以在dos下执行:native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties
6. 在jsp中加入struts的bean标记库 <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>显示信息: <bean:message key="label.welcome.china">可以在struts-config.xml文件中定义多个资源包,而每个资源包可使用key属性指定包的名称。