码农小汪-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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;