struts2 基本配置和介绍

来源:互联网 发布:游戏王gx结局知乎 编辑:程序博客网 时间:2024/06/06 02:30

Struts2配置 ———源码位置 day31_struts2_3

1. struts2配置文件加载顺序

    struts2框架要能执行,必须先加载StrutsPrepareAndExecuteFilter.    在StrutsPrepareAndExecuteFilter的init方法中对Dispatcher进行了初始化.    在Dispatcher类中定义的init方法内就描述了struts2配置文件加载的顺序        init_DefaultProperties(); // [1]   ----------  org/apache/struts2/default.properties         init_TraditionalXmlConfigurations(); // [2]  --- struts-default.xml,struts-plugin.xml,struts.xml        init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties         init_CustomConfigurationProviders(); // [5]  ----- 自定义配置提供        init_FilterInitParameters() ; // [6] ----- web.xml         init_AliasStandardObjects() ; // [7] ---- Bean加载      1. default.properties 文件        作用:定义了struts2框架中所有常量        位置: org/apache/struts2/default.properties      2. struts-default.xml        作用:配置了bean,interceptor,result等。        位置:在struts的core核心jar包.          struts-plugin.xml            它是struts2框架中所使用的插件的配置文件。          struts.xml                          我们使struts2所使用的配置文件。     3. 自定义的struts.properties        就是可以自定义常量。     4. web.xml         在开发中,后加载文件中的配置会将先加载文件中的配置覆盖。         default.properties         struts-default.xml         struts.xml

2. 关于Action 的配置

1. <package> 作用: 用于生命一个包,方便管理action    1.name     它用于声明一个包名,包名不能重复,也就是它是唯一的。     2.namespace  它与action标签的name属性合并确定了一个唯一访问action的路径。    3.extends  它代表继承的包名。    4.abstrace 它可以取值为true/false,如果为true,代表这个包是用于被继承的。2. <action>  用于声明 一个action    1.name  就是action的一个名称,        它是唯一的(在同包内) 它与package中的namespace确定了访问action的路径。    2.class Action类的全名    3.method 要访问的Action类中的方法的名称,方法无参数 ,返回值为String.    3.<result> 用于确定返回结果类型        1.name  它与action中的方法返回值做对比,确定跳转路径。3. 关于action配置其它细节:    1.关于默认值问题        <package namespace="默认值"> namespace的默认值是""        <action class="默认值"  method="默认值">            class的默认值是  com.opensymphony.xwork2.ActionSupport            method的默认值是  execute        <result\d   X name="默认值"> name的默认值是 "success"           2.关于访问action的路径问题           现在的action的配置是:        <package name="default" namespace="/" extends="struts-default">            <action name="hello" class="cn.itcast.action.DefaultAction">                <result>/hello.jsp</result>            </action>        </package>        当我们输入:        http://localhost/struts2_day01_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处理不了的路径。        <default-action-ref name="action的名称" />        配置了这个,当访问的路径,其它的action处理不了时,就会执行name指定的名称的action。    4.action的默认处理类        在action配置时,如果class不写。默认情况下是 com.opensymphony.xwork2.ActionSupport。        <default-class-ref class="cn.itcast.action.DefaultAction"/>        如果设置了,那么在当前包下,默认处理action请的的处理类就为class指定的类。

关于常量配置

default.properties 它声明了struts中的常量。问题:人为设置常量,可以在哪些位置设置 ?    1.struts.xml(应用最多)        <constant name="常量名称" value="常量值"></constant>    2.struts.properties(基本不使用)              3.web.xml(了解)        配置常量,是使用StrutsPrepareAndExecuteFilter的初始化参数来配置的.        <init-param>            <param-name>struts.action.extension</param-name>            <param-value>do,,</param-value>        </init-param>常用常量 :    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文件中通过    <include file="test.xml"/>导入其它的配置文件。

Action

  1. 底层实现:
    struts2矿建底层是通过反射来操作:        1.  struts2框架  读取struts.xml 来获取action 类名,        2.  Obj = class.forName("完整类名").newInstance();        3.  Method m = Class.forName("完整类名").getMethod("execute");               m.invoke(obj);         同过反射执行execute方法
  1. 关于Action类的创建方式介绍:
    三种方式:        1. 创建一个POJO 类(Plain Old Java Objects)            没有继承任何父类(除了Object)            优点:无耦合            缺点:功能需要自己实现,麻烦        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. 创建一个类,继承ActionSupprtcom.opensymphony.xwork2.ActionSupport            ActionSupport类实现了Action借口            优点:表单校验、错误信息设置、读取国际化信息 三个功能都支持.            缺点:耦合度高。            (一般使用这个比较多)
  1. 关于aciton 的访问:
    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><ahref="${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文件中<action name="book" class="cn.itcast.action.BookAction"></action>访问时路径: http://localhost/struts2_day01_2/book!add

就访问到了BookAction类中的add方法。

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

struts2 框架中获取 servlet 中 的request ,session ,servlet ,response 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 中的结果类型

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

3.局部结果页面与全局结果页面

    局部结果页面 和 全局结果页面 
    <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>
0 0