概述
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~~), 喜欢请点个赞哟!!!
最后
以上就是默默康乃馨为你收集整理的Struts2_1_基础案例_配置文件详解_动作类的全部内容,希望文章能够帮你解决Struts2_1_基础案例_配置文件详解_动作类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复