Strus2 Unti1

Struts2 的优势:

1、action组件是POJO(普通的java对象),action组建的请求处理方法不与ServletAPI耦合等何框架API耦合,易于测试和重用。
eg:execute();
2、支持更多的表现层技术,有更好的适应性;
3、更好的模块支持
4、框架的核心由拦截器实现,拦截器可插拔,加上插件机制,提供了更好的可扩展性

Struts2架构图

在这里插入图片描述
官方架构图:
在这里插入图片描述

StrutsPrepareAndExecuteFilter是struts2框架的核心控制器,他负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,
当用户请求到达时,该Filter会过滤用户的请求。
默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,
否则struts2框架将略过该请求的处理。
当请求转入Struts2框架处理会先经过一系列的拦截器,然后再到Action。
与Struts1不同,struts2对用户的每一次请求都会创建一个Action,所以时线程安全的

Struts2的配置文件

配置Action的sturts.xml
定义一系列的Action,指定实现类,配置action处理结果与视图资源之间的映射关系

<action name="login" class="com.cjp.action.LoginAction">
	<result name="login">/login.jsp</result>
	<result name="success">/welcome.jsp</result>
	<result name="error">/error.jsp</result>
</action>

配置Struts2全局属性struts.properties
定义一系列key、value对,指定应用的全局属性

 struts.devMode=false
 struts.comfiguration.xml.reload=true

控制器组建是Struts2框架的核心
Struts2控制器有两部分:

StrutsPrepareAndExcuteFilter(控制器)
业务控制器Action

实际上Struts2应用中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理(动态代理)(以用户定义的Action为目标)

如果把代码都写到一个struts.xml文件中,则文件将会非常的臃肿。
所以我们将其不同的功能package写入不同的xml文件中
最后在struts.xml加载

struts.xml

<struts>
	<constant name="struts.configuration.xml.reload" value="true"></constant>
	<include file="department.xml"/>
	<include file="employee.xml"/>
</struts>

employee.xml

<struts>
	<package name="login" namespace="/test1"
		extends="struts-default">
		<action name="login1" class="com.cjp.action.HelloAction">
			<param name="message">测试2</param>
			<result name="success">/hello2.jsp</result>
			<result name="no">/login2.jsp</result>
		</action>
	</package>
</struts>

department.xml

<struts>
	<package name="auther" namespace="/test2" extends="struts-default">
		<action name="xxx" >
			<result type="plainText">
				<param name="location">/login2.jsp</param>
				<param name="charSet">utf-8</param>
			</result>
		</action>
	</package>
</struts>

Action类的优点:

1、Action是POJO,利于代码复用
2、与Servlet API解除耦合,利于单元测试
3、Action类的execute方法进返回一个字符串作为处理结果,可映射到任何类型的视图,甚至是其他Action

命名空间namespace和访问路径的关系

假设我的struts.xml配置文件中一个action配置如下:

/index.jsp

那么我直接可以通过http://localhost:8089/struts2/testMap.action进行访问,这个的访问过程是这样的,在没有定义namespace的时候,由于在struts中,我们的package继承了struts-default,也就拥有了struts的根空间,在这里我们没有指明namespace属性,但其实此时我们的namespace属性相当于namespace="",或者namespace="/"。由于我们没有指定命名空间,struts直接在根空间中寻找name=testMap的action,根空间有这个action,所以我们能访问。
假设配置文件中action配置中加入了namespace属性值,如下:

/index.jsp

那么我们必须通过http://localhost:8089/struts2/test/testMap.action这个路径进行访问,如果再用http://localhost:8089/struts2/a/testMap.action或其他路径,就会出现异常。因为此时struts首先在命名空间为test中寻找,如果没有找到,会继续在根空间寻找,而现在根空间已经没有名为demo的action了。

如果路径嵌套很多处理方式:

假设访问的路径为http://localhost:8089/struts2/path1/path2/path3/test.action,访问过程如下:

1、首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤2;如果存在这个package,则在这个package中寻找名字为test的action,当在该package下寻找不到action 时就会直接跑到默认namaspace的package里面去寻找action(默认的命名空间为空字符串“” ) ,如果在默认namaspace的package里面还寻找不到该action,页面提示找不到action

2.寻找namespace为/path1/path2的package,如果不存在这个package,则转至步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action

3.寻找namespace为/path1的package,如果不存在这个package则执行步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action

4.寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在package中寻找不到action或者不存在这个package时,都会去默认namaspace的package里面寻找action,如果还是找不到,页面提示找不到action。

