(二)Struts.xml文件详解
一、Struts.xml文件
- Struts.xml文件构成
如图,《Struts》标签内共有5个子标签。
1.1 struts-default.xml
- 查看Struts的内容可知,Struts的默认包“default”是继承于"Struts-dafault"包的,struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件,所以Struts2每次都会自动加载 struts-default.xml文件。
struts-default.xml 里定义了一大堆的常量和bean,要使用这些只需要继承这个包就行了。
- struts-default.xml路径:struts2-core-2.3.32.jar/struts-default.xml
1.2 子标签之bean (暂时无须理会)
1.3 子标签之constant
A、 Struts所有常量定义在:
B、 常用常量:
struts.i18n.encoding=UTF-8 //设置请求的编码
struts.enable.DynamicMethodInvocation = true //是否支持动态方法的调用
struts.configuration.xml.reload = true //是否支持XML的自动加载
struts.devMode = false //开发模式
struts.ui.theme=xhtml //UI模板的设置
struts.ognl.allowStaticMethodAccess=false //是否允许在ONGL表达式中调用静态方法
struts.action.extension=action,, //STruts请求的扩展名。
C、常量定义位置
- 常量可以定义在4个位置:
A、第一个就是defalut.properties里,但是我们一般都不会在这个文件里定义常量。
B、第二个就是struts.xml中,
- <struts>
- <constant name="struts.enable.DynamicMethodInvocation" value="false" />
- <constant name="struts.devMode" value="true" />
- <package name="default" namespace="/" extends="struts-default">
- <action name="xx" class="com.ActionFirst">
- <result name="index">/index.jsp</result>
- </action>
- </package>
- </struts>
C、第三个就是
- 这个文件需手工建立,也是放在src目录下,一般用于WebWork工程
D、第四个就是在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>
- struts读取常量的顺序:后面的会覆盖前面的配置。就是说web.xml中配置的struts.devMode的值会覆盖掉前面ABC配置的值。
1.4 子标签之include
- 包含其他配置文件,一般用于团队合作。
struts中多模块的设置,模块化文件。
<include file="xxxx.xml"/>
公用的Action放在struts.xml中,模板的配置放到模板的配置文件中。
1.5 子标签之package
1.5.1 属性
属性A、 name="default" 包名,随便取,不能重复。
属性B、 namespace="/" 命名空间。
命名空间:
struts请求的访问路径:
http://IP地址:端口号/工程名/命名空间/Action的名称。
struts会根据命名空间逐层进行匹配。
<a href="<%=path%>/aa/bb/cc/dd/nameSpaceAction">命名空间示例</a>
- 示例:
A. 编写index.html
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <a href="<%=path%>/aa/bb/exam"> 命名空间示例</a>
- </body>
- </html>
- a标签跳转到“工程名/aa/bb/exam”URL,
B、编写action类
- package com;
- public class ActionFirst {
- /**
- * 必须要有String的execute方法
- * @return
- */
- public String execute(){
- return "index";
- }
- }
C、配置struts.xml文件
- <struts>
- <constant name="struts.enable.DynamicMethodInvocation" value="false" />
- <constant name="struts.devMode" value="true" />
- <package name="default" namespace="/" extends="struts-default">
- <action name="xx" class="com.ActionFirst">
- <result name="index">/index.jsp</result>
- </action>
- </package>
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <result name="index">/index_2.jsp</result>
- </action>
- </package>
- </struts>
D、编写跳转后的index_2.jsp页面
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- 我是跳转后的jsp页面
- </body>
- </html>
结果:
点击a标签跳转到:
查看地址栏“http://localhost:8080/struts_project_1/aa/bb/exam” 说明跳转成功,但是在struts.xml文件如下配置,并没有“/aa/bb”这个命名空间,正常来说,地址栏的URL 为“http://localhost:8080/struts_project_1/aa/exam” 才能跳转成功,但是还是跳转成功了,|struts的匹配规则为: struts会根据命名空间逐层进行匹配。
以本例来说,当URL为“/aa/bb”找不到action=exam时,就会到上一层命名空间“/aa”里找action=exam ,就这样一层一层往上找。
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <result name="index">/index_2.jsp</result>
- </action>
- </package>
属性C、 extends="struts-default" 包之间的继承。就可以父包配置的选项
默认所有的package都继承struts-default.xml
属性D、 abstract="true|false" 是否抽象包。抽象包中不能定义action。
1.5.2 package的子标签
1.5.2.1 package子标签之action标签
<action name="" class="" method="">
示范: <action name="methodAction" class="com.action.MethodAction" method="test"></action>
解析:访问methodAction路径,默认执行execute方法。通过method属性的配置,可以执行其他的方法。示例中就是执行test方法。
值得注意到是 method里的方法只能是public访问修饰符,而不能是其它修饰符,可以在这个public方法里调用其他非public的方法。
1.5.2.2 action标签的子标签《param》
- action中的param
设置或者获取Action中定义的成员变量的值。要求成员变量要有SET与GET方法。本文中只示范设置成员变量,而获取在后续章节再详细讲解。
示例(设置Action中定义的成员变量的值):
index.jsp:
- <body>
- <a href="<%=path%>/aa/exam"> action中param标签使用示例</a>
- </body>
ActionFirst.java:
- package com;
- public class ActionFirst {
- /**
- * 使用action中的param标签前提是action的成员变量必须有get和set方法。
- *
- */
- private String userName;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String execute(){
- System.out.println(this.userName); //在控制台输出Action成员变量的值
- return "index_2";
- }
- }
struts.xml:
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <param name="userName">用户名</param>
- <result name="index_2">/index_2.jsp</result>
- </action>
- </package>
结果:
点击标签之后:
1.5.2.2 action标签的子标签《result》
action中的result
属性A、 name:result的名称
属性B、type:result的类型,
chain: 请求转发到Action
dispatcher: 请求转发到JSP面,默认
redirect: 重定向到JSP页面
redirectAction: 重定向到Action
stream: 流方式,用于下载
freemarker freemarker模版引擎 (了解即可)
示例: 以上题为例:
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <param name="userName">用户名</param>
- <result name="index_2">/index_2.jsp</result>
- </action>
- </package>
- struts.xml中<result name="index_2">/index_2.jsp</result> ,当访问URL"工程名/aa/exam"时,ActionFirst 这个 Action 的execute方法的返回值为index_2时,将跳转到index_2.jsp这个jsp。
type类型如果没有写,默认是dispatcher ,即<result name="index_2" type="dispatcher">/index_2.jsp</result>
- type="chain" 使用示例:
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <result name="index_2" type="chain">
- <param name="namespace">/bb</param>
- <param name="ActionName">ChainAction</param>
- </result>
- </action>
- </package>
- <package name="bb" namespace="/bb" extends="struts-default">
- <action name="ChainAction" class="com.ChainAction">
- </action>
- </package>
解析: 当我们访问url"工程名/aa/exam" 的时候,会调用com.ActionFirst 这个类的execute方法,然后返回一个String值"index_2" ,由于这个result是chain类型的(请求转发到Action), 所以会找到<param name="namespace">/bb</param> 命名空间为"/bb"中的 <param name="ActionName">ChainAction</param> Action名叫“ChainAction”的类并执行,调用那个的execute方法,并返回String值。 注意: name="namespace"和name="ActionName" 值不能写错,但是不区分大小写,ActionName与actionname是一样的。
- type="redirect" 使用示例
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <result name="redict_index_2" type="redirect">/index_2.jsp</result>
- </action>
- </package>
- type="redirectAction" 重定向到Action 用法与type="chain" 相同
- type="freemarker" 使用示例:
- <package name="aa" namespace="/aa" extends="struts-default">
- <action name="exam" class="com.ActionFirst">
- <param name="userName">admin</param>
- <result name="freemarker_index_2" type="freemarker">/cc.ftl</result>
- </action>
- </package>
解析: 当地址栏为"工程名/aa/exam"时, 调用com.ActionFirst ,然后调用execute方法,给这个类的成员变量赋值(<param name="userName">admin</param>), 最后execute方法返回String值=freemarker_index_2, 跳转到/cc.ftl 里。
cc.ftl:
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- ${userName}
- </body>
- </html>
${} 这是ftl文件的表达式,用于获取值。
结果:
如图可见,在Struts.xml设置的userName=admin成功在cc.ftl文件里获取。
1.5.3 package子标签之《default-action-ref》标签
- 配置默认的action。
当链接到一个命名空间时,没有指定action的路径,那么就会执行默认的action。
http://localhost:8080/Struts2_Project_1/test1/
<package name="test" namespace="/test1" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result>/main.jsp</result>
</action>
</package>
示例:
struts.xml
- <struts>
- <package name="default" namespace="/" extends="struts-default">
- <default-action-ref name="xx"></default-action-ref>
- <action name="xx" class="com.ActionFirst">
- <result name="index_2">/index_2.jsp</result>
- </action>
- </package>
- </struts>
index_2.jsp
- <body>
- 我是重定向后的页面
- </body>
注意: 1. 请把(项目名/index.jsp)中的index.jsp这个文件去掉,否则web服务器会自动跳转到index.jsp页面。
2. <default-action-ref name="xx"></default-action-ref> 这个标签请放在《package》标签中的第一行,否则报错。
结果:
解析: 当url为“项目名/”/为命名空间,此时在地址栏里没有输入任何action的名,所以无法执行Action,默认执行<default-action-ref name="xx"></default-action-ref> 中的名叫“xx”的action。 于是出现上图。
1.5.4 package子标签之《global-results》标签
- 是Package下面所有的action都可以调用global中定义的result.
- global-results与results的区别:
global-result:是Package下面所有的action都可以调用global中定义的result.
result:是action中私用的。
其它的package想要调用另一个package中定义的global-result时,直接将包做
继承关系即可。通过extend来继承。
<package name="aa" namespace="/aa" extends="default">
- 《global-results》标签适用于错误页面、版权页面等通用的页面。
示例:
Struts.xml
- <package name="aa" namespace="/aa" extends="struts-default">
- <global-results >
- <result name="error">/page_error.jsp</result>
- </global-results>
- <action name="exam" class="com.ActionFirst">
- <result name="index_2">/index_2.jsp</result>
- </action>
- </package>
ActionFirst.java
- package com;
- public class ActionFirst {
- /**
- * 使用action中的param标签前提是action的成员变量必须有get和set方法。
- *
- */
- private String userName;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String execute(){
- String a=null;
- if(a!=null && !a.equals(""))
- return "index_2";
- else
- return "error";
- }
- }
解析:当地址栏为“项目名/aa/exam”时,执行ActionFirst的execute方法,返回String=“error” ,然后名叫exam的这个action中并没有名叫error的result,但是仍旧可以使用,因为这个errror定义在<global-results > 里,本包中的所有action都可以使用,而不必在《result》中定义。
(二)Struts.xml文件详解的更多相关文章
- web.xml文件详解
web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...
- tomcat 加载顺序 web.xml文件详解
一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Se ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
- Maven pom.xml文件详解
Maven pom.xml文件详解 一.简介 POM全称是Project Object Model,即项目对象模型. pom.xml是maven的项目描述文件,它类似与antx的project.xml ...
- javaweb web.xml文件详解
web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...
- 史上最全的maven的pom.xml文件详解(转载)
此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- AndroidManifest.xml文件详解(uses-permission)
语法(SYNTAX): <uses-permissionandroid:name="string"/> 被包含于(CONTAINED IN): <manifest ...
- Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)
1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...
- testNG xml文件详解
网上看到一篇整理的非常详细的xml文件详解,分享一下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 < ...
随机推荐
- jQuery插件fontIconPicker配合FontAwesome字体图标库的使用
同样先上效果图: 怎么样,是不是很好看,jquery fontIconPicker这个插件做的很不错,支持分类,搜索,还有分页功能,可以自定义分页,具体的使用方法我就不一介绍了,我只说一下如何使用fo ...
- SpringBoot缓存技术
一.SpringBoot整合Ehhcache 添加maven依赖 <dependency> <groupId>org.springframework.boot</grou ...
- 记一次环境变量导致的elasticsearch启动错误:max file descriptors [65535] for elasticsearch process is too low, incre
问题描述,elasticsearch启动时报max file descriptors错误: [hadoop@node-33 elasticsearch-5.4.0]$ bin/elasticsearc ...
- VUE钩子函数created与mounted区别
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图. mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作.
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- (十五)Centos之安装jdk
一.手动解压JDK的压缩包,然后设置环境变量 1 下载linux版的jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-d ...
- 【转】hr的嘴,骗人的鬼
入职前,从上往下读,入职后,从下往上读. - 我们非常欢迎新鲜血液补充进我们的团队:- 如果条件太苛刻,我待不久的:- 我们公司绝对不可能这样:- 请问每个月的工作都能按时足额发放吗?- 这难道不是理 ...
- 点击链接,取得href的值,但是不转向
点击链接,取得href的值,但是不转向 $('.list a').click(function (e) { e.preventDefault();//取消事件的默认动作. $.ajax({ ...
- react中如何实现一个按钮的动态隐藏和显示(有效和失效)
初始准备工作 constructor(props) { super(props); /* * 构建导出数据的初始参数,结合用户下拉选择后动态设置参数值 * */ this.state = { btnS ...
- SQL Server数据同步交换
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路. TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...