Struts2简要概述

  • 三层架构中的表现层框架
  • 相对于常规的MVC模式, 其核心为Filter控制器
  • 内部的Filter实例是在客户端每发送一次就实例化一次, 相比于Servlet具有线程安全性
  • 内部控制器默认拦截以.action或无后缀名的url

Struts2案例步骤

  • 配置web.xml, 由于Struts2核心为Fiter, 所以需要在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>/*</url-pattern>
</filter-mapping>
<!-- StrutsPrepareAndExecuteFilte代表struts2的核心控制器-->
  • 建立addUser.jsp文件: 在addUser.jsp中处理用户的操作请求
例如: <a href="${pageContext.request.contextPath}/addUser.action">添加用户</a>
  • 配置struts.xml
例如: <struts><package name="p1" extends="struts-default"><action name="addUser" class="com.strutstest.action.DemoAction" method="addUser"><result name="success">/success.jsp</result></action></package></struts>
  • 建立动作类与动作方法
//例如:
public class DemoAction extends ActionSupport{public String addUser(User user){if(user != null){userList.add(user);return SUCCESS; //ActionSupport中的字符串常量, 代表"success"}else{System.out.println("user == null");return ERROR; //ActionSupport中的字符串常量, 代表"error"}}
}
  • 结果视图: 如果用户添加操作正确, 返回"success"至result中, 将会请求转发至success.jsp中, 操作失败不做任何转发操作

上述案例执行过程

  • 如下整个过程
 - 加载web.xml- 实例化并初始化过滤器; 与web.xml同时发生- 由StrutsPrepareAndExecuteFilte加载struts.xml, 加载时间优先于web.xml- 客户端发送addUser.action的请求- 请求到达过滤器- 由过滤器拦截该请求, 在struts.xml中查找对应的namespace- 6中操作成功后, 获得动作名称addUser, 然后在struts.xml中查找对应的action name; 若操作失败, 重新遍历整个root, 如果还未找到则报404- 根据struts.xml中action标签中的class属性去工程中查找对应的动作类- 找到动作类后, 调用动作方法, 获得方法返回值, 根据返回值查找对应的jsp界面

Struts2配置文件的加载过程

  • 加载时机
在应用加载的时候加载, 在应用运行过程中只加载一次
  • 加载顺序
 - default.properties //系统默认配置文件, 不可修改- struts-default.xml //struts2的核心配置, 不可修改- struts-plugin.xml //不可修改- struts.xml //当前应用, 可修改- struts.properties //当前应用, 可修改- web.xml //当前引用
注:- 具有多个配置文件的时候,且配置文件参数相同, 后一个的配置文件信息会覆盖前一个配置文件的信息- 使用系统默认的拦截器的时候, 拦截器总是执行两遍; 执行过程:  正向一遍-> 将结果反馈到jsp中-> 然后反向一遍

Struts2提供的常量

下面列举常用常量:

  • struts.i18n.encoding 默认编码utf-8
  • struts.multipart.parser 指定文件上传组件,默认jakarta
  • struts.multipart.maxSize 默认值:2097152 文件上传总文件大小限制:2M
  • struts.action.extension 默认为"action"或者为空 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔, 可以加空格表示没有后缀
  • struts.enable.DynamicMethodInvocation 默认false 是否允许动态方法调用
  • struts.devMode 默认false 是否是开发模式, 进入开发者模式, 修改Struts.xml无需重启服务器

常量覆盖方式

  • 使用< constant name=“常量名” value=“值”></ constant>

Struts.xml文件主要标签及属性

  • package: 配置文件的分包管理, 与java中的package一致
内部属性:1. name: 包名, 必须写且唯一2. extends: 默认继承struts-default包(类似于java中Object), 提供Struts2核心功能3. namespace: 名称空间, 名称空间 + 动作名称 = 访问路径4. abstract: 声明当前包为抽象包, 没有action标签的包都可以是抽象包
例:<package name="p1" extends="struts-default" namespace="/a"></package>
注: namespace没有写的情况下使用默认提供的命名空间及""(表示空串)
记住: namespace的查找是在整个root下寻找, 而action的查找只在所有的满足条件的namespace下查找(感觉自己都讲不清楚, 版面太小无法叙述)
  • action: 配置动作行为, 表示用户执行的动作
内部属性:1. name: 动作名称2. class: 动作类, 默认动作类com.opensymphony.xwork2.ActionSupport(在Struts-default中定义)3. method: 动作类中包含的动作方法, 用于执行用户动作请求, 默认public String execute(){}
例:<action name="addUser" class="com.strutstest.action.DemoAction" method="addUser"></action>
注: 动作方法必须满足: public, 返回值String, 无参数;为了满足动作方法的灵活调用, 避免写死代码, 所以使用通配符代替属性参数, 或者通过动态调用.例如:通配符:<action name="*" class="com.strutstest.action.DemoAction" method="{1}"><result name="success">/{1}.jsp</result></action>"*"代表用户要执行的操作, {1}代表截取用户操作的名称(此时动作方法中也要具有相同名称的动作方法, 跳转的页面也要具有相同的动作名称)动态调用:在index.jsp中我们写的操作链接如下:注: 在动态方法调用之前要修改default中常量值, 保证可以使用动态方法调用, 如下的<constant><a href="${pageContext.request.contextPath}/user/user!addUser.action">在struts.xml中action对应的写法是:<constant name="struts.enable.DynamicMethodInvocation" value="true"><package name="user" extends="struts-default" namespace="/user"><action name="user" class="com.strutstest.action.DemoAction"><result name="success">/success.jsp</result></action></package>当执行动态调用的时候就是反射截取user!addUser.action中"!"后面的addUser
  • result: 结果视图, 获得动作方法反馈后进行页面跳转或显示
内部属性:1. name: 逻辑视图名称2. type: 跳转类型, 取值在struts-default.xml中有介绍, 但也可以自定义type类型注:type 常用取值: dispatcher(默认值, 请求转发), redirect(页面重定向), redirectAction(动作重定向), chain(动作请求转发);动作请求转发可以在相同或不同名称空间转发例:chain: 转发到另一个动作同包下直接使用: <result name=”success” type=”chain”>action2</action>不同包使用: <result name=”success” type=”chain”> //触发Servle****Result的类, 获取namespace与actionName的值, 确定转发的空间与动作<param name=”namespace”>/n2<param> <param name=”actionName”>action3<param></result>redirectAction: 重定向到另一个动作同包下与chain操作一直, 直接type=”redirectAction”不同包下与chain一致, 将type修改即可3. param: 当需要转发到不同包下的动作, 当需要自定义结果视图使用param修改内部参数注: 通过反射机制获取setter方法, 将param中参数通过依赖注入对结果类参数进行修改4. 自定义结果类型: 让自定义的javaBean实现com.opensymphony.xwork2.Result接口或者继承该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport重写doExecute方法, 执行自定义的结果视图

动作类的3中书写方式

  • 直接写一个简单的JavaBean, 不推荐使用, 可操作性太低
  • 写一个实现com.opensymphony.xwork2.Action接口的类
此接口提供默认的动作方法execute()以及默认的动作返回值( SUCCESS, ERROR, INPUT, LOGIN, NONE)
  • 动作类继承com.opensymphony.xwork2.ActionSupport类

动作类中访问Servlet的API

  • 使用ServletActionContext类
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSessionContent session = request.getSession(); //session不能使用ServletActionContext获得
  • 通过实现接口获得
动作类实现ServletRequestAware, ServletResponseAware
重写接口方法即可获得对应的request, response

有问题请指教(我会很O(∩_∩)O~~), 喜欢请点个赞哟!!!

Struts2_1_基础案例_配置文件详解_动作类相关推荐

  1. ELKElasticSearch5.1基础概念及配置文件详解【转】

    1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...

  2. Spring Boot 2.x基础教程:配置文件详解

    在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的Spring应 ...

  3. Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

    Hibernate( ORM框架 ) Hibernate是一个数据持久化层的ORM框架. 它通过JavaBean, 数据库中的表与自身的映射关系达到表中数据的增删改查 特性 1.对JDBC访问数据库的 ...

  4. mysql mha配置文件详解_十四、MySQL MHA 高可用配置(一)

    MHA 高可用 1.准备三台机器 IP:10.0.0.51 主机名:db01 内存:2G IP:10.0.0.52 主机名:db02 内存:2G IP:10.0.0.53 主机名:db03 内存:2G ...

  5. Java基础三个排序详解_继承粗解语法关键字分析

    集合存放数据的容器,存放的数据可以是基本类型也可以是引用类型,数据类型必须一致,存放数据的空间是连续的即地址连续,长度固定 声明数组变量 首先必须声明数组变量,才能在程序中使用数组.下面是声明数组变量 ...

  6. 0.96寸_OLED_屏幕_SSD1306_IIC通信_入门教程_指令详解_驱动介绍_笔记分享_初学者易懂

    目录 一.简介 1:总结 2:屏幕介绍 二.基本使用流程 1_介绍: 2_流程:(省略了应答) 三.指令集 1.基础指令 1:设置对比度(亮度)(81H + A[7:0]) 2:设置全屏全亮(A4H. ...

  7. 基于Spring Security的认证授权_应用详解_自定义退出_Spring Security OAuth2.0认证授权---springcloud工作笔记130

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个就简单了.配置一下就完事

  8. 基于Spring Security的认证授权_应用详解_会话管理_Spring Security OAuth2.0认证授权---springcloud工作笔记129

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们再去看一下这个springsecurity中的会话. 我想在这个登录成功的地方,把用户名打 ...

  9. vuecli 编译后部署_基于vue-cli 打包时抽离项目相关配置文件详解

    前言:当使用vue-cli进行开发时时常需要动态配置一些设置,比如接口的请求地址(axios.defaults.baseURL),这些设置可能需要在项目编译后再进行设置的,所以在vue-cli里我们需 ...

最新文章

  1. MySQL性能测试工具sysbench的安装和使用
  2. Quzrtz.net 示例
  3. 力扣: 88. 合并两个有序数组
  4. OpenStack Days走进北京 主角是用户
  5. php 开启 pathinfo,nginx下PHP开启pathinfo模式
  6. C# Console类学习笔记
  7. mysql装完是什么样儿的_Win7系统安装MySQL之后找不到指定文件与服务如何解决?...
  8. python开发cms_基于Django的Python CMS---wagtail介绍
  9. 正则表达式-验证手机号与邮箱
  10. 方差、标准差、协方差概念与意义梳理
  11. Mac查看本地ip地址
  12. iic的SDA引脚偶尔有毛刺(尖峰)是怎么回事。
  13. 吐血整理!程序员常见的几种变现方式!
  14. AT1983 [AGC001E] BBQ Hard
  15. 数据库设计--实体关系图(ERD)
  16. 一年涌入3000家“他经济”现资本众生相
  17. 自定义一组基函数的最佳平方逼近——matlab实现
  18. 秦始皇焚书坑儒只因曾被算命先生忽悠?
  19. uniapp 一键登录
  20. Python练习题2.2计算分段函数

热门文章

  1. 网络管理人员的未来?
  2. linux设置开机自启 etc rt.d,Linux下禁止服务开机自启动
  3. 计算机科学与技术考研课程安排,计算机科学与技术(0812)硕士研究生培养方案(一)...
  4. Python查看、修改pip install 默认使用的pip库
  5. java 代码重用_Java 代码重用:功能与上下文重用
  6. php 计算数据偏离度,关于偏离度的测算方法
  7. click传值vue_对vue下点击事件传参和不传参的区别详解
  8. Springboot 使用Mybatis对postgreSQL实现CRUD
  9. Kotlin——初级篇(二):变量、常量、注释
  10. Confluent Platform 3.0支持使用Kafka Streams实现实时的数据处理(最新版已经是3.1了,支持kafka0.10了)...