Struts2_1_基础案例_配置文件详解_动作类

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~~), 喜欢请点个赞哟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ 3362 Navigation Nightmare 带权并查集

题目大意&#xff1a;给定一些点之间的位置关系&#xff0c;求两个点之间的曼哈顿距离 此题土豪题。只是POJ也有一道相同的题&#xff0c;能够刷一下 别被题目坑到了&#xff0c;这题不强制在线。把询问离线处理就可以 然后就是带权并查集的问题了。。。将权值设为方向向量&…

怎样的人适合当码农?

1高中的时候&#xff0c;我一个友仔&#xff0c;他说要创办一个科技协会&#xff0c;然后跟我说电脑里面的代码都是0和1组成的&#xff0c;我现在还记得那天我们在学校开会的时候讨论电脑如何运行&#xff0c;我一脸痴呆的听他给我讲解电子知识&#xff0c;而且他后面自己做了一…

Struts2_2_解决配置文件冗余_动作类对象数据封装_数据类型转换_表单数据信息提示

Struts2第二天学习 解决struts.xml文件的冗余 将所有的配置文件放在一份struts.xml将会导致, 文件繁杂且容易出错, 将有如下的解决方案: 分文件编写Struts2的配置文件:对于具有类似功能的action就可以放入不同对应的xml文件中, 最后使用struts标签中的<include file"…

高版本号chrome安装flashplayer debuger后无法使用的问题

起因应该是苹果公司指出flash player的安全问题&#xff0c;还有各种原因导致google将在未来取消NPAPI的支持&#xff0c;所以fp们就悲剧了在高版本号chrome&#xff08;42以上&#xff09;默认是关闭外部安装的插件使用的&#xff0c; 所以在地址栏通过chrome://flags/#enable…

android 7.1 apk的systemuid [2]

1 上周发的一篇文章《android 7.1 apk的systemuid和系统应用Setting相同导致开机找不到库的问题》&#xff0c;然后有个小伙伴找我讨论了&#xff0c;觉得自己的脑洞了打开了很多&#xff0c;所以针对这个问题再次做一次总结&#xff0c;如果大家有好的建议也可以在文末留言。…

python连连看小游戏_python实现连连看游戏

编程一直是在课余时间&#xff0c;放假时间自学&#xff0c;到现在为止也有半年了。这是我自己用python实现的连连看&#xff0c;也是第一个完成的游戏&#xff0c;虽然极其简陋。思路呢&#xff0c;一开始是想要从一个点出发开始寻路&#xff0c;遇到数字就换一条路&#xff0…

Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL

Struts2国际化处理 浏览器根据当前的语言环境自动查找对应的语言环境资源包, 使jsp显示合适的语言数据环境 Struts2实现国际化, 动作类必须继承ActionSupport 创建资源包 资源包由多个properties文件组成, properties文件的文件名必须满足命名规范: 文件名_语言代码_国家代码…

RBAC 基于角色的访问控制

RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;&#xff0c;就是用户通过角色与权限进行关联。简单地说&#xff0c;一个用户拥有若干角色&#xff0c;每一个角色拥有若干权限。这样&#xff0c;就构造成“用户-角色-权限”的授权模型。…

C语言书籍大全

学习过linux的同学应该都知道&#xff0c;linux系统几乎都是用c编写&#xff0c;包括现在主流的android,ios系统&#xff0c;都是使用c编程。为了方便大家学习C语言&#xff0c;小编搜集整理了市面几乎所有的C语言书籍&#xff0c;下面给出部分比较有名的&#xff0c;在微信公众…

python子进程修改父进程内变量_如何将父变量传递给python中的子进程?

这里的简单答案是&#xff1a;不要使用subprocess.Popen,使用multiprocessing.Process.或者,更好的是,multiprocessing.Pool或concurrent.futures.ProcessPoolExecutor.使用子进程,程序的Python解释器根本不了解子进程;据它所知,子进程正在运行Doom.所以没有办法直接与它共享信…

