表单页面:user.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="test_*modelTest" method="post">
username: <input type="text" name="username"><br>
password: <input type="password" name="password"><br>
email: <input type="text" name="email"><br>
age: <input type="text" name="age"><br>
courseName: <input type="text" name="course.courseName"><br>
time: <input type="text" name="course.time"><br>
<input type="submit" value="submit">
</form><br/><br/>
</body>
</html>
Pojo类:
public class User {
private Integer id;
private String username;
private String password;
private String email;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + ", age="
+ age + "]";
}
public User() {
}
}
1.使用Servlet中的API
action方法:
@Override
public String execute() throws Exception {
System.out.println("方法执行了");
// 接收表单的参数:
// 使用的是Struts2中的一个对象ActionContext对象.
ActionContext actionContext = ActionContext.getContext();
// 接收参数:
Map<String,Object> paramsMap = actionContext.getParameters();
for (String key : paramsMap.keySet()) {
String[] value = (String[]) paramsMap.get(key);
System.out.println(key+" "+value[0]);
}
// 向request中存入数据 request.setAttribute(String name,Object value);
actionContext.put("requestName", "张三");
// 向session中存入数据 request.getSession().setAttribute(String name,Object value);
actionContext.getSession().put("sessionName", "李四");
// 向application中存入数据 this.getServletContext().setAttribute(String name,Object value);
actionContext.getApplication().put("applicationName", "王五");
//ServletActionContext使用getRequest方法得到request对象
HttpServletRequest request=ServletActionContext.getRequest();
//获得response对象
HttpServletResponse response=ServletActionContext.getResponse();
String name=request.getParameter("username");
response.getWriter().write("使用HttpServletRequest获取的response");
System.out.println("使用原生的Request获取到的表单的属性"+name);
return SUCCESS;
}
使用ActionContext 可以得到struts2中定义的request,session,application对象,这些对象和Servlet中定义的域对象用法大同小异,只不过存入数据直接使用put(key,value)方法,获取数据使用get(key)方法,和Map用法一样。
使用:
HttpServletRequest request=ServletActionContext.getRequest();
直接可以得到Servlet中原声的域对象。操作和Servlet中的API一样。
配置文件:
<action name="user" class="com.mq.web.GetServletAPItest" >
<!--firstAction的返回值为success的时候,则跳转到hello.jsp -->
<result name="success">/hello.jsp</result>
</action>
将表单的action改为user。
2.模型驱动获取参数
Action类需要实现ModelDriven接口,并且提供一个和表单对应的Pojo对象的属性。
Action类如下:
public class GetServletAPItest extends ActionSupport implements ModelDriven<User> {
//user类必须实例化
private User user = new User();
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
//使用模型驱动的方式获取参数
public String modelTest() {
System.out.println("模型驱动获取到的值"+user);
return SUCCESS;
}
}
配置文件:
<action name="test_*" class="com.mq.web.GetServletAPItest" method="{1}">
<!--firstAction的返回值为success的时候,则跳转到hello.jsp -->
<result name="success">/hello.jsp</result>
<result name="param">/getParam.jsp</result>
</action>
配置文件采用了通配符的方式。
提交表单后,user就会得到表单中的值,并且打印出来。
3.向页面传值
action方法:
public String putparam() {
User user=new User();
user.setAge(12);
user.setUsername("John");
user.setEmail("ehuwie@163.com");
//使用原生的Servlet的API向页面传值
ServletActionContext.getRequest().setAttribute("user", user);
return "param";
}
创建User后,使用原生的Servlet的API向页面传值
配置文件:
<action name="test_*" class="com.mq.web.GetServletAPItest" method="{1}">
<!--firstAction的返回值为success的时候,则跳转到hello.jsp -->
<result name="success">/hello.jsp</result>
<result name="param">/getParam.jsp</result>
</action>
配置文件使用了通配符的方式。
getParam.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>获取到的参数是</h2>
${user.username }<br>
${user.email }<br>
</body>
</html>
结果:
4.拦截器
相关概念:
1. 拦截器的概述
* 拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
* 过滤器:过滤从客服端发送到服务器端请求的
* 拦截器:拦截对目标Action中的某些方法进行拦截
* 拦截器不能拦截JSP
* 拦截到Action中某些方法
2. 拦截器和过滤器的区别
1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)
* 拦截器 采用 责任链 模式
> 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链
> 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行
* 在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )
定义拦截器:
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
String user = (String) session.get("user");
// 如果没有登陆,即用户名不存在,都返回重新登陆
System.out.println("user:"+user);
if (user != null) {
System.out.println("test");
return invocation.invoke();
}
//如果为空,则返回重新登录
System.out.println("你还没有登录");
return Action.LOGIN; //返回一个叫login的result结果
}
}
该拦截器实现登录校验的功能,如果session中存在user对象,那么已经登录,放行。否则跳转到登录界面。
action方法:
public String interceptorTest() {
System.out.println("拦截器");
return SUCCESS;
}
拦截器配置:
<package name="demo2" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="com.mq.web.MyInterceptor"/>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"/>
<!-- 必须要手动引入默认栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="interceptor" class="com.mq.web.GetServletAPItest" method="interceptorTest">
<result name="success">/hello.jsp</result>
<!-- 引入拦截器栈 -->
<interceptor-ref name="myStack"/>
</action>
</package>
注意,拦截器栈中必须要有必须要有。
5.其他
所有的Action类都是多例的,来一个请求就会新建一个Action对象。