一、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文件详解的更多相关文章

  1. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  2. tomcat 加载顺序 web.xml文件详解

    一. 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Se ...

  3. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  4. Maven pom.xml文件详解

    Maven pom.xml文件详解 一.简介 POM全称是Project Object Model,即项目对象模型. pom.xml是maven的项目描述文件,它类似与antx的project.xml ...

  5. javaweb web.xml文件详解

    web.xml文件详解 前言:一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的开发web工程.web.xml主要用来配置Filter.Listener.Servlet等 ...

  6. 史上最全的maven的pom.xml文件详解(转载)

    此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  7. AndroidManifest.xml文件详解(uses-permission)

    语法(SYNTAX): <uses-permissionandroid:name="string"/> 被包含于(CONTAINED IN): <manifest ...

  8. Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)

    1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...

  9. testNG xml文件详解

    网上看到一篇整理的非常详细的xml文件详解,分享一下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 < ...

随机推荐

  1. DataSync 异构数据同步

    RAC, Data Gurad, Stream 是Oracle 高可用性体系中的三种工具,每个工具即可以独立应用,也可以相互配合. 他们各自的侧重点不同,适用场景也不同. RAC 它的强项在于解决单点 ...

  2. PowerDesigner 使用小结

    这里总结一篇关于数据建模工具 PowerDesigner 的使用小技巧,下面列出的两个应用场景要在网上现找解决方案的话还真不一定好找,所以选择将这两个棘手的问题先记下来. 1. PDM 中表间关系出现 ...

  3. MySQL数据库备份之xtrabackup工具使用

    一.Xtrabackup备份介绍及原理 二.Xtrabackup的安装 1.在centos7上基于yum源安装percona-xtrabackup软件 [root@node7 ~]# yum -y i ...

  4. iOS中NSTimer的使用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  5. 123457123457#0#-----com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)

    com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)

  6. SpringCloud学习成长之路七 高可用配置中心

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...

  7. PAT 甲级 1045 Favorite Color Stripe (30 分)(思维dp,最长有序子序列)

    1045 Favorite Color Stripe (30 分)   Eva is trying to make her own color stripe out of a given one. S ...

  8. LeetCode_121. Best Time to Buy and Sell Stock

    121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...

  9. VS在项目范围内禁止关闭特定警告

    要在项目范围内禁止警告,请在项目文件中定义要忽略的以分号分隔的警告代码列表.附加警告代码也$(NoWarn); 1.首先找到该项目的 .csproj 文件 >> 在<Property ...

  10. spark报错:invalid token

    启动spark报错,启动container失败,去看yarn的日志,显示invalid token, 经过排查是hadoop子节点的配置和主节点的配置不一致导致的,同步之后,问题解决.