Struts2_1_基础案例_配置文件详解_动作类

Struts2简要概述

  • 三层架构中的表现层框架
  • 相对于常规的MVC模式, 其核心为Filter控制器
  • 内部的Filter实例是在客户端每发送一次就实例化一次, 相比于Servlet具有线程安全性
  • 内部控制器默认拦截以.action或无后缀名的url

Struts2案例步骤

  • 配置web.xml, 由于Struts2核心为Fiter, 所以需要在web.xml中配置过滤器
<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>
<!-- StrutsPrepareAndExecuteFilte代表struts2的核心控制器-->
  • 建立addUser.jsp文件: 在addUser.jsp中处理用户的操作请求
例如: <a href="${pageContext.request.contextPath}/addUser.action">添加用户</a>
  • 配置struts.xml
例如: 
	<struts>
		<package name="p1" extends="struts-default">
			<action name="addUser" class="com.strutstest.action.DemoAction" method="addUser">
				<result name="success">/success.jsp</result>
			</action>
		</package>
	</struts>
  • 建立动作类与动作方法
//例如:
public class DemoAction extends ActionSupport{
	public String addUser(User user){
		if(user != null){
			userList.add(user);
			return SUCCESS; //ActionSupport中的字符串常量, 代表"success"
		}else{
			System.out.println("user == null");
			return ERROR;	//ActionSupport中的字符串常量, 代表"error"
		}
	}
}
  • 结果视图: 如果用户添加操作正确, 返回"success"至result中, 将会请求转发至success.jsp中, 操作失败不做任何转发操作

上述案例执行过程

  • 如下整个过程
 - 加载web.xml
 - 实例化并初始化过滤器; 与web.xml同时发生
 - 由StrutsPrepareAndExecuteFilte加载struts.xml, 加载时间优先于web.xml
 - 客户端发送addUser.action的请求
 - 请求到达过滤器
 - 由过滤器拦截该请求, 在struts.xml中查找对应的namespace
 - 6中操作成功后, 获得动作名称addUser, 然后在struts.xml中查找对应的action name; 若操作失败, 重新遍历整个root, 如果还未找到则报404
 - 根据struts.xml中action标签中的class属性去工程中查找对应的动作类
 - 找到动作类后, 调用动作方法, 获得方法返回值, 根据返回值查找对应的jsp界面

Struts2配置文件的加载过程

  • 加载时机
在应用加载的时候加载, 在应用运行过程中只加载一次
  • 加载顺序
 - default.properties //系统默认配置文件, 不可修改
 - struts-default.xml //struts2的核心配置, 不可修改
 - struts-plugin.xml //不可修改
 - struts.xml //当前应用, 可修改
 - struts.properties //当前应用, 可修改
 - web.xml //当前引用
注:
 - 具有多个配置文件的时候,且配置文件参数相同, 后一个的配置文件信息会覆盖前一个配置文件的信息
 - 使用系统默认的拦截器的时候, 拦截器总是执行两遍; 执行过程:  正向一遍-> 将结果反馈到jsp中-> 然后反向一遍 

Struts2提供的常量

下面列举常用常量:

  • struts.i18n.encoding 默认编码utf-8
  • struts.multipart.parser 指定文件上传组件,默认jakarta
  • struts.multipart.maxSize 默认值:2097152 文件上传总文件大小限制:2M
  • struts.action.extension 默认为"action"或者为空 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔, 可以加空格表示没有后缀
  • struts.enable.DynamicMethodInvocation 默认false 是否允许动态方法调用
  • struts.devMode 默认false 是否是开发模式, 进入开发者模式, 修改Struts.xml无需重启服务器

常量覆盖方式

  • 使用< constant name=“常量名” value=“值”></ constant>

Struts.xml文件主要标签及属性

  • package: 配置文件的分包管理, 与java中的package一致
内部属性:
	1. name: 包名, 必须写且唯一
	2. extends: 默认继承struts-default包(类似于java中Object), 提供Struts2核心功能
	3. namespace: 名称空间, 名称空间 + 动作名称 = 访问路径
	4. abstract: 声明当前包为抽象包, 没有action标签的包都可以是抽象包
