Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器(Controller)来建立模型与视图的数据交互 。Struts2一. Struts2 简介Struts2 是一个 MVC 开发模式的框架,用来处理用户请求,代替 Servlet 职责,是对 Servlet 的一种封装
二. MVC 开发模式(☆)MVC 开发模式是把视图代码与业务逻辑代码分离,通过控制层连接视图代码与业务逻辑代码
- Model:项目中的业务逻辑(业务领域),通常用 JavaBean 实现(dao层,service层)
- View:项目中的展现,通常用 JSP/HTML 实现
- Controller:项目中的控制层,通常用 Servlet 实现
- 开发模式:开发模式是一种编程思想,实现的目标
- 框架:框架就是开发思想的产物
- 设计模式:框架由设计模式实现
四. 搭建 Struts2 环境
struts-2.3.16.3包下面找到apps/struts2-blank.war空项目,解压一下项目,把项目中 lib 下的所有 jar 文件复制到自己项目中
- 在
struts2-blank项目中找到web.xml,把 Struts 核心过滤器复制到项目中,代码如下:
<!-- struts2 核心过滤器 --><filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping> - 在
struts2-blank项目中 src 下找到struts.xml文件,复制到自己项目中的 src 目录下
- 在
struts2-blank项目中 src 下找到log4j.properties文件,复制到自己项目中的 src 目录下
- 当服务器启动的时候,会读取
web.xml配置文件,实例化,初始化 struts2 的核心过滤器(StrutsPrepareAndExecuteFilter),核心过滤器会默认读取 src 根目录下的struts.xml配置文件,加载所有 action 信息
- 当客户端向服务器发送请求(action)时,该请求会被核心过滤器拦截,把请求的路径去
struts.xml文件中package标签namespace属性值和action标签name属性值相匹配,交给对应的 action 去处理,默认执行 execute 方法
- action 中方法执行完毕之后,会返回一个字符串给核心过滤器,核心过滤器去对应的
action标签中result标签的name属性值匹配对应的字符串,跳转页面
- 浏览器发送一个请求,会到达 Web 服务器 Tomcat,Tomcat 会接收请求
- Tomcat 会根据项目中的
web.xml配置判断请求是否符合 Struts2 的核心过滤器(StrutsPrepareAndExecuteFilter)的过滤路径,如果符合请求会交给 Struts2 处理
- Struts2 核心过滤器根据请求的 URL,在
sturts.xml中匹配处理 Action 的请求 URL =package标签namespace属性 +action标签的name属性
- 匹配上后会根据
action标签中的class属性匹配上一个 Action,action首先会实例化,默认调用execute方法 。Action是多实例、线程是安全的
- 执行完 execute 方法后,返回一个字符串,对应 Action 标签下的
result标签name属性
- 根据
result标签中的页面路径进行页面跳转,把内容呈献给浏览器端
- 在
struts.xml中配置扩展名的常量,代码如下:<constant name="struts.action.extension" value="https://tazarkount.com/read/do,action" />
- 在
web.xml中增加核心过滤器的过滤路径,代码如下:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern></filter-mapping><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.do</url-pattern></filter-mapping><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.xi</url-pattern></filter-mapping> - 在访问 URL 上增加
.后缀名<a href="https://tazarkount.com/read/hello/helloworld.action">测试Hello World!</a><a href="https://tazarkount.com/read/hello/helloworld.do">测试Hello World!</a>
- 属性接收(字段驱动)
- 把 input 框 name 属性作为 Action 类中的全局属性,并且生成 get 与 set 方法,就可以接收表单参数
- DynamicModel(动态模型)(☆)
- 把所有 input 框 name 属性封装成一个类中的属性
- 在 Action 中把参数对象作为全局属性,并且生成 get 与 set 方法
- 在 input 框 name 属性必须使用:参数对象名称 . 属性名称
- 把所有 input 框 name 属性封装成一个类中的属性
- ModelDriven(模型驱动)
- action 类实现一个 ModelDriven 接口,重写 getModel 方法返回参数类
- 在 input 框 name 属性不需要加上 对象名称 . 属性名称,参数类的 get 与 set 方法也不需要了(实体类中的属性名必须要和表单中 name 属性名一致,模型驱动可以和字段驱动联合使用)
- action 类实现一个 ModelDriven 接口,重写 getModel 方法返回参数类
九. 获取 WEB 元素(request、response)获取 request 有两种方式:
- 通过 ServletActionContext 类获取,代码如下:
HttpServletRequest request = ServletActionContext.getRequest();
- Action 类实现 ServletRequestAware 接口,重写 setServletRequest 方法,给全局 request 属性赋值
public class WebElementAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; @Override public void setServletRequest(HttpServletRequest request) {this.request = request; }}
- 通过 ServletActionContext 类获取,代码如下:
【Struts 2 学习笔记】HttpServletResponse response = ServletActionContext.getResponse();
- Action 类实现 ServletResponseAware 接口,重写 setServletResponse 方法,给全局 response 属性赋值
public class WebElementAction extends ActionSupport implements ServletResponseAware { private HttpServletResponse response; @Override public void setServletResponse(HttpServletResponse response) {this.response = response; }}
- 使用感叹号调用其他方法
- 在 struts.xml 中开启动态方法调用,代码如下:
<constant name="struts.enable.DynamicMethodInvocation" value="https://tazarkount.com/read/true" />
- 在访问 URL 后面:!方法名 . 后缀名
user/login!add.action
缺点:暴露了类中的方法名,不推荐使用
- 一个 Action 类中的方法对应一个 action 标签,代码如下:(推荐使用)
<action name="dynamicMethodAdd" class="com.zt.action.DynamicMethodAction" method="add"> <result name="success">/success.jsp</result></action> - 通配符
<package name="common"namespace="/" extends="struts-default"> <action name="*_*" class="com.zt.action.{1}Action" method="{2}"><result>/{1}_{2}.jsp</result></action></package>
<package name="all" extends="struts-default"><global-results><result name="success">/success.jsp</result></global-results></package>十三. OGNL 表达式OGNL 全称:Object Graph Navigation LanguageOGNL 表达式作用:简化页面代码,提高开发效率
OGNL 是一个强大的表达式,OGNL 只在 Struts2 中使用,离开 Struts2 框架就无效
Struts 标签库 == EL 表达式 + JSTL,使用 Struts 标签库必须经过 action,不然会抛异常
十四. Struts2 与 Ajax结合(☆)
- Struts2 与 Ajax 结合需要导入
struts2-json-plugin-2.3.16.3.jar
- Action 类中把字符串变量声明成全局变量,并且生成 set 与 get
- 在
struts.xml中做如下配置:
<!-- ajax --><!-- json-default 继承了 struts-default --><struts><package name="ajax" namespace="/ajax" extends="json-default"><action name="ajax" class="com.zt.action.AjaxAction"><result type="json"><!-- root 名称是固定写法,指定 JSON 字符串的变量名 --><param name="root">json</param></result></action></package></struts>
- Struts 的拦截器只能拦截 Action 类,在 Action 类之前之后做一系列动作
// Action 之前动作String result = invocation.invoke(); // 执行 Action// Action 之后动作 - 可插拔
需要的话就配置上,不需要就不配置
- 拦截器的创建
- 第一种:编写一个普通的 Java 类,实现 Interceptor 接口
- 第二种:编写一个普通的 Java 类,继承 AbstractInterceptor 类
- 第一种:编写一个普通的 Java 类,实现 Interceptor 接口
- 引用拦截器
- 所有的 action 都去默认引用拦截器
<default-interceptor-ref name="myStack"></default-interceptor-ref>
- 具体某一个 Action 去引用拦截器
<action name="authAction" class="com.ztkj.action.AuthAction"> <result name="success">success.jsp</result> <interceptor-ref name="loginInterceptor"></interceptor-ref></action> - 全局 result 的配置
<!-- 先从当前的 action 去匹配返回的字符串,若没找到,则去全局 result 里面匹配 --><global-results> <result name="noLogin" type="redirect">login.jsp</result> <result name="noAuth" type="redirect">noAuth.jsp</result></global-results>
- 所有的 action 都去默认引用拦截器
- 重量级:创建与销毁消耗较多资源(CPU与内存),依赖性比加强,替换很麻烦
- 轻量级:创建与销毁不需要消耗太多资源,独立性比较强,替换简单
本文来自博客园,作者:Schieber,转载请注明原文链接:https://www.cnblogs.com/xiqingbo/p/java-23.html
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
