我是靠谱客的博主 热心发带,最近开发中收集的这篇文章主要介绍struts2详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

引入jar文件
commons-fileupload-1.2.2.jar 【文件上传相关包】
commons-io-2.0.1.jar
struts2-core-2.3.4.1.jar 【struts2核心功能包】
xwork-core-2.3.4.1.jar 【Xwork核心包】
ognl-3.0.5.jar 【Ognl表达式功能支持表】
commons-lang3-3.1.jar 【struts对java.lang包的扩展】
freemarker-2.3.19.jar 【struts的标签模板库jar文件】
javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】
配置web.xml

Tomcat启动- 加载自身web.xml---加载所有项目的web.xml 项目部署描述文件
通过在项目的web.xml中引入过滤器,
-Struts的核心功能的初始化,通过过滤器完成
filter 【
init/
启动执行
doFilter/
访问执行
destroy
】

注意:使用的struts的版本不同,核心过滤器类是不一样的!

Struts2的开发流程
Tomcat启动—-》加载web.xml文件,就会加载一个Filter—》strtus2核心功能的初始化,通过过滤器完成。
—–》Filter init、doFilter、destory
过滤器是在struts2核心包中org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
只要Filter加载完成,struts2框架就可以使用了。
因为strutsPrepareAndExceptionFilter会拦截所有的请求,我们访问的路径也会被拦截,会使用/hello,回去struts.xml文件中查找指定的action类 /hello是namespace和name的结合体
class 找到这个类(方法)就可以找到action类中的方法
通过/hello可以在Struts.xml文件中查找到《action》中的class,以及method,简单说,就找到了要执行的类中的方法。
这个方法执行后会返回一个字符串,然后再去action标签下的子标签的属性name进行比较,就可以确定一个跳转路径。
然后跳转到目标页面
StrutsPrepareAndExecuterFilter 别名很多:核心控制器,核心拦截器,——-Interceptors拦截器(实现代码功能)——–action的execute——结果页面 result
拦截器在struts-default.xml中定义
执行拦截器 是defaultStack中引用拦截器

关于手动配置struts.xml文件中提示操作
1.你可以上网
2.先去http://struts.apache.org/dtds/struts-2.0.dtd
查找到这个文件的位置
在window下输入xml catalog 点击add 找到dtd文件的资源路径
选uri 把这个路径拷贝进去
导入dtd时,应该和配置dtd版本一致!

2.关联struts2源文件
如果是 com.opensymphony.xxx 在xwork-core下
如果是org.apache.struts2 在core下

struts2的配置文件的加载顺序 重点

1.struts2配置文件加载顺序
struts2框架要能执行,必须先加载strutsperpareandexecuteFilter
在StrutsPerpareAndExecuteFilter的init方法对Dispather进行了初始化
在dispather类中定义的init方法内就描述了struts2配置文件加载的顺序
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_CustomConfigurationProviders(); // [5]
init_FilterInitParameters() ; // [6]
init_AliasStandardObjects() ; // [7]
默认的加载顺序
1. init_DefaultProperties(); // [1]default.properties文件
作用:定义struts2框架的所有常量
位置:org/apache/struts2/default.properties
2.init_TraditionalXmlConfigurations(); // [2]
加载的是struts-default.xml/ 在struts核心jar包下
作用:配置Bean intercepter、result结果类型
struts-plugin.xml/ 在插件包中存在,配置插件信息
struts.xml 在实际开发中,通常写struts.xml
我们自己的配置文件
3. init_LegacyStrutsProperties(); // [3]
自定义的struts.properties
就是可以自定义常量,一般不使用
4. init_CustomConfigurationProviders(); // [5]
自定义配置提供
5. init_FilterInitParameters() ; // [6] web.xml配置的东西,struts2可以用
6. init_AliasStandardObjects() ; // [7] bean加载

在开发中,后加载文件中的配置会将先加载文件中的配置覆盖掉 常量的内容。

关于action的配置
1. 作用:是用于声明一个包,用于管理action
name 它用于声明一个包名,包名不能重复,它是唯一的
namespace 它与action标签的name属性合并确定了一个唯一访问action的路径
extends 代表继承的包 在struts-default.xml中可以找到这个包 抽象的,只能用于被继承

2. 用于声明一个action
name:就是action 的一个名称,它是唯一的(同包内)
他与package中的namespace确定了action的访问路径
class :Action的类全名
method 要访问的Action类中的方法的名称

3. 用于确定返回结果类型
1.name 它与action中的方法返回值做对比,确定跳转路径

关于action配置的其他细节
1.关于默认值问题


class的默认值是com.opensymphony.xwork2.ActionSupport
method的默认值是 execute

那么的默认值是“success” 常量值 是 SUCCESS
namespace的默认值是空“”
2.关于访问action的路径问题
现在的namespace=“/”我们输入http://localhost/struts2_day_2/a/b/c/hello
也访问到了action

原因:struts2中的action被访问时,它会首先查找
1.namespace=”/a/b/c” action的name=hello 没有.
2.namespace=”/a/b action的name=hello 没有
3.namespace=”/a” action的name=hello 没有
4.namespace=”/” action的name=hello 查找到了.
会依次递减搜索
如果到最后都找不到会报404错误
3.默认的action
作用:处理其他action处理不了的路径

配置了这个,当访问的路径,其它的action处理不了时,就会执行name指定的名称的action。

4.action的默认处理类
在action配置时,如果class不写,默认的情况下是
com.opensymphony.xwork2.ActionSupport

如果设置了,那么在当前包下,默认处理action请的的处理类就为class指定的类。

关于常量的配置
default.properties 它声明了struts中的常量。默认加载的。

问题:人为设置常量
1.struts.xml 最多

2.struts.properties 基本不使用
3.web.xml 了解
配置常量,是使用StrutsPrepareAndExecuteFilter的初始化参数来配置的.

struts.action.extension
do,,

后配置的会把前面配置的覆盖掉。

常用常量
struts.action.extension=action,,
这个常量用于指定strus2框架默认拦截的后缀名.

<constant name="struts.i18n.encoding" value="UTF-8"/>
相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码
<constant name="struts.serve.static.browserCache" value="false"/>
false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false
<constant name="struts.devMode" value="true" />
提供详细报错页面,修改struts.xml后不需要重启服务器 (要求)

struts.xml文件的分离:
目的:就是为了阅读方便,在struts.xml文件中通过导入其他的配置文件

Action

1.关于Action类的创建方式的介绍
三种方式
1.POJO类:简单的java对象
指的是没有实现任何接口,没有继承任何父类(除了Object)
优点:无耦合
缺点:所有工作都要自己实现
简单的Java对象(Plain Old Java Objects)
指的是没有实现任何接口,没有继承任何父类(除了Object)


优点:无耦合。
缺点:所以工作都要自己实现。
在struts2框架底层是通过反射来操作:
* struts2框架 读取struts.xml 获得 完整Action类名
* obj = Class.forName("完整类名").newInstance();
* Method m = Class.forName("完整类名").getMethod("execute");
m.invoke(obj); 通过反射 执行 execute方法
2.创建一个类,实现Action接口。com.opensymphony.xwork2.Action
优点:耦合低。提供了五种结果视图,定义了一个行为方法
缺点:所有工作都要自己实现
public static final String SUCCESS = "success";
// 数据处理成功 (成功页面)
public static final String NONE = "none";
// 页面不跳转
return null; 效果一样
public static final String ERROR = "error";
// 数据处理发送错误 (错误页面)
public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
3.创建一个类,继承自ActionSupport类.
com.opensymphony.xwork2.ActionSupport
ActionSupport类实现了Action接口。
优点:表单校验、错误信息设置、读取国际化信息 三个功能都支持.
缺点:耦合度高。
在开发中,第三种会使用的比较多.
如果使用接口的话,SUCCESS常量就可以使用了。

关于action的访问:


1.通过设置method的值,来确定访问action类中的哪一个方法.
<action name="book_add" class="cn.itcast.action.BookAction" method="add"></action>
当访问的是book_add,这时就会调用BookAction类中的add方法。
<action name="book_update" class="cn.itcast.action.BookAction"
method="update"></action>
当访问的是book_update,这时就会调用BookAction类中的update方法。
2.使用通配符来简化配置
1.在struts.xml文件中
<action name="*_*" class="cn.itcast.action.{1}Action" method="{2}"></action>
2.在jsp页面上
book.jsp
<a href="${pageContext.request.contextPath}/Book_add">book add</a><br>
<a href="${pageContext.request.contextPath}/Book_update">book update</a><br>
<a href="${pageContext.request.contextPath}/Book_delete">book delete</a><br>
<a href="${pageContext.request.contextPath}/Book_search">book search</a><br>
product.jsp
<a href="${pageContext.request.contextPath}/Product_add">product add</a><br>
<a href="${pageContext.request.contextPath}/Product_update">product update</a><br>
<a href="${pageContext.request.contextPath}/Product_delete">product delete</a><br>
<a href="${pageContext.request.contextPath}/Product_search">product search</a><br>
当访问book add时,这时的路径是
Book_add,那么对于struts.xml文件中.
第一个星就是
Book
第二个星就是
add
对于{1}Action---->BookAction
对于method={2}--->method=add
使用通配符来配置注意事项:
1.必须定义一个统一的命名规范。
2.不建议使用过多的通配符,阅读不方便。

3.动态方法调用 (了解)
在struts.xml文件中

访问时路径: http://localhost/struts2_day01_2/book!add
就访问到了BookAction类中的add方法。


对于book!add 这就是动态方法调用。
注意:struts2框架支持动态方法调用,是因为在default.properties配置文件中设置了
动态方法调用为true.
struts.enable.DynamicMethodInvocation = true

在struts2框架中获取servlet api
对于struts2框架,不建议直接使用servlet api;

在struts2中获取servlet api有三种方式:
1.通过ActionContext来获取
1.获取一个ActionContext对象。
ActionContext context=ActionContext.getContext();
2.获取servlet api
注意:通过ActionContext获取的不是真正的Servlet api,而是一个Map集合。
1.context.getApplication()
2.context.getSession()
3.context.getParameter();---得到的就相当于request.getParameterMap()
4.context.put(String,Object) 相当于request.setAttribute(String,String);
2.注入方式获取(这种方式是真正的获取到了servlet api)
1.要求action类必须实现提定接口。
ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象
2.重定接口中的方法。
private HttpServletRequest request;
3.声明一个web对象,使用接口中的方法的参数对声明的web对象赋值.
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
扩展:分析其实现:
是使用struts2中的一个interceptor完成的.
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
if (action instanceof ServletRequestAware) { //判断action是否实现了ServletRequestAware接口
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); //得到request对象.
((ServletRequestAware) action).setServletRequest(request);//将request对象通过action中重写的方法注入。
}
3.通过ServletActionContext获取.
在ServletActionContext中方法都是static。
getRequest();
getResposne();

getPageContext();

Result结果类型


<result>标签
1.name
与action中的method的返回值匹配,进行跳转.
2.type
作用:是用于定义跳转方式
对于type属性它的值有以下几种:
在struts-default.xml文件中定义了type可以取的值
<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" />
必会: chain
dispatcher
redirect redirectAction
stream
dispatcher:它代表的是请求转发,也是默认值。它一般用于从action跳转到页面。
chain:它也相当于请求转发。它一般情况下用于从一个action跳转到另一个action。
redirect:它代表的是重定向
它一般用于从action跳转到页面
redirectAction: 它代表的是重定向
它一般用于从action跳转另一个action。
stream:代表的是服务器端返回的是一个流,一般用于下载。
了解: freemarker
velocity
----------------------------------------------------
局部结果页面与全局结果页面
局部结果页面 和 全局结果页面
<action name="result" class="cn.itcast.struts2.demo6.ResultAction">
<!-- 局部结果
当前Action使用 -->
<result name="success">/demo6/result.jsp</result>
</action>
<global-results>
<!-- 全局结果 当前包中 所有Action都可以用-->
<result name="success">/demo6/result.jsp</result>
</global-results>

最后

以上就是热心发带为你收集整理的struts2详解的全部内容,希望文章能够帮你解决struts2详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部