一、Struts2的配置文件加载顺序

1 、进入过滤器【StrutsPrepareAndExecuteFilter】跟代码,可以看到对应的文件加载顺序

进入StrtsPrepareAndExecuteFilter,跟里面的init方法:

                  

进入:

             

在进入:

                  

  init_DefaultProperties()                                ----加载default.properties

  init_TraditionalXmlConfigurations();            ----加载struts-default.xml、struts-plugin.xml、struts.xml

  init_LegacyStrutsProperties();                     ----加载struts.properties

  init_CustomConfigurationProviders();         ----加载配置提供类

    init_FilterInitParameters() ;                          ----加载web.xml中过滤器初始化参数

  init_AliasStandardObjects() ;                     ----加载Bean对象

2 、根据上面的代码,我们就可以得出配置文件的加载顺序了

前三个配置文件不需要关心,是Struts2的内部配置文件,我们无法修改,能修改的就是后面三个配置文件,这几个配置文件的加载是有一定的顺序的。

重点关系后面的几个配置文件,那是我们开发中需要进行更改的。后加载的配置文件中的常量会覆盖先加载配置文件中的常量。

  default.properties

  struts-default.xml

  struts-plugin.xml

  struts.xml

  struts.properties

  web.xml

注意:后配置的常量的值会覆盖先配置的常量的值。

二、Action的配置文件Struts.xml。

1、<package>配置

  Strtus2框架的核心组件是Action和拦截器,他使用包来管理Action和拦截器。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。

在Struts.xml中,package元素用来定义包配置。在配置包时,必须指定name属性,且不可重复。还需设置extends的属性,extends的属性值

必须是另一个包的name属性,但该属性值通常设置为struts-default。这样该包中的Action就具有了Struts2框架默认的拦截器等功能。

name                :包的名称,只有在一个项目中不重名即可。

extends            :继承哪个包,通常值为struts-default。

namespace      :名称空间,与<action>标签中的name属性共同决定访问路径。

名称空间有三种写法:

  带名称的名称空间                 :namespace=”/aaa”

  跟名称空间                       :namespance=”/”

  默认名称空间                          :namespace=””

abstract           :抽象的,用于其他包的继承。

2、<action>配置

action映射是框架中的基本单元。action映射就是将一个请求的url映射到一个action类,然后在通过参数配置对应的方法。

name                :与namespace共同决定访问路径

class                 :Action类的全路径

method            :执行Action中的哪个方法的方法名,默认值execute

converter          :用于设置类型转换器

3、Struts2常量的配置:

在Struts2的框架中,提供了非常多的常量:(在default.properties

                    

struts.i18n.encoding=UTF-8                     ----Struts2中所有的post请求的中文乱码不用处理。

struts.action.extension=action,,             ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

三、修改常量的值,可以有三个位置进行修正

1、struts.xml中进行修改

在struts.xml中通过<constant>元素配置常量是最常用的方式。需要指定两个必须的属性:name 、value.

  name:指定了常量的常量名

  value:指定了常量的常量值

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!--设置字符编码为utf-8-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
</struts>

2、struts.properties中进行修改

struts.properties文件其格式是Key-value对,每个Key对应一个value,key表示的struts2中的常量、value则是其常量值。

### 设定默认编码为UTF-8
struts.i18n.encoding=UTF-8

3、web.xml中进行修改

在web.xml文件中配置核心过滤器的时候,可以通过初始化参数来配置常量。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<!--设置默认编码为utf-8-->
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

注意:众多的常量记错难度系数太大,我们可以参考default.properties文件来选择我们需要的常量配置。而且,后加载的

   配置文件的常量是会覆盖先加载的配置文件中常量的值。

四、include的配置

分模块开发,也就是每个人负责不同的模块。那么Struts.xml 肯定是无法满足共用的,太容易出冲突了。一旦出现问题,会导致整个项目都

出现问题的。这个时候可以使用Sturts2的分模块开发。也就是一个主配置文件,然后再关联其他不同模块的配置文件来协助 开发即可。

协同开发,互不影响。分而治之的思想,将任务分配下去。

                          

包含文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--设置字符编码为utf-8-->
<constant name="struts.i18n.encoding" value="UTF-8"/> </struts>

被包含文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<!--设置字符编码为utf-8-->
<!--<constant name="struts.i18n.encoding" value="UTF-8"/>--> <!--引入com.turtle.demo1包下面的配置-->
<include file="com/turtle/demo1/struts-demo1.xml"/>
</struts>

五、Action的写法

1、Action类是POJO的类,不继承特殊的类、不实现任何特殊的接口,仅仅是一个pojo。

package com.turtle.demo1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Demo1Action { Logger logger = LoggerFactory.getLogger(Demo1Action.class); public String execute() {
logger.debug("进入了服务器。");
return "SUCCESS";
}
}

Struts2中默认执行Action类中的execute方法,该方法有具体的规则:

  方法的权限修饰符为public

  返回一个字符串,会用来指示跳转到下一个Result

  方法没有参数

2、Action类实现一个Action的接口

package com.turtle.demo1;

import com.opensymphony.xwork2.Action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Demo2Action implements Action { Logger logger = LoggerFactory.getLogger(Demo2Action.class);
// 该提供了五个常量
// String SUCCESS = "success";
// String NONE = "none";
// String ERROR = "error";
// String INPUT = "input";
// String LOGIN = "login"; @Override
public String execute() {
logger.debug("进入了服务器。");
return SUCCESS;
}
}

3、 Action类继承ActionSupport类【用得最多的写法】

package com.turtle.demo1;

import com.opensymphony.xwork2.ActionSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Demo3Action extends ActionSupport { Logger logger = LoggerFactory.getLogger(Demo3Action.class); @Override
public String execute() {
logger.debug("进入了服务器。");
return SUCCESS;
}
}

六、Action的访问:

定义一个action类:

package com.turtle.demo2;

import com.opensymphony.xwork2.ActionSupport;
import com.turtle.demo1.Demo1Action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Demo2Action extends ActionSupport {
Logger logger = LoggerFactory.getLogger(Demo1Action.class); /**
* 保存
* @return
*/
public String save() {
logger.debug("进入了save方法");
return null;
} public String update() {
logger.debug("进入update方法");
return null;
} public String delete() {
logger.debug("进入delte方法");
return null;
} }

1、通过配置action标签中method属性来完成:

页面

<%--
Created by IntelliJ IDEA.
User: TurtleZhang
Date: 2019/10/27
Time: 17:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>通过配置action标签中method属性来完成</h1>
<div>
<table>
<tr>
<td>
<a href="${pageContext.request.contextPath}/save.action" >Save</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/update.action" >Update</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/delete.action" >Delete</a>
</td>
</tr>
</table> </div>
</body>
</html>

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="demo2" extends="struts-default" namespace="/">
<action name="save" class="com.turtle.demo2.Demo2Action" method="save"/>
<action name="update" class="com.turtle.demo2.Demo2Action" method="update"/>
<action name="delete" class="com.turtle.demo2.Demo2Action" method="delete"/>
</package>
</struts>

配置很简单,也能正确访问,但是同一个Action类配置了很多次,而且改动的只是后面的method的值。这样有点重复了,大忌。体验感觉不太好。

2、通过通配符的配置完成

页面

<%--
Created by IntelliJ IDEA.
User: TurtleZhang
Date: 2019/10/27
Time: 17:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>通过配置action标签中method属性来完成</h1>
<div>
<table>
<tr>
<td>
<a href="${pageContext.request.contextPath}/save.action" >Save</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/update.action" >Update</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/delete.action" >Delete</a>
</td>
</tr>
</table> </div>
</body>
</html>

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="demo2" extends="struts-default" namespace="/">
<action name="*" class="com.turtle.demo2.Demo2Action" method="{1}"/></package>
</struts>

这种方法是最常使用的,在<action>中的name属性使用*来代表任意字符,metho中的{1}代表的是属性中出现的第一个*所代替的字符。这个时候就只需要

配置一个即可。

3、动态方法访问

动态方法访问在Struts2中默认是不开启的,如果想要使用需要去开启一个常量,我们加载struts.xml中

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

页面

<%--
Created by IntelliJ IDEA.
User: TurtleZhang
Date: 2019/10/27
Time: 17:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>通过配置action标签中method属性来完成</h1>
<div>
<table>
<tr>
<td>
<a href="${pageContext.request.contextPath}/demo2Action!save.action" >Save</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/demo2Action!update.action" >Update</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/demo2Action!delete.action" >Delete</a>
</td>
</tr>
</table> </div>
</body>
</html>

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!--开启动态方法访问-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="demo2" extends="struts-default" namespace="/">
<action name="demo2Action" class="com.turtle.demo2.Demo2Action"/>
</package>
</struts>

七、总结

2、Struts2开始深入的更多相关文章

  1. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  2. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  5. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  6. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  7. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  8. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  10. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. idea使用Deployment部署项目到阿里云服务器的全过程

    一.前言 之前玩了一下 Alibaba Cloud Toolkit 一键部署插件 这里顺便再提一下idea原生的Deployment自动部署项目吧,该功能也很强大,也不需要离开idea就可以直接将项目 ...

  2. ActiveMQ基本使用

    消息队列,目前在实际的开发项目中应用十分广泛.本文主要介绍入门级的ActiveMQ的基本使用以及相关的概念. 一.JMS 全称 Java Message Service,即Java消息服务.JMS是一 ...

  3. Python学习-迭代器、生成器

    一.迭代器 1. 可迭代对象 我们知道字符串.列表.元组.字典.集合都可以使用for语句进行循环遍历,然后输出每一个元素,这些都是可迭代对象. 检查对象是否是可迭代对象可以用两种方式去判断: (1)使 ...

  4. 字符串的格式化、运算符和math函数(python中)

    一.字符串的格式化 1.字符串格式化输出 print('%s的年龄是%d' % ('小哥哥',20)) # 将每个值放在⼀个圆括号内,逗号隔开 '{0}的年龄是{1}'.format('⼩小哥哥',2 ...

  5. html盒模型基础

    盒模型              概念:如果CSS对HTML文档元素生成了该元素在HTML文档布局中占据空间的矩形元素框(element box),称盒子             通过一系列定义盒子的 ...

  6. Spring boot 官网学习笔记 - logging

    commons-logging和slf4j是java中的日志门面,即它们提供了一套通用的接口,具体的实现可以由开发者自由选择.log4j和logback则是具体的日志实现方案. 比较常用的搭配是com ...

  7. springboot系列之02-需要了解的宏观知识点

    未经允许,不得转载 原作者:字母哥博客 本文完整系列出自:springboot深入浅出系列 一.Spring Boot . Spring MVC .Spring对比 首先你需要明白一件事情:Sprin ...

  8. Linux系统学习之Ln(软连接和硬链接)

    可简单理解为,软连接:创建的软连接文件是源文件的快捷方式,删除创建的软连接文件,源文件不受影响,连接消失. 硬链接:两个连体的文件,修改其中一个文件,另外一个文件也会随之更改:删除其中一个文件,另外一 ...

  9. 玩转 SpringBoot 2 之整合 JWT 下篇

    前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...

  10. Java基础学习笔记(二) - 面向对象基础

    面向对象 一.面向对象概述 面向对象思想就是在计算机程序设计过程中,参照现实事物,将事物的属性特征.行为特征抽象出来,描述成计算机时间的设计思想.面向对象思想区别于面向过程思想,强调的是通过调用对象的 ...