Struts2学习总结一

Struts总结一

很久没更新了,原因是"懒"和"没时间做笔记"。于是还是做一个小总结吧!(不然容易忘记)

Struts的jar

Struts2下载地址
在这里插入图片描述
下载完成后,打开压缩包中apps目录下的struts-blank.war包。将得到本次学习的所有jar,如下:
在这里插入图片描述


Struts2的简介

Struts2是Apache发行的MVC开源框架。注意:它只是表现层(MVC)框架。


Struts2的工作原理

在理解下面那幅图之前,我们先回想一下在学习JavaEE时,Filter和Servlet的区别!

Filter和Servlet的区别:Filter能够处理(或者说过滤)所有东西,Servlet只能处理Servlet的请求,那么可见,Servlet能做的时候Filter都能做!

那么以下的图就好理解了,Struts2应用中只有一个Filter,没错就是FilterDispatcher过滤器!它将处理所有请求!也就是说,我们将配置web.xml中的一个信息!如下:

<filter>
	<filter-name>struts2Filter</filter-name>
	<!-- 下面这个是Struts2的过滤器 -->
	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

接下来这幅图可以说是非常容易理解了!
在这里插入图片描述
上图是 Struts2 的体系结构。一个请求在 Struts2 框架中的处理大概会经过以下几个步骤:

  1. 客户端发出一个指向 Servlet 容器(例如Tomcat)的请求
  2. 这个请求会经过几个过滤器 Filter(ActionContextCleanUp 可选过滤器、其他 Web 过滤器如 SiteMesh 等),最后到达 FilterDispatcher 过滤器
  3. 接着 FilterDispatcher 过滤器被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action
  4. 如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给 Action 对象的代理(ActionProxy)
  5. ActionProxy 通过配置管理器(Configuration Manager)读取框架的相关配置文件(struts.xml 以及它包含的 *.xml 配置文件),找到需要调用的 Action 类
  6. 找到需要调用的 Action 类后,ActionProxy 会创建一个 ActionInvocation 的实例
  7. ActionInvocation 在调用 Action 的过程之前,会先依次调用相关配置拦截器(Intercepter),执行结果返回 结果字符串
  8. ActionInvocation 负责查找 结果字符串 对应的 Result,然后执行这个 Result,再返回对应的结果视图(如JSP等等)来呈现页面
  9. 再次调用所用的配置拦截器(调用顺序与第7步相反),然后响应(HttpServletResponse)被返回给浏览器

举个例子,如下图:
在这里插入图片描述


4、Struts2的优点

下面列举 Struts2 的一些主要优点:

  1. Struts2 是非侵入式设计,即不依赖于Servlet API 和 Struts API.
  2. Struts2 提供了强大的拦截器,利用拦截器可以进行 AOP编程(面向切面的编程),实现如权限拦截等功能。
  3. Struts2 提供了类型转换器,可以很方便地进行类型转换,例如将特殊的请求参数转换成需要的类型。
  4. Struts2 支持多种表现层技术,如 JSP、FreeMarker、Velocity 等。
  5. Struts2 的输入验证可以对指定的方法进行验证。

5、Struts2的第一个案例

第一个案例步骤如下:

  1. 开发环境和导入Struts2的jar
  2. 创建一个Action
  3. 配置struts.xml
  4. 配置web.xml
5.1、开发环境和导入jar包

在这里插入图片描述

5.2、创建Action

在这里插入图片描述

5.3、配置struts.xml

在这里插入图片描述
源代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 包名,其实也就是命名空间 -->
	<package name="hello" extends="struts-default" namespace="/hello">
		<!-- action处理类 -->
		<action name="hello" class="com.csa.action.HelloAction" method="hello">
			<!-- 查找相应结果的字符串的result -->
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>
5.4、配置web.xml

在这里插入图片描述
源代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<!-- 配置struts2过滤器 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<!-- 处理所有路径 -->
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
5.5、success.jsp和实验结果

在这里插入图片描述
在这里插入图片描述


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

顺序配置文件名所在位置说明
1default.propertiesstruts2-core-2.3.15.3.jar\org\apache\struts2不能修改
2struts-default.xmlstruts2-core-2.3.15.3.jar不能修改
3strtuts-plugin.xml在struts2提供的插件jar包中不能修改
4struts.xml我们的应用中我们能修改的
5struts.propertiesstruts2-core-2.3.15.3.jar我们能修改的
6web.xml我们的应用中 我们修改的可以给过滤器配置参数

7、Struts2提供的常量(constant)

常量名常量值说明
struts.i18n.encodingUTF-8应用中使用的编码
struts.objectFactory.spring.autoWirename和spring框架整合有关
struts.multipart.parserjakarta指定文件上传用的组件
struts.multipart.maxSize2097152文件上传总文件大小限制:2M
struts.action.extensionaction能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔
struts.enable.DynamicMethodInvocationfalse是否允许动态方法调用
struts.devModefalse是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。
struts.ui.themexhtml页面展示用的主题

例如(在struts.xml中配置):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 开发模式 -->
	<constant name="struts.devMode" value="true"></constant>
</struts>

8、package元素

在struts中,package用来管理action、result、interceptor、interceptor-stack等配置信息,它的属性如下:

属性是否必须含义
name包名,唯一标记,其他package可以利用name来引用
extends设置继承其它package,会继承父package的所有配置属性(例如action、result等等);默认继承自struts-default.xml
namespacepackage的命名空间,会改变url访问地址,主要是针对比较大型的项目以方便管理action,因为不同namespace中的action可以同名,从而解决action重名的问题。
abstract是否设置为抽象包

例如(在struts.xml中配置):

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	<!-- action处理类 -->
	<action name="hello" class="com.csa.action.HelloAction" method="hello">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/success.jsp</result>
	</action>
</package>
8.1、对namespace的详解

namespace的默认值:"",而不是"/"

动作类的搜索顺序(重点):
如果请求访问的服务在访问指定的namespace下不存在,则默认依次将访问的namespace缩短一级寻找,如果该namespace存在则在其下寻找服务,如果依次缩短寻找的namespace还是找不到对应的namespace则在名为"/"的namespace下寻找,找到了就访问,找不到就返回找不到。
在这里插入图片描述


9、action元素(动作名称)

属性是否必须含义
nameaction的名称
classaction对应的JAVA类
method类中的具体方法
converter类型转换器

如果没有为action指定class,默认的是ActionSupport

如果没有为action指定method,默认执行action中的execute()方法

例如(在struts.xml中配置):

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	<!-- action处理类 -->
	<action name="hello" class="com.csa.action.HelloAction" method="hello">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/success.jsp</result>
	</action>
</package>
9.1、通配符方法

例如(在struts.xml中配置):

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	<!-- action处理类 -->
	<action name="*_*" class="com.csa.action.HelloAction" method="{1}{2}">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/{1}{2}.jsp</result>
	</action>
</package>
9.2、Action类的几种创建方式

动作类的几种创建方式:

  1. 动作类就是一个POJO。
  2. 动作类实现com.opensymphony.xwork2.Action接口。
  3. 动作类继承com.opensymphony.xwork2.ActionSupport(一般使用这种方法)。
9.3、动态方法调用

例如(在struts.xml中配置):

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	<!-- action处理类 -->
	<action name="hello" class="com.csa.action.HelloAction">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/success.jsp</result>
	</action>
</package>

url访问方式:http://ip:prot/web应用/命名空间/动作名称!方法名.action


10、result元素

属性是否必须含义
nameAction对应返回的逻辑响应视图,默认是success。
type返回结果的类型,默认为dispatcher

例如(在struts.xml中配置):

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	<!-- action处理类 -->
	<action name="hello" class="com.csa.action.HelloAction" method="hello">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/success.jsp</result>
	</action>
</package>
10.1、param元素(依赖注入:DI)
<!-- 包名,其实也就是命名空间 -->
	<package name="hello" extends="struts-default" namespace="/hello">
		<!-- action处理类 -->
		<action name="hello" class="com.csa.action.HelloAction" method="hello">
			<!-- 查找相应结果的字符串的result -->
			<result type="redirectAction(或者其他自定义结果类型)">
				<param name="namespace(或者自定义结果类型的参数)">/world</param>
				<param name="actionName(或者自定义结果类型的参数)">world</param>
			</result>
		</action>
	</package>
10.2、自定义结果类型

自定义结果类型需要做的有以下几步:

  1. 自定义一个类,继承org.apache.struts2.dispatcher.StrutsResultSupport类。
  2. 在struts.xml的package中声明结果类型视图。
  3. 在struts.xml的action中使用结果类型。
10.2.1、自定义结果类型的类
package com.csa.type;

import org.apache.struts2.dispatcher.StrutsResultSupport;
import com.opensymphony.xwork2.ActionInvocation;

public class CaptchaResult extends StrutsResultSupport {

	private Integer width;
	private Integer height;
	
	public void setWidth(Integer width) {
		this.width = width;
	}

	public void setHeight(Integer height) {
		this.height = height;
	}

	@Override
	protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
		//以下是生成验证码的算法!省略不写。width和height决定宽度和高度
	}
	
}

10.2.2、在struts.xml中声明结果类型视图
<!-- 下面的内容省略掉 -->
<package ...>
		<!-- 声明结果类型 -->
		<result-types>
			<result-type name="captcha" class="com.csa.type.CaptchaResult"></result-type>
		</result-types>
</package>
10.2.3、在struts.xml中使用结果视图
<!-- 没有class是执行默认的ActionSupport,没有方法是默认执行execute() -->
<action name="captchaAction">
	<result name="success" type="captcha">
		<!-- 设置验证码的宽和高度分别为200和100 -->
		<param name="width">200</param>
		<param name="height">100</param>
	</result>
</action>
10.2.3、访问路径

http://ip:port/web应用/命名空间/动作名称,这样就可以得到以上的自定义结果类型的东西的。在这里我们得到的是验证码!


11、default-action-ref元素

如果找不到项目请求的action,就会报出404错误,而且这种错误不可避免,所以我们可以使用 default-action-ref 来指定一个默认的action,如果系统出现找不到action的情况,就会来调用这个默认的action。
例如:

<!-- 包名,其实也就是命名空间 -->
<package name="hello" extends="struts-default" namespace="/hello">
	
	<default-action-ref name="hello"></default-action-ref>
	
	<!-- action处理类 -->
	<action name="hello">
		<!-- 查找相应结果的字符串的result -->
		<result name="success">/success.jsp</result>
	</action>

</package>

访问路径:http://ip:port/web应用/命名空间/任意名称会发现,最后返回的都会是/success.jsp的内容!

12、default-class-ref元素

与action的一毛一样,不做阐述!

<!-- 指定默认class为Test -->
<default-class-ref class="com.csa.action.HelloAction"/>

13、global-results元素

设置package范围内的全局响应结果。在多个action都返回同一个逻辑视图(通常为某个jsp页面)的情况下,可以通过该标签来统一配置。
例如:

<package ...>
	<!-- 全局结果视图 -->
	<global-results>
		<result name="success">/success.jsp</result>
		<result name="error">/error.jsp</result>
	</global-results>
	
	<action name="hello">
		<!-- 局部结果视图 -->
		<result name="hello">/hello.jsp</result>
	</action>
</package>

这样子,只要在同一个包下的所有动作(action)返回的字符串都将先去匹配局部结果视图,如果找不到对应的字符串,再去全局结果视图中寻找有无对应的字符串。如果有,则返回相应的结果视图,如果没有,则404!


14、global-exception-mapping元素

配置发生异常时的视图信息。exception-mapping是控制action范围内的,而global-exception-mapping是控制package范围内的。两个都配置时,exception-mapping的优先级更高。

属性是否必须含义
nameexception名称
result设置异常相应结果的视图信息
exception设置异常类型

这里已经很详细(跟result一毛一样)了,就不需要在说明了!


15、include元素

你还可以使用 include 来引入外部配置文件,直接给出 url 即可:

<include file="**/**/***.xml" />  

使用 include 的好处在于,例如当我们开发一个比较大型的项目的时候,配置文件肯定会写一大堆。如果写在一个配置文件里就不好查看和修改,不便于维护;所以使用 include 后可以根据模块、也可以根据功能来划分,这样就比较清晰,方便管理和维护。


16、interceptor元素

通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:

<package ...>
	<interceptors>
	    <interceptor name="拦截器名" class="拦截器类"/>
	    <interceptor-stack name="拦截器栈名">
	        <interceptor-ref name="拦截器名">
	    </interceptor-stack>
	</interceptors>
</package>

17、interceptor-ref元素

通过该标签可以为其所在的Action添加拦截器功能。当为某个Action单独添加拦截器功能后,中所指定的拦截器将不再对这个Action起作用。

<action name="hello">
	<interceptor-ref name="拦截器名(或者拦截器栈名)">
		<param name="参数名">参数值</param>
	</interceptor-ref>
	<result name="success">/success.jsp</result>
</action>

18、default-interceptor-ref元素

该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息。事实上我们的包继承了struts-default包以后,使用的是Struts的默认设置。我们可以在struts-default.xml中找到相关配置:

<package ...>
	<default-interceptor-ref name="defaultStack"/>
</package>

在实际开发过程中,如果我们有特殊的需求是可以改变默认拦截器配置的。当时一旦更改这个配置,“defaultStack”将不再被引用,需要手动最加

如下:

<action name="hello">
	<interceptor-ref name="拦截器名(或者拦截器栈名)">
		<param name="参数名">参数值</param>
	</interceptor-ref>
	<interceptor-ref name="defaultStack"></interceptor-ref>
	
	<result name="success">/success.jsp</result>
</action>

参考

实验楼的Struts2教程
还有黑马的word笔记!这里木得url!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值