Struts2 学习(二)
一、Struts2 配置文件
1、配置多个配置文件
在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。
为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。
下面的struts.xml通过<include>元素指定多个配置文件:
<struts>
<include file="struts-part1.xml"/>
<include file="struts-part2.xml"/>
</struts>
2、Struts2中的6大配置文件
Struts2框架按照如下顺序加载struts2配置:
1、default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面:包含了Struts2的默认常量配置。

2、struts-default.xml 该文件保存在 struts2-core-2.3.7.jar 包含了框架依赖的对象配置和结果类型,拦截器等配置。

3、struts-plugin.xml 该文件保存在Struts2框架的插件中:struts-Xxx-plugins-2.3.7.jar 由插件提供。
注意:上述三个文件是框架自带的,我们不能修改,只能使用。
4、struts.xml 该文件是web应用默认的struts配置文件。重点:配置自定义的Action和其他信息。
5、struts.properties 该文件是Struts的默认配置文件,可以修改default.properties 的常量配置。
6、web.xml 该文件是Web应用的配置文件。
注意:上述三个文件是我们可以修改操作的。
如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值。
一般我们只在struts.xml中做常量配置。
<constant name="struts.action.extension" value="action,itsource,do,,"/>
3、常见的常量配置
1、指定默认编码集,作用相当于 HttpServletRequest 的 setCharacterEncoding方法 和 freemarker 、velocity 的输出:
<constant name="struts.i18n.encoding" value="UTF-8"/>
2、该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.action.extension" value="action,,"/>
3、设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭。
<constant name="struts.serve.static.browserCache" value="false"/>
4、当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开。
<constant name="struts.configuration.xml.reload" value="true"/>
5、开发模式下使用,这样可以打印出更详细的错误信息。
<constant name="struts.devMode" value="true" />
修改struts.xml之后,不用重启Tomcat。
6、默认的视图主题。
<constant name="struts.ui.theme" value="simple" />
7、是否支持动态方法调用。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
4、package,action,result 配置
1、<package>元素:
是<struts>根元素的子元素.。
<package name="" extends="" namespace="" abstract=""></package>
用来对多个<action>元素分类管理,和Java中的package没有关系。
常见的属性:
name:表示<package>的名字,但是要保证不同的<package>元素的name不同。 可以通过该名字被其他的包所指代。
extends:表示当前<package>继承哪一个<package>,一般都是:struts-default。而struts-default其实就是struts-default.xml中<package>元素的名字。继承struts-default之后,就拥有了该<package>定义的所有资源。(结果返回类型,拦截器..)
namespace:表示命名空间,一般的以"/"打头,命名一般以模块名,如: /hello, /oa. 和<action>的name决定了一个Action类的访问路径。
abstract:抽象的,缺省值是false。 若一个<package>的abstract="true",那么该<package>中就不能再定义<action>元素,只能用来被继承。
在应用中可以有多个模块。而多个模块之间有共同的基础配置。
<package name="basePkg" extends="struts-default" namespace="/" abstract="true">
<!-- 公共的基础配置信息 -->
</package>
<package name="oa" extends="basePkg" namespace="/oa">
<!-- OA相关的配置 -->
</package>
<package name="station" extends="basePkg" namespace="/station">
<!-- CRM相关的配置 -->
</package>
2、<action>元素:
是<package>元素的子元素。专门用来配置Action对象的。
<action name="" class="" method=""/>
常见的属性:
name:action的名称,在同一个<package>中,action的名字必须唯一,和<package>的namespace共同决定了一个Action类的访问路径。
注意:action的name值不能以"/"打头。
class:一个Action类的全限定名。缺省值:ActionSupport类。
method:当前Action动作访问的方法, 缺省值:execute。
<action name="hello" class="com.struts2.action.HelloAction" method="execute">
<!--结果集,即action中成功返回的视图-->
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
3、<result>元素:
配置结果视图。
<result name="" type="">路径</result>
局部结果视图:<result> 定义在 <action> 中。
全局结果视图:<result> 定义在 <global-results> 中,而 <global-results> 在 <package> 中。
<package name="oa" extends="basePkg" namespace="/oa">
<global-results>
<result></result>
</global-results>
</package>
常见的属性:
name:Action方法返回的逻辑视图名称,缺省值:success
type:结果的跳转类型。该类型的值在struts-default.xml中已经预定义好了。缺省值:dispatcher。
常见的type值(结果类型):
dispatcher:表示从Action请求转发到页面(JSP)。
redirect:表示从Action重定向到页面(JSP)。
chain:表示从Action请求转发到另一个Action。
redirectAction:表示从Action重定向到另一个Action。
stream:表示返回流。文件下载时使用。
<param name="">表示参数:name缺省值:location(地址)。
5、Action类的三种编写方式
1、第一种,使用公共的POJO类作为Action。提供公共的无参数的Action方法。(不推荐)
缺点:
1、没有一种方式约束Action方法必须是公共的无参数的。
2、Action方法的返回逻辑视图名可以自定指定。有时起名不规范。比如:"ooxx"。
public class ConfigAction {
public String list(){
return "success";
}
}
2、第二种,定义一个类,实现于com.opensymphony.xwork2.Action接口。并覆写execute方法即可。(不推荐)
Action接口中,不仅提供了Action方法的声明,也提供了常用的逻辑视图名称:
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
缺点:
1、不支持国际化,数据校验,消息机制。
public class ConfigAction implements com.opensymphony.xwork2.Action {
public String list(){
return SUCCESS;
}
}
3、第三种,定义一个类,继承于com.opensymphony.xwork2.ActionSupport类。(推荐)
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {}
public class ConfigAction extends com.opensymphony.xwork2.ActionSupport {
public String list(){
return SUCCESS;
}
}
4、真实开发中,我们却往往再提供一个BaseAction类。
ActionSupport。
---BaseAction(自定义Action的基类)
-----AAction
-----BAction
6、Action 中多方法调用
Action 中多个Action方法会造成 <action> 配置的臃肿。
1、DMI:动态方法调用 :官方不推荐。
格式:action名!方法名
比如:emp!edit emp!list
在Struts2新的版本中,默认的关闭了DMI,若我们需要使用DMI,就需要配置常量,启用动态方法调用。
此时:<action/> 元素不需要指定 method 属性值。
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
2、使用通配符的方式类配置: 通配符:*
<action name="emp_*" class="cn.itsource.manymethod.EmployeeAction" method="{1}">
Action的名字:emp_Action方法:比如:emp_list,那么{1}的值就是list。
emp_edit,那么{1}的值就是edit。
两个通配符:
<action name="*_*" class="cn.itsource.manymethod.{1}Action" method="{2}">
Action名字:Action类名_Action方法.。比如:Employee_list,表示调用的 EmployeeAction 中的 list 方法。
比如:Department_edit,表示调用 DepartmentAction 中的 edit 方法。
Struts2 学习(二)的更多相关文章
- Struts2学习二----------访问Servlet API
© 版权声明:本文为博主原创文章,转载请注明出处 Struts2提供了三种方式去访问Servlet API -ActionContext -实现*Aware接口 -ServletActionConte ...
- struts2学习二:Tomcat的部署目录和访问路径问题
1:idea中配置tomcat后,那么最终的web工程发布到哪里去了?为什么在访问路径中不加工程名就可以访问? 1.1:因为tomcat有段时间没接触了,先回顾下tomcat的目录结构吧? 如图所示: ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)
Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
随机推荐
- jquery遍历-filter()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PL/SQL数据开发那点事
PL/SQL开发那点事----->PL/SQL开发过程中异常处理 用户编写的PL/SQL块在执行过程中不可避免地要发生一些错误. 这里涉及的错误并不是由于程序的语法错误引起的,而是因为处理的数据 ...
- Angular2 内置指令 NgFor 和 NgIf 详解
http://www.jb51.net/article/89781.htm 在这一章节中,我们来学习如何使用Angular2来展示数据,以及如何使用它的内置指令NgFor和NgIf 首先要确保你有一个 ...
- CentOS7-Minimal1708安装设置python3
使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下,切换到该目录下执行 ll ...
- 移动端一个奇怪的触摸bug
这两天遇到一个很奇怪的bug,在移动端,一个页面里所有的input框都不能点击,我查了一下,里面的没有设置readonly属性,只要页面滚动一下就可以用了,而且,只要我在真机测试的时候,f12开发者模 ...
- SpringBoot入门(IDEA篇)(二)
一.SpringBoot启动的3种方式 第一种:借助IDE工具直接启动 run as 第二种:mvn命令启动 1:打开命令行,进入到项目目录中(我这里还是用上次建立的dog项目来操作)cd E:\Wo ...
- 编写高质量代码:Web前端开发修炼之道(四)
这一节是继上一节高质量的Javascript 7)编程实用技巧 1:弹性 从 一个标签区和内容区的实例(就是点击不同的标签菜单显示不同的内容块)来说明不需要每个tabmenu都设置onclick事件, ...
- JavaScript 流程控制器
已知有流程step1.step2.step3.step4.step5 , 如何控制输出下面过程 例如: 1:step1.step2.step3.step2.step3.step4.step5 2:st ...
- 2016424王启元 Exp3免杀原理与实现
基础问题回答 1.杀软是如何检测出恶意代码的? (1)基于特征码的检测 特征码是能识别一个程序是一个病毒的一段不大于64字节的特征串.如果一个可执行文件包含这样的特征码则被杀毒软件检测为是恶意代码. ...
- apache2 + django 路径问题
问题: 在代码中使用sys.path.append(), 添加模块路径后,仍然报错找不到包. 虽然在LD_LIBRARY_PATH中配置了.so文件打路径,仍然报错找不到. 原因: 检查apahce2 ...