文章

struts2(拦截器和标签)

struts2(拦截器和标签)

拦截器

  • struts2里面封装的功能都是在拦截器里面
  • 拦截器在action对象创建之后,action的方法执行之前执行

原理

  • 第一个 aop思想(详情参考spring)
  • 第二个 责任链模式
  • 过滤链:一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器

登录拦截器

  • 写登录方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{

	
	//登录的方法
	public String login() {
		//1 得到request对象
		HttpServletRequest request = ServletActionContext.getRequest();
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//2 作业:查询数据库判断用户名和密码是否正确
		// 用户名 admin  密码 250
		if("admin".equals(username) && "250".equals(password)) {
			//成功
			//向session里面放值
			request.getSession().setAttribute("username", username);
			return "loginsuccess";
			
		} else {
			//失败
			return "login";
		}
	}
}
  • 写拦截器类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package cn.itcast.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * 拦截器类
 * @author asus
 *
 */
public class LoginInterceptor extends MethodFilterInterceptor {

	//这个方法里面写拦截器逻辑
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		// 判断session里面是否有名称是username的值
		// 得到session
		HttpServletRequest request = ServletActionContext.getRequest();
		Object obj = request.getSession().getAttribute("username");
		//判断
		if(obj != null) {
			//登录状态
			//做类似于放行操作,执行action的方法
			return invocation.invoke();
		} else {
			//不是登录状态
			//不到登录,不执行action的方法,返回登录页面
			//到result标签里面找到名称是login的值,到配置路径里面
			return "login";
		}
	}

}

  • 在要拦截的action标签所在的package标签里面声明拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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>

	<package name="demo" extends="struts-default" namespace="/">
		<!-- 1 声明拦截器 -->
		<interceptors>
			<interceptor name="loginintercept" class="cn.itcast.interceptor.LoginInterceptor"></interceptor>
		</interceptors>
		
		<action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}">
		
			<!-- 2 使用自定义拦截器,并且设置不进行拦截登录的action -->
			<interceptor-ref name="loginintercept">
				<!-- 配置action里面某些方法不进行拦截
					name属性值: excludeMethods
					值:action不拦截的方法名称
				 -->
				<param name="excludeMethods">login</param>
			</interceptor-ref>
			
			<!-- 3 把默认拦截器手动使用一次,为了能使用ModelDriven等接口 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
			
			<!-- 登录操作成功和失败后返回的页面 -->
			<result name="loginsuccess">/index.htm</result>
			<result name="login">/login.jsp</result>
		</action>
	</package>
</struts>
  • 把登录的按钮连接写为:localhost:8080/Demo/customer_login进行登录就可以了

标签库

  • 1 s:property: 和ognl表达式在jsp页面中获取值栈数据
  • 2 s:iterator: 获取值栈list集合数据,表示list集合
  • 3 s:debug: 查看值栈结构和数据

表单标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- <input type="radio" name="sex" value="女"/>女
	<input type="radio" name="sex" value="nan"/>男 -->
	
	<!-- <input type="checkbox" name="sex" value="女"/>女 -->
	
	<!-- form标签 -->
	<s:form>
		<!-- 1 普通输入项 -->
		<s:textfield name="username" label="username"></s:textfield>
		
		<!-- 2 密码输入项 -->
		<s:password name="password" label="password"></s:password>
		
		<!-- 3 单选输入项 -->
		<!-- value属性值和显示值一样的 -->
		<s:radio list="{'女','男'}" name="sex" label="性别"></s:radio>
		
		<!-- value属性值和显示值不一样的 -->
		<s:radio list="#{'nv':'女','nan':'男'}" name="sex1" label="性别"></s:radio>
		
		<!-- 4 复习输入项 -->
		<s:checkboxlist list="{'吃饭','睡觉','敲代码'}" name="love" label="爱好"></s:checkboxlist>
		
		<!-- 5 下拉输入框 -->
		<s:select list="{'幼儿园','博士后','教授'}" name="college" label="学历"></s:select>	
	
		<!-- 6 文件上传项 -->
		<s:file name="file" label="上传文件"></s:file>
		
		<!-- 7 隐藏项 -->
		<s:hidden name="hid" value="abcd"></s:hidden>
		
		<!--  文本域 --> 
		<s:textarea rows="10" cols="3" name="resume" label="简历"></s:textarea>
		
		<!-- 8 提交按钮 -->
		<s:submit value="提交"></s:submit>
		
		<!-- 9 重置 -->
		<s:reset value="重置"></s:reset>
	</s:form>
</body>
</html>
本文由作者按照 CC BY 4.0 进行授权