Struts2之Action接收请求参数和拦截器详解

技术分析之在Struts2框架中使用Servlet的API

1. 在Action类中也可以获取到Servlet一些常用的API

需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上。

提供JSP注册的页面,演示下面这三种方式

 <h3>注册页面</h3>
        <form action="${ pageContext.request.contextPath }/xxx.action" method="post">
          姓名:<input type="text" name="username" /><br/>
          密码:<input type="password" name="password" /><br/>
          <input type="submit" value="注册" />
        </form>

2. 完全解耦合的方式

如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API

一些常用的方法如下

  1. static ActionContext getContext()                                                      -- 获取ActionContext对象实例
  2. java.util.Map<java.lang.String,java.lang.Object> getParameters()          -- 获取请求参数,相当于request.getParameterMap();
  3. java.util.Map<java.lang.String,java.lang.Object> getSession()               -- 获取的代表session域的Map集合,就相当于操作session域。
  4. java.util.Map<java.lang.String,java.lang.Object> getApplication()           -- 获取代表application域的Map集合
  5. void put(java.lang.String key, java.lang.Object value)                           -- 注意:向request域中存入值。

3. 使用原生Servlet的API的方式(常用到)

Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法

具体的方法如下

  1. getPageContext()
  2. getRequest()
  3. getResponse()
  4. getServletContext()

技术分析之结果页面的跳转

1. 结果页面存在两种方式

全局结果页面

> 条件:如果<package>包中的一些action都返回success,并且返回的页面都是同一个JSP页面,这样就可以配置全局的结果页面。

> 全局结果页面针对的当前的包中的所有的Action,但是如果局部还有结果页面,会优先局部的。使用的标签是

 <global-results>
  <result>/demo3/suc.jsp</result>
 </global-results>

局部结果页面

<result>/demo3/suc.jsp</result>  

2. 结果页面的类型

结果页面使用<result>标签进行配置,包含两个属性

> name    -- 逻辑视图的名称

> type    -- 跳转的类型,值一些,需要掌握一些常用的类型。常见的结果类型去struts-default.xml中查找。

  1. dispatcher        -- 转发.type的默认值.Action--->JSP
  2. redirect            -- 重定向.    Action--->JSP
  3. chain                -- 多个action之间跳转.从一个Action转发到另一个Action.    Action---Action
  4. redirectAction    -- 多个action之间跳转.从一个Action重定向到另一个Action.    Action---Action
  5. stream            -- 文件下载时候使用的

技术分析之Struts2框架的数据封装

1. 为什么要使用数据的封装呢?

  1. 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
  2. 封装数据为开发提供了很多方便
  3. Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装了!!

2. Struts2中提供了两类数据封装的方式?

第一种方式:属性驱动

> 提供对应属性的set方法进行数据的封装。

表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。

表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。

注意0:Struts2的框架采用的拦截器完成数据的封装。

注意1:这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.

注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。

> 在页面上,使用OGNL表达式进行数据封装。

在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中。

在页面中定义一个JavaBean,并且提供set方法:例如:private User user;

页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.username">

注意:只提供一个set方法还不够,必须还需要提供user属性的get和set方法!!!

> 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来,

/**
属性驱动方式,把数据封装到JavaBean的对象中
@author Administrator
 */
public class Regist2Action extends ActionSupport{

  private static final long serialVersionUID = 6556880331550390473L;

  // 注意二:属性驱动的方式,现在,要提供是get和set方法
  private User user;
  public User getUser() {
    System.out.println("getUser...");
    return user;
  }
  public void setUser(User user) {
    System.out.println("setUser...");
    this.user = user;
  }

  public String execute() throws Exception {
    System.out.println(user);
    return NONE;
  }

}

第二种方式:模型驱动

> 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!

> 编写的页面不需要任何变化,正常编写name属性的值

> 模型驱动的编写步骤:

手动实例化JavaBean,即:private User user = new User();

必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可!!

/**
模型驱动的方式
  实现ModelDriven接口
 必须要手动实例化对象(需要自己new好)
@author Administrator
 */
