Struts2基本配置详解
Struts2配置文件加载顺序
struts2 配置文件由核心控制器加载 StrutsPrepareAndExecuteFilter (预处理,执行过滤)
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties
init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加载
default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面 (常量的默认值)
struts-default.xml 该文件保存在 struts2-core-2.3.7.jar (Bean、拦截器、结果类型 )
struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在 ,配置插件信息 )
struts.xml 该文件是web应用默认的struts配置文件
struts.properties 该文件是Struts的默认配置文件 (配置常量 )
web.xml 该文件是Web应用的配置文件 (配置常量 )
后加载文件中struts2 常量会覆盖之前加载文件的常量内容
Struts2的Action配置
<!--配置例子-->
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.yzu.HelloAction" method="say">
<result name="good">/hello.jsp</result>
</action>
</package>
1)配置<package>元素(struts2 围绕package进行Action的相关配置 )
配置package三个常用属性 :<package name="default" namespace="/" extends="struts-default">
name 包名称,在struts2的配置文件文件中 包名不能重复 ,name并不是真正包名,只是为了管理Action
namespace 和 <action>的name属性,决定 Action的访问路径 (以/开始 )
extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 ),继承struts-default包后,可以使用 包中定义拦截器和结果类型
abstrace 它可以取值为true/false,如果为true,代表这个包是用于被继承的。
2)<action>元素配置
<action name="hello" class="com.yzu.HelloAction" method="say">
name 就是action的一个名称,它是唯一的(在同包内) 它与package中的namespace确定了访问action的路径。
class Action类的全名
method 要访问的Action类中的方法的名称,方法无参数 ,返回值为String.
例如 :
<package name="default" namespace="/user" extends="struts-default">
<action name="hello" class="cn.struts2.demo1.HelloAction">
访问路径 /user/hello.action
3) <result> 用于确定返回结果类型
name 它与action中的方法返回值做对比,确定跳转路径。
4) 关于action配置其它细节:
1.关于默认值问题
namespace的默认值是""
class的默认值是 com.opensymphony.xwork2.ActionSupport
method的默认值是 execute
name的默认值是 "success"
2.关于访问action的路径问题
<!--例如action的配置如下-->
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.action.DefaultAction">
<result>/hello.jsp</result>
</action>
</package>
当我们输入:http://localhost:8080/struts2_1/a/b/c/hello也访问到了action。
原因:struts2中的action被访问时,它会首先查找
1.namespace="/a/b/c" action的name=hello 没有.
2.namespace="/a/b action的name=hello 没有
3.namespace="/a" action的name=hello 没有
4.namespace="/" action的name=hello 查找到了.
如果最后也查找不到,会报404错误.
3.默认的action。
解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默认Action 就会执行
<default-action-ref name="action的名称" />
4.action的默认处理类
在action配置时,如果class不写。默认情况下是 com.opensymphony.xwork2.ActionSupport。如果设置了
<default-class-ref class="cn.action.DefaultAction"/>
默认处理action请求的的处理类就为class指定的类。
Struts2的常量配置
1) struts2 默认常量 在 default.properties 中配置
2) 开发者自定义常量
struts.xml
格式 : <constant name="struts.devMode" value="true" />
struts.properties
格式 : struts.devMode = true
web.xml
格式 :
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
3) 常用常量
<constant name="struts.i18n.encoding" value="UTF-8"/> ----- 相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码
<constant name="struts.action.extension" value="action"/> --- 访问struts2框架Action访问路径 扩展名
struts.action.extension=action,, 默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action
<constant name="struts.serve.static.browserCache" value="false"/> false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false
<constant name="struts.devMode" value="true" /> 提供详细报错页面,修改struts.xml后不需要重启服务器
4) struts2 配置文件分离
<include file="struts-part1.xml"/> 将struts2 配置文件 拆分
Action
Action书写的的三种格式
1.创建一个POJO类
简单的Java对象(Plain Old Java Objects):指的是没有实现任何接口,没有继承任何父类(除了Object)
优点:无耦合。缺点:所以工作都要自己实现。
在struts2框架底层是通过反射来操作:
struts2框架 读取struts.xml 获得 完整Action类名
obj = Class.forName("完整类名").newInstance();
Method m = Class.forName("完整类名").getMethod("execute"); m.invoke(obj); 通过反射 执行 execute方法
2.创建一个类,实现Action接口. com.opensymphony.xwork2.Action
优点:耦合低。提供了五种结果视图,定义了一个行为方法。缺点:所有工作都要自己实现。
public static final String SUCCESS = "success"; // 数据处理成功 (成功页面)
public static final String NONE = "none"; // 页面不跳转 return null; 效果一样
public static final String ERROR = "error"; // 数据处理发送错误 (错误页面)
public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
3.创建一个类,继承自ActionSupport类. com.opensymphony.xwork2.ActionSupport(ActionSupport类实现了Action接口)
优点:表单校验、错误信息设置、读取国际化信息三个功能都支持。缺点:耦合度高。
在开发中,第三种使用的比较多.
action的访问
1.通过设置method的值,来确定访问action类中的哪一个方法
<action name="book_add" class="cn.itcast.action.BookAction" method="add"></action>
当访问的是book_add,这时就会调用BookAction类中的add方法。
2.使用通配符来简化配置
1.在struts.xml文件中
<action name="*_*" class="cn.action.{1}Action" method="{2}"></action>
2.在jsp页面上
<a href="${pageContext.request.contextPath}/Book_add">book add</a><br>
<a href="${pageContext.request.contextPath}/Book_update">book update</a><br>
<a href="${pageContext.request.contextPath}/Book_delete">book delete</a><br>
<a href="${pageContext.request.contextPath}/Book_search">book search</a><br>
当点击book add时,这时的路径是Book_add,那么对于struts.xml文件中.第一个*就是Book,第二个*就是add,对于{1}Action---->BookAction,对于method={2}--->method=add
使用通配符来配置注意事项:
1.必须定义一个统一的命名规范。
2.不建议使用过多的通配符,阅读不方便。
动态方法调用
在struts.xml文件中
<action name="book" class="cn.action.BookAction"></action>
访问路径: http://localhost/struts2_day01_2/book!add时,就访问到了BookAction类中的add方法。对于book!add 这就是动态方法调用。
注意:struts2框架支持动态方法调用,是因为在default.properties配置文件中设置了动态方法调用为true.
struts.enable.DynamicMethodInvocation = true
在struts2框架中获取servlet api
对于struts2框架,不建议直接使用servlet api,在struts2中获取servlet api有三种方式:
1.通过ActionContext来获取(注意:通过ActionContext获取的不是真正的Servlet api,而是一个Map集合)
1.获取一个ActionContext对象。
ActionContext context=ActionContext.getContext();
2.获取servlet api
1.context.getApplication()
2.context.getSession()
3.context.getParameter();---得到的就相当于request.getParameterMap()
4.context.put(String,Object) 相当于request.setAttribute(String,String);
2.注入方式获取(这种方式是真正的获取到了servlet api)
1.要求action类必须实现提定接口。
ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象
2.重定接口中的方法。
private HttpServletRequest request;
3.声明一个web对象,使用接口中的方法的参数对声明的web对象赋值(例如要获取HttpServletRequest)
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
扩展:分析其实现(是使用struts2中的一个interceptor完成的)
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
if (action instanceof ServletRequestAware) { //判断action是否实现了ServletRequestAware接口
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); //得到request对象.
((ServletRequestAware) action).setServletRequest(request);//将request对象通过action中重写的方法注入。
}
3.通过ServletActionContext获取
在ServletActionContext中方法都是static(静态方法没有线程问题,ThreadLocal )。
ServletActionContext.getRequest() : 获得request对象 (session)
ServletActionContext.getResponse() : 获得response 对象
ServletActionContext.getServletContext() : 获得ServletContext对象
Result结果类型
结果页面跳转类型
type 作用:是用于定义跳转方式
对于type属性它的值有以下几种(在struts-default.xml文件中定义了type可以取的值):
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
常用值: chain dispatcher redirect redirectAction stream
dispatcher:它代表的是请求转发,也是默认值。它一般用于从action跳转到页面。
chain:它也相当于请求转发。它一般情况下用于从一个action跳转到另一个action。
redirect:它代表的是重定向 它一般用于从action跳转到页面
redirectAction: 它代表的是重定向 它一般用于从action跳转另一个action。
stream:代表的是服务器端返回的是一个流,一般用于下载。
局部结果页面与全局结果页面
<action name="result" class="cn.struts2.demo6.ResultAction">
<!-- 局部结果 当前Action使用 -->
<result name="success">/demo6/result.jsp</result>
</action>
<global-results>
<!-- 全局结果 当前包中 所有Action都可以用-->
<result name="success">/demo6/result.jsp</result>
</global-results>
Struts2基本配置详解的更多相关文章
- struts2基本配置详解2
接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" names ...
- Struts2 XML配置详解
struts官网下载地址:http://struts.apache.org/ 1. 深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1. 包配置: S ...
- Struts2(三)配置详解
一.概述 Struts2提供了多种可选的配置文件形式. 其中,struts-default.xml和default.properties是框架级别的配置文件,这两个文件在Struts的核心JAR包中, ...
- Struts2学习笔记二 配置详解
Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...
- java web.xml配置详解(转)
源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...
- JAVAEE——spring01:介绍、搭建、概念、配置详解、属性注入和应用到项目
一.spring介绍 1.三层架构中spring位置 2.spring一站式框架 正是因为spring框架性质是属于容器性质的. 容器中装什么对象就有什么功能.所以可以一站式. 不仅不排斥其他框架,还 ...
- Spark log4j日志配置详解(转载)
一.spark job日志介绍 spark中提供了log4j的方式记录日志.可以在$SPARK_HOME/conf/下,将 log4j.properties.template 文件copy为 l ...
- log4j.properties配置详解与实例
log4j.properties配置详解与实例 第一步:加入log4j-1.x.x.jar到lib下. 第二步:在工程的src下下建立log4j.properties.内容如下: #OFF,syste ...
- Spring 入门 web.xml配置详解
Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...
随机推荐
- android课件和源代码
ppt.rar 代码.rar 也可以自己从这里下载http://pan.baidu.com/share/link?shareid=1287391506&uk=2634355140
- Java for LeetCode 229 Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
- Java for LeetCode 215 Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- 士兵杀敌(三)_RMQ(区间最值查询)
士兵杀敌(三) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...
- CSS3实现元素旋转
-webkit-transform:rotate(30deg); 参数代表顺时针自旋转角度 这个元素还提供了文本倾斜的方法 - HTML5与CSS3 P299
- CSS设置超出指定宽度自动换行
一.背景 最近项目中有用到在div中显示用户反馈的信息,是指定宽度的div,超出要自动换行,开始写好后感觉应该没什么问题,后来自己随便输入测试数据的时候发现:如果是纯字母或者是纯数字就会出现超出了也不 ...
- September 29th 2016 Week 40th Thursday
Prosperity discovers vice, adversity virtue. 得意时露瑕疵,逆境中见品质. I wish I would have someone like you, fr ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Mysql之日志恢复
对于Mysql,每一步操作都会有相应记录,如insert,update,delete ,drop ,alter等相关DDL或DML操作.有时难免会出错,但在出错时如何恢复以复原数据. 例如,现在有这些 ...