可以理解为从里往外去找。

Action配置中,配置项的默认值

1.如果没有指定Action的class,默认值为ActionSupport。

2.如果没有指定Action的method属性,默认值为execute()方法。

3.如果没有指定result的name属性,默认值为“success“

struts配置文件中包的使用说明
在Struts2中使用包来管理Action的,包的作用于java中包的作用非常类似,主要管理一族业务功能相关的action。在实际应用中,我们把一族业务功能相关的action放在同一个包下。

result中的各种类型转发视图:

result配置类似于struts1中的forward,但是struts2中提供了多种结果类型,常用的类型有:deipatcher(默认值)、redirect、redirectAction、plainText。

result中还可以使用EL表达式${属性名}访问action中的属性,表达式里的属性名队形action中的属性:

eg:< result type="redirect">/view.jsp?message=${message}< /result> 

因为tomcat默认传输数据的格式为"ISO8859-1"此时会出现乱码现象,以下为解决方案:

HelloAction类中定义message变量为“测试”,如下:
message = URLEncoder.encoder("测试","utf-8");
在jsp中引用时:
${param.message} 这样直接引用会导致乱码!
正确操作:
<%= URLDecoder.decoder(new String(request.getparameter("message").getBytes("ISO8859-1"),"utf-8"))%>

下面是redirecAction结果类型的例子:
重定向的action在一个包中:

<result type="redirectAction">helloword</result>

重定向到别的命名空间下:

<result type="redirectAction">
	<param name="actionName=">helloword</param>
	<param name="namespace">/test</param>
</result>

plainText 显示原始文件内容

<result type="plainText">
	<param name="location">/xxx.jsp</param>
	<param name="charSet">UTF-8</param>
</result>

为Action注入值:

<action name="login1" class="com.cjp.action.HelloAction">
			注入“message” 的值为“测试2”<param name="message">测试2</param>
			<result name="success">/hello2.jsp</result>
			<result name="no">/login2.jsp</result>
		</action>

常量的定义

配置方式有两种:
一种:在strust.xml文件中配置

struts.action.extension 修改后缀的常量

<connstant name="struts.action.extension" value="do">

另一种,在struts.properties中配置

struts.action.extension=do

常量可以在一下几个文件中配置,加载顺序如下

struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如多个文件中配置同一个常量,则后一个配置文件中的常量覆盖上一个配置文件中的常量

常用常量:

<!--指定默认编码集,作用于HttpServletRequers的setCharacterEncoding方法和freemarker、velocity的输出-->
<constant name="struts.i18n.encoding" value="UTF-8"/>

<!--该属性指定需要struts2处理后请求后缀,该属性的默认值时.action-->
<constant name="struts.action.extension" value="do,action"/>

<!--设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭-->
<constant name="struts.server.static.browserCache" value="false"/>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开(打开后,不用重启tomcat,刷新下页面即可重新加载配置文件)-->
<constant name="struts.configuration.xml.reload" value="true"/>

<!--开发模式下使用可以爱的引出更详细的错误信息-->
<constant name="struts.devMode" value="true"/>

<!--默认的试图主题-->
<constant name="struts.ui.theme" value="simple"/>

<!--与Sping集成时,指定由sping负责action对象的创建-->
<constant name="strtus.objectFactory" value="spring"/>

<!--设置该属性,Struts2是否支持动态方法调用,该属性的默认值是true,如需关闭动态方法调配用,则可设置该属性为false-->
<constant name="struts.enable.DynamicMethodnvocation" value="false"/>

<!--上传文件的大小限制-->
<constant name="struts.multipart.maxSize" value="10701096"

动态方法的调用

<struts>
	<package name="auther" namespace="/test2" extends="struts-default">
		<action name="list_*" class="com.cjp.action.HelloAction" method="{1}">
			<result type="plainText">
				<param name="location">/login2.jsp</param>
				<param name="charSet">utf-8</param>
			</result>
		</action>
	</package>
</struts>
{1}表示匹配第一个*号

项目创建:

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

这里我已经创建好项目,以及strut2的相关配置:
在这里插入图片描述

web.xml文件
在这里插入图片描述

这里值得注意的是,web-app中的文件配置信息如果没有与tomcat的版本相匹配,eclipse保存xml文件时则会出先假死现象;
------------------------------------------------------------------------
消除此现象,只需拷贝tomcat/webapps中找到自带项目中的web.xml中的web-app即可

struts.xml
在这里插入图片描述

LoginAction.java

在这里插入图片描述

在xml文件中的提示功能

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值