Struts2之Action接收请求参数和拦截器详解
发布时间 - 2026-01-11 01:02:01 点击率:次技术分析之在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
一些常用的方法如下
- static ActionContext getContext() -- 获取ActionContext对象实例
- java.util.Map<java.lang.String,java.lang.Object> getParameters() -- 获取请求参数,相当于request.getParameterMap();
- java.util.Map<java.lang.String,java.lang.Object> getSession() -- 获取的代表session域的Map集合,就相当于操作session域。
- java.util.Map<java.lang.String,java.lang.Object> getApplication() -- 获取代表application域的Map集合
- void put(java.lang.String key, java.lang.Object value) -- 注意:向request域中存入值。
3. 使用原生Servlet的API的方式(常用到)
Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法
具体的方法如下
- getPageContext()
- getRequest()
- getResponse()
- 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中查找。
- dispatcher -- 转发.type的默认值.Action--->JSP
- redirect -- 重定向. Action--->JSP
- chain -- 多个action之间跳转.从一个Action转发到另一个Action. Action---Action
- redirectAction -- 多个action之间跳转.从一个Action重定向到另一个Action. Action---Action
- stream -- 文件下载时候使用的
技术分析之Struts2框架的数据封装
1. 为什么要使用数据的封装呢?
- 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
- 封装数据为开发提供了很多方便
- 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中的某些方法进行拦截
- 拦截器不能拦截JSP
- 拦截到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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# struts2拦截action
# struts
# action
# 拦截器
# struts2
# action拦截器
# 修改request的parameter的几种方式总结
# Struts2源码分析之ParametersInterceptor拦截器
# java中的Struts2拦截器详解
# 解决struts2 拦截器修改request的parameters参数失败的问题
# 表单
# 象中
# 跳转
# 类中
# 多个
# 会有
# 就可以
# 必须要
# 两种
# 还需要
# 而过
# 第二种
# 第一种
# 自己的
# 方法如下
# 都是
# 包中
# 重定向
# 就不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何与Pusher实现实时通信?(WebSocket示例)
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何挑选优质建站一级代理提升网站排名?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
如何在云服务器上快速搭建个人网站?
EditPlus 正则表达式 实战(3)
使用C语言编写圣诞表白程序
,怎么在广州志愿者网站注册?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
制作电商网页,电商供应链怎么做?
高防服务器:AI智能防御DDoS攻击与数据安全保障
JS中对数组元素进行增删改移的方法总结
如何快速搭建高效WAP手机网站吸引移动用户?
iOS验证手机号的正则表达式
百度浏览器如何管理插件 百度浏览器插件管理方法
Laravel如何升级到最新版本?(升级指南和步骤)
网站制作壁纸教程视频,电脑壁纸网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何在宝塔面板中创建新站点?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
专业商城网站制作公司有哪些,pi商城官网是哪个?
详解jQuery中基本的动画方法
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
微信小程序 配置文件详细介绍
android nfc常用标签读取总结
详解Android中Activity的四大启动模式实验简述
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
php 三元运算符实例详细介绍
如何确保FTP站点访问权限与数据传输安全?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
如何快速搭建FTP站点实现文件共享?
如何在IIS中配置站点IP、端口及主机头?
Bootstrap CSS布局之列表
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
怎样使用JSON进行数据交换_它有什么限制
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧

