一、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. SpringBoot缓存技术

    一.SpringBoot整合Ehhcache 添加maven依赖 <dependency> <groupId>org.springframework.boot</grou ...

  2. Docs-.NET-C#-指南-语言参考-预处理器指令:#error(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#error(C# 参考) 1.返回顶部 1. #error(C# 参考) 2015/07/20 #error 可从代码中的特定 ...

  3. nginx+lua 设置跨域

    nginx 配置: header_filter_by_lua_file cros.lua; access_by_lua ' if ngx.var.request_method == "OPT ...

  4. osg::NodeVisitor osg3.4.0

    x:-89.4588 y:-12.1245 z:-11.7807x:-89.4588 y:-6.44823 z:-11.7807x:-89.2164 y:-9.07239 z:-11.811x:-89 ...

  5. Qt编写自定义控件46-树状导航栏

    一.前言 树状导航栏控件是所有控件中最牛逼最经典最厉害的一个,在很多购买者中,使用频率也是最高,因为该导航控件集合了非常多的展示效果,比如左侧图标+右侧箭头+元素前面的图标设置+各种颜色设置等,全部涵 ...

  6. django模板--循环控制标签

    循环控制标签 在django模板中可以通过循环控制标签对列表进行迭代,循环控制标签又称for标签,语法格式如下: {% for value in value_list %} {{ value }} { ...

  7. SQl 2008 如何清除登陆过的服务器名称

    C:\Users\Administrator\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin ...

  8. 02. oc语言是动态语言

    参照着知乎上大神们给的解释,(https://www.zhihu.com/question/19918532)自己要总结下知识: 自己初级并没有理解 动态.静态.强类型.弱类型 语言的这些含义,区分. ...

  9. ES SQL使用说明文档

    ES SQL使用说明文档 一.Elasticsearch术语介绍 l  接近实时(NRT): Elasticsearch 是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一 ...

  10. [多转合成] 使用pycaffe保存各个层的特征图

    # coding=utf-8 #python2 caffe_visualize.py import numpy as np import matplotlib.pyplot as plt import ...