Struts2学习总结二
Struts2学习总结二
这次主要说:
- 请求封装参数
- 几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
- 强制类型转换
- 拦截器
- form表单验证
1、请求封装参数
有以下三种封装形式:
- 动作类(action)为实体模型。
- 动作类和实体模型分开。
- 模型驱动
- 单独模型驱动
- 模型驱动和动作类一起使用
- 值栈的问题(放到后面说明,这里就写一个demo)
1.1、动作类作为实体模型
做如下几件事情:
- 创建UserAction类,并且继承ActionSupport类。
- 创建struts.xml,并编写。
- 编写web.xml。
- 编写2个jsp。
- 访问
http://ip:port/webapps/namespace/actionName.action
。
1.1.1、创建UserAction类
package com.csa.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String username;
private String password;
public String login() {
System.out.println("姓名:"+username+"\r\n密码:"+password);
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1.1.2、创建struts.xml并编写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="struts-default" namespace="/user">
<action name="*" class="com.csa.action.UserAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
1.1.3、编写web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- 配置struts2过滤器 -->
<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>
1.1.4、2个.jsp文件
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录成功</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
1.1.5、测试
访问:
结果:
传递参数原理:
需要编写相应的setter方法。
1.2、动作类和实体模型分开
需要做的就几件事情:
- 编写User类。
- 编写UserAction并继承ActionSupport类。
- 编写struts.xml
- 编写web.xml
- 更改index.jsp的内容
1.1.1、编写User类
package com.csa.domain;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
1.2.2、编写UserAction类
注意,并不需要new
一个User对象
。
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private User user;
public String login() {
System.out.println(user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1.2.3、编写struts.xml
与上一个的一样,没有任何改变!
1.2.4、编写web.xml
也没有变化!
1.2.5、修改index.jsp内容
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="text" name="user.password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
1.2.6、测试结果
1.2.7、原理
有点类似与对象名.属性=输入的值
。
1.3、模型驱动
分三部分说明:
- 单独使用模型驱动。
- 模型驱动和动作类一起使用。
- ajax返回json数据问题。(这个就是值栈的问题)
1.3.1、模型驱动单独使用
分几步走:
- 创建User类。
- 创建UserAction类并实现一个ModelDriven接口,其中泛型是User类。
- 编写struts.xml。
- 编写web.xml。
- 修改index.jsp。
1.3.1.1、创建User类
没有改变。
1.3.1.2、创建UserAction并实现ModelDriven接口
注意,这里需要new User()
。
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction implements ModelDriven<User> {
private User user = new User();
public String login() {
System.out.println(user);
return "success";
}
@Override
public User getModel() {
return user;
}
}
1.3.1.3、编写struts.xml
没有改变。
1.3.1.4、编写web.xml
没有改变。
1.3.1.5、修改index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
1.3.1.6、测试
1.3.1.7、原理
说实话,这个原理我也不太知道!简单的认为它是前面两个的结合吧!
1.3.2、模型驱动和动作类一起使用
做两个例子:
- 参数不冲突。
- 参数冲突。
步骤:
- 编写User类。
- 编写UserAction类,并继承ActionSupport类和实现ModelDriven接口。
- 编写struts.xml。
- 编写web.xml。
- 修改index.jsp。
1.3.2.1、编写User类
没变!
1.3.2.2、编写UserAction类
第一个例子的编写:
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
private String phone;
public String login() {
System.out.println(user);
return "success";
}
@Override
public User getModel() {
return user;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
第二个例子的编写:
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
private String username;
public String login() {
System.out.println(user);
System.out.println("username:"+username);
return "success";
}
@Override
public User getModel() {
return user;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
1.3.2.3、编写struts.xml
没变!
1.3.2.4、编写web.xml
没变!
1.3.2.5、修改index.jsp
第一个例子的编写:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
电话:<input type="text" name="phone"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
第二个例子的编写:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="login"/>
</form>
</body>
</html>
1.3.2.6、测试
第一个例子的结果:
第二个例子的结果:
1.3.2.7、原理
这个我也不太清楚,只知道两个同时用的时候千万别参数名一直!
1.3.3、ajax的一个例子(我认为很多人都应该碰到过)
需要做的事情:
- 编写User类。
- 编写UserAction类,并继承ActionSupport和实现ModelDriven接口。
- 修改struts.xml。
- 编写web.xml。
- 修改index.jsp,并编写ajax。
- 实验结果。
- 解决方案。
在开始之前需要导入一个jar包。
1.3.3.1、编写User类
没变!
1.3.3.2、编写UserAction类,并继承…
package com.csa.action;
import java.util.Map;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
private String phone;
public String login() {
System.out.println(user);
System.out.println("phone:"+phone);
return "success";
}
@Override
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
1.3.3.3、修改struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="json-default" namespace="/user">
<action name="*" class="com.csa.action.UserAction" method="{1}">
<result name="success" type="json"></result>
</action>
</package>
</struts>
1.3.3.4、编写web.xml
没变!
1.3.3.5、修改index.jsp并编写ajax
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>登录页面</title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
function submitForm() {
$.ajax({
url:"${pageContext.request.contextPath}/user/login.action",
type:"get",
data:$("#loginId").serialize(),
success:function(result){
console.log(result);
}
});
}
</script>
</head>
<body>
<form id="loginId">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
电话:<input type="text" name="phone"/><br/>
<input type="button" onclick="submitForm();" value="login"/>
</form>
</body>
</html>
1.3.3.6、实验结果
发现,并没有得到phone
的值,而且只得到了user的两个参数值,并不是user包含着两个参数的。怎么回事呢?按道理应该放回所有参数才对!
1.3.3.7、解决方案
修改UserAction代码:
package com.csa.action;
import java.util.HashMap;
import java.util.Map;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
private String phone;
public String login() {
System.out.println(user);
System.out.println("phone:"+phone);
Map<String,Object> json = new HashMap<>();
json.put("user", user);
json.put("phone", phone);
ActionContext.getContext().getValueStack().push(json);
return "success";
}
@Override
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
实验结果:
2、几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC(控制反转)机制注入Request对象。
- 在Action中获取request。
- 通过ServletActionContext类来获取。
- 通过ServletRequestAware接口通过IOC机制注入Request对象。
2.1、在Action中获取request
Map request = (Map)ActionContext.getContext().get("request");
2.2、通过ServletActionContext类来获取
HttpServletRequest request = ServletActionContext.getRequest();
2.3、通过ServletRequestAware接口来获取
public class 类名 implements ServletRequestAware {
private HttpServletRequest request;
//实现接口中的方法
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
}
其他域的对象同理!
3、强制类型转换
实际开发中用户通过浏览器输入的数据都是String或者String[]。当为数组的时候,将用,
隔开。
3.1、一个日期转换的例子
我们现在知道,在前端输入一个以字符串为值的日期形式,只能收取格式为yyyy-MM-dd
,其他格式将会报错。
我们将改进这个,使得前端不仅仅可以收取格式为yyyy-MM-dd
的,还可以是yyyy/MM/dd
的格式。
需要做的事情:
- 创建User类。
- 创建UserAction并实现ModelDriven接口。
- 创建类型转换类,命名为DateConverter并继承StrutsTypeConverter类。
- 编写strtus.xml和web.xml。
- 编写index.jsp。
- 编写javabean名称-conversion.properties文件。
3.1.1、创建User类
package com.csa.domain;
import java.util.Date;
public class User {
private String username;
private String password;
private Date birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + ", birthday=" + birthday + "]";
}
}
3.1.2、创建UserAction类
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction implements ModelDriven<User> {
private User user = new User();
public String register() {
System.out.println(user);
return "success";
}
@Override
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3.1.3、创建DateConverter并继承StrutsTypeConverter类
package com.csa.converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class DateConverter extends StrutsTypeConverter {
private DateFormat df1 = new SimpleDateFormat("yyyy/MM/dd");
private DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//1. 判断输入进来的值是否为空
if(values==null||values.length==0) {
return null;
}
//2. 取出要转换的元素
String date = values[0];
//3. 判断是否为要转换的那个类型
if(toClass==java.util.Date.class) {
//4. 按照定义的格式来解析
try {
if(date.indexOf("/")!=-1) {
System.out.println(1);
return df1.parse(date);
}else if(date.indexOf("-")!=-1) {
System.out.println(2);
return df2.parse(date);
}else {
return null;
}
} catch(Exception e) {
System.out.println(e.getMessage());
return null;
}
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
//判断object对象是否日期对象
if(o instanceof java.util.Date) {
Date date = (Date)o;
return df1.format(date);
}
return null;
}
}
3.1.4、编写strtus.xml和web.xml
编写struts.xml,web.xml没变:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="json-default" namespace="/user">
<action name="*" class="com.csa.action.UserAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
3.1.5、编写index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>注册页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/register.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
生日:<input type="text" name="birthday"/><br/>
<input type="submit" value="register"/>
</form>
</body>
</html>
3.1.6、编写javabean名称-conversion.properties文件
User-conversion.properties文件内容:
birthday = com.csa.converter.DateConverter
3.1.6、测试结果
3.2、全局配置文件与局部配置文件
刚刚例子中,全局配置文件并没有说明,当时你也许已经知道局部配置文件是谁了!没错,User-conversion.properties
是局部配置文件。
全局配置文件(放在src下,名字固定为"xwork-conversion.properties"):
针对于这个例子的文件内容为:
java.util.Date = com.csa.converter.DateConverter
局部优先!
4、拦截器
说到拦截器,举一个登录的例子就行了。
注意,拦截器只能拦截Action,不像过滤器那么强大,什么都可以拦截。
几个内容:
- 登录验证拦截器。
- 默认的拦截器。
- 继承package的拦截器。
4.1、登录验证拦截器
下面几个步骤:
- 创建登录验证拦截器类。
- 创建UserAction类和User类。
- 创建struts.xml和web.xml。
- 编写index.jsp。
- 测试没有登录的情况访问不允许访问的action。
4.1.1、创建登录验证拦截器类
需要继承一个MethodFilterIntercpteor抽象类!虽然其他的也可以,但是我们一般继承这个类!不过需要注意的是,在这个例子里面只能继承这个类,否则需要做的事情还有很多!
package com.csa.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class LoginCheck extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
Map<String,Object> session = ActionContext.getContext().getSession();
//如果登录了,那么就有session保存user对象。
if(session.get("user")!=null) {
return invocation.invoke();
}else {
//还记得一开始我们struts拦截器部分会返回一个String结果字符串吗?这个其实就是结果视图!
return "error";
}
}
}
4.1.2、创建UserAction类和User类
package com.csa.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction implements ModelDriven<User>,SessionAware {
private User user = new User();
private Map<String,Object> session;
public String login() {
session.put("user", user);
return "success";
}
/**
* 只有登录成功后才能被访问
* @return
*/
public String success() {
return "success";
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package com.csa.domain;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
4.1.3、创建struts.xml和web.xml
web.xml没变,下面是struts.xml的编写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="json-default" namespace="/user">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck"></interceptor>
</interceptors>
<!-- 全局视图 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="*" class="com.csa.action.UserAction" method="{1}">
<!-- 使用我们定义的拦截器 -->
<interceptor-ref name="loginCheck">
<!--
不写下面这个参数默认拦截所有方法,
写,则说明不拦截某个方法。如果有多个方法则用","分开
比如:login,register,...
-->
<param name="excludeMethods">login</param>
<!-- 还有可以参数是:includeMethods,作用相反,这个是哪些方法被拦截! -->
<!--
<param name="includeMethods">login,register</param>
这样子,login和register方法将被拦截!
-->
</interceptor-ref>
<!-- 注意,这里如果使用了自定义的拦截器,那默认拦截器将会被取消,所以我们要再加上一个默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
还有另外一种版本(与上面的等价):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="json-default" namespace="/user">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck">
<param name="excludeMethods">login</param>
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="loginCheck"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 全局视图 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="*" class="com.csa.action.UserAction" method="{1}">
<!-- 注意这里引用的是拦截器栈! -->
<interceptor-ref name="loginStack"></interceptor-ref>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
4.1.4、编写index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="register"/>
</form>
</body>
</html>
4.1.5、测试没有登录的情况访问不允许访问的action
登录情况下:
4.2、默认的拦截器
编写struts.xml文件内容(default-interceptor-ref元素):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 配置说明省略 -->
<package name="user" extends="json-default" namespace="/user">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck">
<param name="excludeMethods">login</param>
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="loginCheck"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 直接引用拦截器栈,从而下面的action中我们就不需要定义了 -->
<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<!-- 全局视图 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="*" class="com.csa.action.UserAction" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
4.3、继承package的拦截器
需要做的事情:定义两个包,有继承关系!讲这个只是为了一件事情,很多操作必须在登录的条件下才能进行!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 基类名字为base,继承json-default,命名空间并不会影响到继承的interceptors元素default..等等这些东西 -->
<package name="base" extends="json-default" namespace="/">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck">
<param name="excludeMethods">login</param>
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="loginCheck"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 直接引用拦截器栈,从而下面的action中我们就不需要定义了 -->
<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<!-- 全局视图 -->
<global-results>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</global-results>
</package>
<!-- user继承base,将里面的所有元素全部继承,并不影响子类编写自己的元素! -->
<package name="user" extends="base" namespace="/user">
<action name="*" class="com.csa.action.UserAction" method="{1}"></action>
</package>
</struts>
测试是否正确的结果(从下面就可以看出,已经全被继承成功了):
5、form表单验证(声明式验证)
注意-validation.xml命名的两个点:
- 在Action包下创建ActionClassName-validation.xml,这是针对这个Action中的所有方法都验证!
- 在Action包下创建ActionClassName-ActionName-validation.xml,这是针对ActionName这个方法验证!
第5点的表单验证,我自己也没去玩过!都是直接用JavaScript和Action方法中的硬编码实现的。或者自定义一个工具类Utils,直接调用Utils的方法!
参考
黑马笔记,和百度了一些博客!