设计模式_1_工厂模式与抽象工厂

工厂模式 工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行 主要解决接口选择问题,明确计划不同条件下执行创建不同实例 通过子类实现工厂实例,创建过程在其子类执行 优点:提高扩展性,屏蔽产品具体实现,调用者只关心产品…

android 7.1 apk的systemuid相同导致问题[2]

1上周发的一篇文章《android 7.1 apk的systemuid和系统应用Setting相同导致开机找不到库的问题》&#xff0c;然后有个小伙伴找我讨论了&#xff0c;觉得自己的脑洞了打开了很多&#xff0c;所以针对这个问题再次做一次总结&#xff0c;如果大家有好的建议也可以在文末留言。2先…

uasset python_Unreal Python 结合 C++ 开发蓝图库插件

本文章转载自 智伤帝的个人博客 - 原文链接前言上个月的这个时候我写了一篇文章关于如何嵌入 PySide 调用 Qt 的 GUI 开发。 链接Python 虽然很好&#xff0c;但是有些功能&#xff0c;并没有从 C 里面暴露出来。这种情况就需要通过 C 的蓝图开发来将这部分的功能进行暴露。这样…

设计模式_2_单例模式

单例模式 单例模式(创建型模式): 涉及到的单一的类,该类只负责自己对象的创建,并且只有单个对象被创建,提供唯一的对象访问方式,可直接访问 注: 只能有一个实例作为全局的访问点, 构造函数私有单例类只能自己创建自己唯一的实例, 必须给所有其他对象提供这一实例; !!!使用syn…

送书送书送书,(包邮)送,仅此而已!

亲爱的各位fans们&#xff0c;大家好&#xff0c;这次小编联合5个公众号朋友一起送书&#xff0c;一共送出 6本&#xff0c;当然包邮&#xff01;感谢本次活动的赞助商北京大学出版社。6个公众号联合送书&#xff0c;一共6本书&#xff0c;每个公众号送1本(包邮)。 6个公众号同…

Java多线程_1_Java内存模型_内存模型的3大特性

Java内存模型: 内存分布情况及其关系: 主内存:Java内存模型规定所有的变量都保存在主内存中 工作内存:每个线程都有自己的工作内存,保存了该线程使用到的变量的主内存副本拷贝 主内存与工作内存的关系: 线程对变量的所有操作都必须在自己的工作内存中进行,不能直接读写主内存…

requests 获取div_爬虫系列第五篇 使用requests与BeautifulSoup爬取豆瓣图书Top250

上一篇我们学习了BeautifulSoup的基本用法&#xff0c;本节我们使用它来爬取豆瓣图书Top250。一、网页分析我们爬取的网页的url是https://book.douban.com/top250?icnindex-book250-all。首页如图与豆瓣电影Top250差不多&#xff0c;将页面拉到最底部&#xff0c;可以看到分页…

python--socket套接字/TCP

socket套接字/TCP 一 客户端/服务器架构 C/S架构&#xff0c;包括 硬件C/S架构&#xff08;打印机&#xff09;软件C/S 架构&#xff08;web服务&#xff09;C/S架构的软件&#xff08;软件属于应用层&#xff09;是基于网络进行通信的Server端要&#xff1a; 1.力求一直提供服…

uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”

本文提供视频课程讲解&#xff0c;需要的小伙伴可以点赞私信‘’网络模块‘’前往领取学习大纲1、网络模块在应用中的地位1.1当今占统治地位的网络组件OKHttp OkHttp 是一个相对成熟的解决方案&#xff0c;据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHt…

luogu P1046 陶陶摘苹果

二次联通门 : luoguP1046 /*这个题好难.....由苹果树可知这应该是个树结构的题所以很自然的想到了用树链剖分来搞一下连边 最后查询以1为根节点的子树的权值和...从前闲的没事写着玩... */ #include <cstdio> #define Max 3300void read (int &now) {now 0;char wor…