public class Regist3Action extends ActionSupport implements ModelDriven<User>{

  private static final long serialVersionUID = 6556880331550390473L;

  // 必须要手动实例化
  private User user = new User();
  // 获取模型对象
  public User getModel() {
    return user;
  }

  public String execute() throws Exception {
    System.out.println(user);
    return NONE;
  }

}

技术分析之Struts2把数据封装到集合中

1. 封装复杂类型的参数(集合类型 Collection 、Map接口等)

2. 需求:页面中有可能想批量添加一些数据,那么现在就可以使用上述的技术了。把数据封装到集合中

3. 把数据封装到Collection中

因为Collection接口都会有下标值,所有页面的写法会有一些区别,注意:

<input type="text" name="products[0].name" />

在Action中的写法,需要提供products的集合,并且提供get和set方法。

4. 把数据封装到Map中

Map集合是键值对的形式,页面的写法

<input type="text" name="map['one'].name" />

Action中提供map集合,并且提供get和set方法

代码:

/**
属性驱动的方式,把数据封装到map集合中
@author Administrator
 */
public class Regist5Action extends ActionSupport{

  private static final long serialVersionUID = 6556880331550390473L;

  private Map<String, User> map;
  public Map<String, User> getMap() {
    return map;
  }
  public void setMap(Map<String, User> map) {
    this.map = map;
  }

  public String execute() throws Exception {
    System.out.println(map);
    return NONE;
  }

}

案例总结之Struts2的拦截器技术

1. 拦截器的概述

拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)

过滤器:过滤从客服端发送到服务器端请求的

拦截器:拦截对目标Action中的某些方法进行拦截

  1. 拦截器不能拦截JSP
  2. 拦截到Action中某些方法

2. 拦截器和过滤器的区别

1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的

2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器

3)拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)

拦截器 采用 责任链 模式

> 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链

> 责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行

在struts2 中可以定义很多个拦截器,将多个拦截器按照特定顺序 组成拦截器栈 (顺序调用 栈中的每一个拦截器 )

3. Struts2的核心是拦截器,看一下Struts2的运行流程

自定义拦截器和配置

