Struts2(二)-Struts2之参数绑定和拦截器

来源:互联网 发布:知乎 大国崛起纪录片 编辑:程序博客网 时间:2024/05/19 18:46

表单页面: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对象。

原创粉丝点击