Struts2学习总结二

Struts2框架学习

Struts2学习总结二

这次主要说:

  1. 请求封装参数
  2. 几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
  3. 强制类型转换
  4. 拦截器
  5. form表单验证

1、请求封装参数

有以下三种封装形式:

  1. 动作类(action)为实体模型。
  2. 动作类和实体模型分开。
  3. 模型驱动
    1. 单独模型驱动
    2. 模型驱动和动作类一起使用
    3. 值栈的问题(放到后面说明,这里就写一个demo)
1.1、动作类作为实体模型

做如下几件事情:

  1. 创建UserAction类,并且继承ActionSupport类。
  2. 创建struts.xml,并编写。
  3. 编写web.xml。
  4. 编写2个jsp。
  5. 访问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、动作类和实体模型分开

需要做的就几件事情:

  1. 编写User类。
  2. 编写UserAction并继承ActionSupport类。
  3. 编写struts.xml
  4. 编写web.xml
  5. 更改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、模型驱动

分三部分说明:

  1. 单独使用模型驱动。
  2. 模型驱动和动作类一起使用。
  3. ajax返回json数据问题。(这个就是值栈的问题)
1.3.1、模型驱动单独使用

分几步走:

  1. 创建User类。
  2. 创建UserAction类并实现一个ModelDriven接口,其中泛型是User类。
  3. 编写struts.xml。
  4. 编写web.xml。
  5. 修改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、模型驱动和动作类一起使用

做两个例子:

  1. 参数不冲突。
  2. 参数冲突。

步骤:

  1. 编写User类。
  2. 编写UserAction类,并继承ActionSupport类和实现ModelDriven接口。
  3. 编写struts.xml。
  4. 编写web.xml。
  5. 修改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的一个例子(我认为很多人都应该碰到过)

需要做的事情:

  1. 编写User类。
  2. 编写UserAction类,并继承ActionSupport和实现ModelDriven接口。
  3. 修改struts.xml。
  4. 编写web.xml。
  5. 修改index.jsp,并编写ajax。
  6. 实验结果。
  7. 解决方案。

在开始之前需要导入一个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对象

  1. 在Action中获取request。
  2. 通过ServletActionContext类来获取。
  3. 通过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的格式。

需要做的事情:

  1. 创建User类。
  2. 创建UserAction并实现ModelDriven接口。
  3. 创建类型转换类,命名为DateConverter并继承StrutsTypeConverter类。
  4. 编写strtus.xml和web.xml。
  5. 编写index.jsp。
  6. 编写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,不像过滤器那么强大,什么都可以拦截。

几个内容:

  1. 登录验证拦截器。
  2. 默认的拦截器。
  3. 继承package的拦截器。
4.1、登录验证拦截器

下面几个步骤:

  1. 创建登录验证拦截器类。
  2. 创建UserAction类和User类。
  3. 创建struts.xml和web.xml。
  4. 编写index.jsp。
  5. 测试没有登录的情况访问不允许访问的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命名的两个点:

  1. 在Action包下创建ActionClassName-validation.xml,这是针对这个Action中的所有方法都验证!
  2. 在Action包下创建ActionClassName-ActionName-validation.xml,这是针对ActionName这个方法验证!

第5点的表单验证,我自己也没去玩过!都是直接用JavaScript和Action方法中的硬编码实现的。或者自定义一个工具类Utils,直接调用Utils的方法!


参考

黑马笔记,和百度了一些博客!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值