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 进行授权