例:
	<package name="p1" extends="struts-default" namespace="/a">
	</package>
注: namespace没有写的情况下使用默认提供的命名空间及""(表示空串)
记住: namespace的查找是在整个root下寻找, 而action的查找只在所有的满足条件的namespace下查找(感觉自己都讲不清楚, 版面太小无法叙述)
  • action: 配置动作行为, 表示用户执行的动作
内部属性:
	1. name: 动作名称
	2. class: 动作类, 默认动作类com.opensymphony.xwork2.ActionSupport(在Struts-default中定义)
	3. method: 动作类中包含的动作方法, 用于执行用户动作请求, 默认public String execute(){}
例:
	<action name="addUser" class="com.strutstest.action.DemoAction" method="addUser">
	</action>
注: 
	动作方法必须满足: public, 返回值String, 无参数;
	为了满足动作方法的灵活调用, 避免写死代码, 所以使用通配符代替属性参数, 或者通过动态调用.
	例如:
		通配符:
			<action name="*" class="com.strutstest.action.DemoAction" method="{1}">
				<result name="success">/{1}.jsp</result>
			</action>
			"*"代表用户要执行的操作, {1}代表截取用户操作的名称(此时动作方法中也要具有相同名称的动作方法, 跳转的页面也要具有相同的动作名称)
		动态调用:
			在index.jsp中我们写的操作链接如下:
			注: 在动态方法调用之前要修改default中常量值, 保证可以使用动态方法调用, 如下的<constant>
				<a href="${pageContext.request.contextPath}/user/user!addUser.action">
			在struts.xml中action对应的写法是:
				<constant name="struts.enable.DynamicMethodInvocation" value="true">
				<package name="user" extends="struts-default" namespace="/user">
					<action name="user" class="com.strutstest.action.DemoAction">
						<result name="success">/success.jsp</result>
					</action>
				</package>
			当执行动态调用的时候就是反射截取user!addUser.action中"!"后面的addUser
  • result: 结果视图, 获得动作方法反馈后进行页面跳转或显示
内部属性:
	1. name: 逻辑视图名称
	2. type: 跳转类型, 取值在struts-default.xml中有介绍, 但也可以自定义type类型
	注:
		type 常用取值: dispatcher(默认值, 请求转发), redirect(页面重定向), redirectAction(动作重定向), chain(动作请求转发);
		动作请求转发可以在相同或不同名称空间转发
		例:
			chain: 转发到另一个动作
				同包下直接使用: <result name=”success” type=”chain”>action2</action>
				不同包使用: 
				<result name=”success” type=”chain”> //触发Servle****Result的类, 获取namespace与actionName的值, 确定转发的空间与动作
				<param name=”namespace”>/n2<param> 
				<param name=”actionName”>action3<param>
				</result>
			redirectAction: 重定向到另一个动作
				同包下与chain操作一直, 直接type=”redirectAction”
				不同包下与chain一致, 将type修改即可
	3. param: 当需要转发到不同包下的动作, 当需要自定义结果视图使用param修改内部参数
	注: 通过反射机制获取setter方法, 将param中参数通过依赖注入对结果类参数进行修改
	4. 自定义结果类型: 
		让自定义的javaBean实现com.opensymphony.xwork2.Result接口或者继承该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport
		重写doExecute方法, 执行自定义的结果视图

动作类的3中书写方式

  • 直接写一个简单的JavaBean, 不推荐使用, 可操作性太低
  • 写一个实现com.opensymphony.xwork2.Action接口的类
此接口提供默认的动作方法execute()以及默认的动作返回值( SUCCESS, ERROR, INPUT, LOGIN, NONE)
  • 动作类继承com.opensymphony.xwork2.ActionSupport类

动作类中访问Servlet的API

  • 使用ServletActionContext类
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSessionContent session = request.getSession(); //session不能使用ServletActionContext获得
  • 通过实现接口获得
动作类实现ServletRequestAware, ServletResponseAware
重写接口方法即可获得对应的request, response

有问题请指教(我会很O(∩_∩)O~~), 喜欢请点个赞哟!!!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值