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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值