一、命名空间及result的转发类型
1.新建项目test2
2.定义2个action类,分别处理普通用户访问和管理员用户访问,并在execute方法中分别对普通用户和管理员用户进行校验:普通用户:用户名(testuser),密码(123);管理员:用户名(testadmin),密码(123)
loginAdminAction.java:处理管理员
package action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class loginAdminAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public String execute() throws Exception{
if(getUsername().equals("testadmin") && getPassword().equals("123")){
ActionContext.getContext().getSession().put("username", getUsername());
return "success";
}
return "error";
}
}
loginUserAction.java:处理普通用户
package action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class loginUserAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public String execute() throws Exception{
if(getUsername().equals("testuser") && getPassword().equals("123")){
ActionContext.getContext().getSession().put("username", getUsername());
return "success";
}
return "error";
}
}
3.分别在“/users”、“/admin”两个不同的命名空间中配置以上两个action,action的name都为“login”,返回“success”显示hello.jsp,否则显示login.jsp。
4.配置一个默认的命名空间,action的name也是login,重定向到“/users”命名空间下的login:<result type=“redirect”>/users/login.action</result>
struts.xml
虽然要求是<result type="redirect">/users/login.action</result>,但以我理解的写法如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="default" extends="struts-default">
<action name="login">
<result type="redirectAction">
<param name="actionName">login</param>
<param name="namespace">/user</param>
</result>
</action>
</package>
<package name="admin" namespace="/admins" extends="struts-default">
<action name="login" class="action.loginAdminAction">
<result name="success">/admin/hello.jsp</result>
<result name="error">/admin/login.jsp</result>
</action>
</package>
<package name="user" namespace="/users" extends="struts-default">
<action name="login" class="action.loginUserAction">
<result name="success">/user/hello.jsp</result>
<result name="error">/user/login.jsp</result>
</action>
</package>
</struts>
5.在user目录建立login.jsp和hello.jsp:login.jsp是普通用户登录窗口,<s:form action=“/user/login”>;Hello.jsp是登录成功后显示的页面,打印用户名。
6.在admin目录建立login.jsp和hello.jsp:login.jsp是管理员用户登录窗口,<s:form action=“/admin/login”>;Hello.jsp是登录成功后显示的页面,打印用户名
admin文件夹下的login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<s:form action="login" namespace="/admins">
<s:textfield name="username"/>
<s:password name="password"/>
<s:submit/>
</s:form>
</body>
</html>
user文件夹下的login,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<s:form action="login" namespace="/users">
<s:textfield name="username"/>
<s:password name="password"/>
<s:submit/>
</s:form>
</body>
</html>
两个文件夹下的hello.jsp的内容都是一样的
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>登录成功</title>
</head>
<body>
显示用户名<s:property value="username"/>
</body>
</html>
7.测试
普通用户登录 http://localhost:8080/test2/user/login.jsp
管理员用户登录http://localhost:8080/test2/admin/login.jsp
默认登录http://localhost:8080/test2/login
访问http://localhost:8080/test2/error/login
二、为Action的属性注入值
1.在action类中增加属性defaultuser,和defaultpassword;并生成get和set方法
2.在struts.xml中的action元素下面增加
<param name=“defaultuser”> testuser </param>
<param name="defaultpassword">123</param>
3.在execute方法中用defaultuser 和defaultpassword进行校验用户输入信息.
loginUserAction.java
package action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class loginUserAction extends ActionSupport {
private String username;
private String password;
private String defaultuser;
private String defaultpassword;
public void setDefaultuser(String defaultuser) {
this.defaultuser = defaultuser;
}
public void setDefaultpassword(String defaultpassword) {
this.defaultpassword = defaultpassword;
}
public String getDefaultuser() {
return defaultuser;
}
public String getDefaultpassword() {
return defaultpassword;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public String execute() throws Exception{
if(getUsername().equals("testuser") && getPassword().equals("123")){
ActionContext.getContext().getSession().put("username", getUsername());
return "success";
}
if(getDefaultuser().equals("testuser") && getDefaultpassword().equals("123")){
ActionContext.getContext().getSession().put("username", getUsername());
return "success";
}
return "error";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.action.extension" value="jspx"/>
<package name="default" extends="struts-default">
<action name="login">
<result type="redirectAction">
<param name="actionName">login</param>
<param name="namespace">/user</param>
</result>
</action>
</package>
<package name="admin" namespace="/admins" extends="struts-default">
<action name="login" class="action.loginAdminAction">
<result name="success">/admin/hello.jsp</result>
<result name="error">/admin/login.jsp</result>
</action>
</package>
<package name="user" namespace="/users" extends="struts-default">
<action name="login" class="action.loginUserAction">
<param name="defaultuser">testuser</param>
<param name="defaultpassword">123</param>
<result name="success">/user/hello.jsp</result>
<result name="error">/user/login.jsp</result>
</action>
</package>
</struts>
三、使用常量
1.为了使得支持中文输入,使用<constant name="struts.i18n.encoding" value=“GBK"/>
2.为了将action的扩展名改成.do,使用<constant name="struts.action.extension" value="do"/>,改成".jspx"试试?
3.设置浏览器不缓存静态内容<constant name="struts.serve.static.browserCache" value="false"/>
4.设置自动重新加载struts.xml:<constant name="struts.configuration.xml.reload" value="true"/>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.action.extension" value="jspx"/>
<constant name="struts.serve.static.browserCache" value="false"/>
<constant name="struts.configuration.xml.reload" value="true"/>
<package name="default" extends="struts-default">
<action name="login">
<result type="redirectAction">
<param name="actionName">login</param>
<param name="namespace">/user</param>
</result>
</action>
</package>
<package name="admin" namespace="/admins" extends="struts-default">
<action name="login" class="action.loginAdminAction">
<result name="success">/admin/hello.jsp</result>
<result name="error">/admin/login.jsp</result>
</action>
</package>
<package name="user" namespace="/users" extends="struts-default">
<action name="login" class="action.loginUserAction">
<param name="defaultuser">testuser</param>
<param name="defaultpassword">123</param>
<result name="success">/user/hello.jsp</result>
<result name="error">/user/login.jsp</result>
</action>
</package>
</struts>
四、配置共享视图及异常处理机制
1.在package元素下,增加
<global-results><result name="exception">exceptions.jsp</result></global-results>
2.配置异常处理机制,增加
<exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping>
3.如果希望配制成全局异常映射,则配制成<global-exception-mappings>,包含<exception-mapping>元素。
4.在exception.jsp中输出异常信息
<s:property value=“exception.message”/><s:property value=“exceptionStack”/>
无