码农小汪-struts2学习4-struts.xml 常用配置解析

2024-08-21 01:08

本文主要是介绍码农小汪-struts2学习4-struts.xml 常用配置解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

都是简单的基础,不懂又不行!还是来简单的说一下子

  • struts.xml 文件主要负责管理应用中的 Action 映射,以及该容主要包括: Action、 Interceptor、 Packages 和 Namespace 等
<?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>
<package name="demo" extends="struts-default"><action name="submit" class="......Action"><result name="save">/result.jsp</result><result name="print">/result.jsp</result></action>
</package></struts>

上面差不多就是最基本的格式了吧,我觉得还是配置文件看起来比较好,比注解更好。

  • 小技巧:使用
    这种有什么值得学习的呢?如果我们都放在一个structs.xml文件中,一个大的项目下,大家都需要修改配置文件,比较的凌乱,还是自己管理自己的比较好吧,非常的棒棒,最后反正都要加载的,没事
<struts>
<include file="newstruts.xml"/>
<package name="test" extends="struts-default">
......
</package>
</struts>

注意:

  1. 用引用的 xml 文件也必须是完成的 struts2 的配置。实际上在引用时是单独解析
    xml 文件,而不是将被引用的文件插入到 struts.xml 文件中。
  2. struts-default.xml 这个文件被包含在 struts2-core.jar 中,文件名已经可以看出这个文件的作用是
    struts.xml 的默认配置,它将自动被加载后导入到 struts.xml 中去。

action 配置:

  1. 在默认情况下, Struts2 会调用动作类的 execute 方法。但有些时候,需要在一个动作类中处理不同
    的动作。也就是用户请求不同的动作时,执行动作类中的不同的方法。为了达到这个目的,可以在
    标签中通过 method 方法指定要执行的动作类的方法名,并且需要为不同的动作起不同的名字
struts>
<package name="demo" extends="struts-default" ><action name="test" class="action.MyAction">
......</action><action name="my" class="action. MyAction" method="my">
......</action>
</package>
</struts>

上面代码的两个动作的 class 属性都指向同一个类, name 为这个类起了两个动作别名: test 和 my。在动作 my 中,使用了 method 属性指定要要运行的方法名为 my。在 MyAction 类中必须要有 my 方法

package action;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport{
......
public String execute() throws Exception {
// 处理 test 动作的代码
}
public String my() throws Exception {
// 处理 my 动作的代码
}
......
}

除了在我们的这个变化之外呢,我们的请求的url也要变化啦
actionName!method.action


在 action 标签中我们还可以传递参数给我们的实现的类中,有点类似spring的方法注入差不多,我们在Action的实现类中就可以通过设置属性的get/set方法获取这个值得,然后在执行具体的方法的时候就会有值了。有点类似我们表单中传入的参数,直接入住到了我们的Action实现类中,这样讲起来估计比较的绕口。例子一出来你估计就会懂了

<action name="submit" class="action.MyAction"><param name="param1">value1</param><param name="param2">value2</param><result name="save" > /result.jsp</result>
......
</action>
package action;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport
{private String param1;private String param2;public String execute() throws Exception {System.out.println(param1 + param2);}public void setParam1(String param1) {this.param1 = param1;}public void setParam2(String param2) {this.param2 = param2;}......
}

看起来你懂了吧,就是个设置个参数的值而已嘛,当 struts2 在调用 execute 之前, param1 和 param2 的值就已经是相应参数的值了,因此,在 execute方法中可以直接使用 param1 和 param2。


Result的配置

在默认时, 标签的 type 属性值是“ dispatcher”(实际上是转发, forward)。开发人员可以根据自己的需要指定不同的类型,如 redirect、 stream 等。如下面代码所示:

<result name="save" type="redirect"> /result.jsp</result>

如果第一个 result 的属性省略了name没得, struts2 默认会把当作“ success”。
这此 result-type 可以在 struts2-core-2.0.11.1.jar 包或 struts2 源代码中的 struts-defaul这个文件中找到标签,所有的 result-type 都在里面定义了。代码如下:之前我也贴过这个代码的,非常的多,就和过滤器差不多,把文件通过不同的type,进行不同的处理工作,达到我们的目的就好了,这个样子比较的饿方变我们去实现这样的事情的
如下:继续贴,看到懂我

<result-types><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" /><result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /></result-types>

难道就没有感受到?我们处理完了result,之后通过ActionInvocation继续进行拦截器的处理的意义,就在这里的吧,嘿嘿!哈哈如果我们把SSH作为android客服端的服务器,经常处理Json数据是很正常的吧,也是通过这里进行设置的,百度很多都有教程的,有兴趣的朋友可以进去看哈这个效果到底是怎么回事呢?


有很多时候一个被很多使用,这时可以使用 < global-results>标签来定义全局的< result >所有的地方都是可以调用的
代码如下方所示。

<global-results><result name="print">/result.jsp</result>
</global-results

只要你有返回值,是这里面有定义的东西,就可以直接使用的。
前提是。如果< action >中没有相应的< result>, Struts2 就会使用全局的< result>。就和我们的子类和父类的关系差不多。


拦截器配置

Struts2 的拦截器和 Servlet 过滤器类似。在执行 Action 的 execute 方法之前,Struts2 会首先执行在struts.xml 中引用的拦截器,在执行完所有引用的拦截器的 intercept 方法后,会执行 Action 的 execute 方法

我们使用的时候如果不自己去定义拦截器的话,在 Action 里面必须最后一定要引用 struts2 自带的拦截器缺省堆栈 defaultStack。

<interceptor-ref name="checkbox"> 使用系统定义好的<param name="uncheckedValue">0</param></interceptor-ref>
<interceptor-ref name="defaultStack">

也可以设置,全局拦截器

<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors>
<default-interceptor-ref name="myStack"/>(这句是设置所有 Action 自动调用的拦截器堆栈)
</package>
<interceptor-stack name="defaultStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="servletConfig"/><interceptor-ref name="i18n"/><interceptor-ref name="prepare"/><interceptor-ref name="chain"/><interceptor-ref name="scopedModelDriven"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="multiselect"/><interceptor-ref name="staticParams"/><interceptor-ref name="actionMappingParams"/><interceptor-ref name="params"><param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param></interceptor-ref><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="debugging"/><interceptor-ref name="deprecation"/></interceptor-stack>

我们其他的地方要使用这个拦截器,直接继承这个包就行了,非常的方便的改写。默认的堆栈拦截器

<package name="LogonAdmin" extends="struts-shop"> (这里扩展 struts.xml 里面定义的配置就,默认的调用我们的拦截器
可以了)
<action name="logon" class="logonAction">
......
</package>

引用名既可以是拦截器名也可以是栈名。

由于 struts.xml 文件是自上而下解析的,所以被继承的 package 要放在继承 package 的前边。Namespace将 action 分成逻辑上的不同模块,每一个模块有自己独立的前缀。使用 namespace 可以有效的避免 action
重名的冲突,例如每一个 package 都可以有自己独立的 Menu 和 Help action,但是事项方式各有不同。Struts2 标签带有 namespace 选项,可以根据 namespace 的不同向服务器提交不同的 package 的 action 的
请求。“ /”表示根 namespace,所有直接在应用程序上下文环境下的请求( Context)都在这个 package 中。查找。“”表示默认 namespace,当所有的 namespace 中都找不到的时候就在这个 namespace 中寻找。


有些时候我们想指定一个 Action 的多个方法,我们可以做如下两步:

A 建立一些 execute 签名相同的方法,例如:

Public String forward() throws Exception

B 在 Action 配置的时候使用 method 属性。这个我之前也是提到过的吧。

<action name="delete" class="example.CrudAction" method="delete">

这样就行了,访问的时候加个!号就行了。HelloWorld!delete.action


还有一个type属性,我们该怎么处理呢?看我的系统配置文件,其实就是过滤器,把返回的东西处理哈哈,这个就是为什么,返回了还有拦截器的意思。

<result-types><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" /><result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /></result-types>

今天写了好多哦,都是些基础的东西,慢慢的学习不急不急。。。。。

最后还有个通配符,其实就是和上面的method属性一样的多了些好玩的东西,看起来更特别
统配的链接
没啥子难得懂得东西,慢慢学啦,走跑步去了,大三狗还要去阳光长跑,不容易啊!

这篇关于码农小汪-struts2学习4-struts.xml 常用配置解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091690

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri