<!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。html
<struts> <include file="struts-default.xml"/> <include file="struts-user.xml"/> <include file="struts-book.xml"/> <include file="struts-shoppingCart.xml"/></struts>
见后面章节介绍。1.4. 拦截器配置:java
<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; } } }
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; } }
<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; } }
<!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. 运行结果:web
<!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方法。sql
<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; } }
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>
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的国际化:apache
1. 在工程中加入Struts支持浏览器
2. 编辑ApplicationResource.properties文件,在其中加入要使用国际化的信息, 例如: lable.welcome.china=Welcome!!!session
3. 建立英文资源文件ApplicationResource_en.properitesapp
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属性指定包的名称。