1. 编写拦截器,需要实现Interceptor接口,实现接口中的三个方法

 protected String doIntercept(ActionInvocation invocation) throws Exception {
      // 获取session对象
      User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
      if(user == null){
        // 说明,没有登录,后面就不会执行了
        return "login";
      }
      return invocation.invoke();
    }

 2. 需要在struts.xml中进行拦截器的配置,配置一共有两种方式

 <!-- 定义了拦截器 第一种方式
    <interceptors>
      <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/>
    </interceptors>
    -->

    <!-- 第二种方式:定义拦截器栈 -->
    <interceptors>
      <interceptor name="DemoInterceptor" class="com.itheima.interceptor.DemoInterceptor"/>
      <!-- 定义拦截器栈 -->
      <interceptor-stack name="myStack">
        <interceptor-ref name="DemoInterceptor"/>
        <interceptor-ref name="defaultStack"/>
      </interceptor-stack>
    </interceptors>

    <action name="userAction" class="com.itheima.demo3.UserAction">
      <!-- 只要是引用自己的拦截器,默认栈的拦截器就不执行了,必须要手动引入默认栈
      <interceptor-ref name="DemoInterceptor"/>
      <interceptor-ref name="defaultStack"/>
      -->

      <!-- 引入拦截器栈就OK -->
      <interceptor-ref name="myStack"/>
    </action>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • struts2通过action返回json对象

    其实struts2通过action返回json挺简单的,但是就是老要忘,所以索性写在博客上.好的,开始. 首先是引入必须的jar包: struts2-json-plugin-2.3.24.jar 然后我们再写一个简单的action package com.mz.action; import com.mz.entity.User; import com.opensymphony.xwork2.ActionSupport; public class JsonAction extends Action

  • 关于struts2中Action名字的大小写问题浅谈

    前言 今天在使用struts框架编写Action类以及在jsp中写调用相关Action的url时出现如下错误: There is no Action mapped for namespace [/] and action name [MainPage] associated with context path [/xxx]. - [unknown location] 记得以前也曾经遇到过这样的错误,可能的原因有: 1,struts.xml文件中配置package时,namespace写错: 2,

  • Struts2 ActionContext 中的数据详解

    ActionContext ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters, locale等.Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext.因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,也正是由于这个原因,使用者不用

  • 详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象.如果想在Struts2程序中用到这两个对象,也有解决方法 Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,能更轻松的测试该Action.但如何访问? Web应

  • Struts2中异常处理机制分析

    因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理. 为了使用Struts2的异常处理机制,必须打开Struts2的异常映射功能,这需要exception拦截器.在struts-default.xml文件中已经开启了exception拦截器. 声明式异常捕捉 Struts2的异常处理机制是通过在struts.xml文件中配置<exception-mapping--/>元素完成的,配置

  • Struts2之Action接收请求参数和拦截器详解

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上. 提供JSP注册的页面,演示下面这三种方式 <h3>注册页面</h3> <form action="${ pageContext.request.contextPath }/xxx.action"

  • SpringMVC中的拦截器详解及代码示例

    本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: /

  • java中的Struts2拦截器详解

    最近在学习struts的拦截器,现在来总结一下. 1.拦截器是什么? 拦截器相当于过滤器:就是将不想要的去掉,想要的留下.拦截器抽象出一部分代码可以用来完善原来的action.同时可以减轻代码冗余,提高重用率.通俗地讲就是一张网,过滤掉不需要的沙子,留下水. 2.拦截器的作用: 拦截器可以构成特定的功能.比如权限认证.日志记录和登陆判断. 3.拦截器的原理: 其每一个Action请求都在拦截器中,每一个action可以将操作转交给下面的拦截器,也可以直接退出到界面上. 4.定义拦截器: (1)自

  • Java SpringBoot拦截器详解

    目录 1. 拦截器 2. 拦截器使用 2.1 准备工作 2.2 Controller 2.3 Interceptor 2.4 Config 2.5 测试 2.5.1 正常登录 2.5.2 非正常登录 2.5.3 拦截器 3. 总结 1. 拦截器 在 Spring Boot 可以可以在以下情况执行操作: 在将请求发送到控制器之前在将响应发送给客户端之前 2. 拦截器使用 下面实现一简单的登录验证功能. 2.1 准备工作 Step1:在前端页面添加thymeleaf支持: <html lang=&quo

  • SpringMVC拦截器详解

    目录 web.xml文件 springMVC配置文件: controller类: 第一个拦截器配置: 第二个拦截器: 总结 web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst

  • 详解SpringMVC——接收请求参数和页面传参

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name") String pass = request.getParameter("pass") } 2,Spring会自动将表单参数注入到方

  • Action获取请求参数的三种方式

    方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被自动封装 到该几个属性中. 方式二:创建独立的Model对象,还是通过属性注入的方法将请求数据封装到Model对象中 具体为:另外创建一个专门的类,并在其中添加几个和请求参数名相同的属性,,此时,在表单中,需要讲参数名, 写成Model的一个具体对象名.参数名的方式,然后在Action中,需要定义一

  • axios全局请求参数设置,请求及返回拦截器的方法

    应用场景: 1,每个请求都带上的参数,比如token,时间戳等. 2,对返回的状态进行判断,比如token是否过期 代码如下: axios.interceptors.request.use( config => { var xtoken = getXtoken() if(xtoken != null){ config.headers['X-Token'] = xtoken } if(config.method=='post'){ config.data = { ...config.data, _

  • 快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    一:遇到个跨域调用,因为传个我的参数不定,所以需要通过map来接收参数并进行签名验证等操作 理所当然的写出了下面的代码,但是发现map里并没有获取到传来的key-value值 @RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8") @ResponseBody public String callback(@RequestBody Map<String, String&

  • Java struts2请求源码分析案例详解

    Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core

随机推荐