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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值