Struts2框架基本采用

 

时间:2017-1-6 16:53

 

修改struts.xml配置文件不欲重新开服务器。

Struts2框架

    一、
        *   介绍Struts2
        *   关于Struts2配置(关于Action配置)
        *   关于Struts2结实类型
    二、
        *   Struts2甩卖要参数
        *   Struts2的类型转换(了解)
        *   Struts2的校验
    三、
        *   Struts2之国际化
        *   Struts2之拦截器
        *   Struts2文本上传与下载
        *   Struts2中ognl与valuestack
    四、
        *   ognl与valuestack
        *   Struts2遭之防表单重复提交
        *   Struts2中的Ajax插件
    五、
        *   练习(增删改查)

——什么是Struts2 

1、Struts2凡是一个要命美之MVC框架,基于Model2设计模型,只能当JavaWeb项目蒙应用。

2、由传统Struts1暨WebWork两只经框架发展使来。

3、Struts2基本职能
    *   允许POJO(Plain Old Java Object)对象作为Action。
    *   Action的excute方法不再和Servlet API耦合,更爱测试。
    *   支持再次多视图技术(JSP、FreeMarker、Velocity)。
    *   基于Spring AOP思想之拦截器机制,更易扩展。
    *   更强大、更便于用的输入校验功能。
    *   整合Ajax支持

4、Struts2核心:WebWork
   
WebWork核心是XWork,XWork提供了不少中心职能:前端拦截器(Interceptor),运行时表单属性验证,类型转换,强大的表达式语言,(OGNL

  • the Object Graph Navigation Language),IoC(Inversion of Control
    反转控制)容器等。

——Struts2底下载和装置

1、到http://struts.apache.org/download.cgi 去下载Struts2最新版本。

2、Struts2目结构
    *   apps:该文件包含了根据Struts2的演示应用。
    *  
docs:该公文夹下富含了Struts2系文档,包括Struts2快速入门、Struts2之文档以及API等文档。
    *  
lib:该公文夹下涵了Struts2框架和着力类库,以及Struts2老三正值插件类库
    *   src:该文件夹下涵了Struts框架的满贯源代码。
        >   core:Struts2的源代码
        >   xwork-core:xwork的源代码

3、开发时尚未必要将lib目录下的jar文件全部复制到路被。
   
可以到:struts-2.3.15.1\apps\struts2-blank\WEB-INF\lib目录下找到必要jar包。

——Struts2之HelloWorld

Struts2的Web项目尽量以JavaEE5.0本,因为Struts2是根据配置文件进行开的。

1、导入jar包
   
struts-2.3.15.1\apps\struts2-blank\WEB-INF\lib目录下找到必要jar包即可。

2、创建index.jsp、hello.jsp页面

3、对Struts2框架进行布置
   
1)web.xml文件被布局前端控制器(核心控制器),其实就是一个Filter,目的是如果Struts2框架生效。
        该过滤器的init()方法加载了Struts2框架必要之布局文件。

        <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>
 

   
2)创建一个struts.xml配置文件,这个是Struts2框架的布文件,目的是一旦Struts2底流水线可以执行。
        名称:struts.xml
        位置:src文件夹下(classes文件夹下)

 

4、创建一个HelloAction类
    要求:在HelloAction类中开创一个返回值是String类型的无参方法。

    public String hello(){

        return “hello”;

    }

5、在struts.xml文件被布置HelloAction

<struts>

    <package
name=”default” namespace=”/” extends=”struts-default”>

        <action name=”hello” class=”com.wyc.action.HelloAction”
method=”hello”>

            <result name=”hello”>/hello.jsp</result>

        </action>

    </package>

</struts>

6、在index.jsp中上加链接,进行测试:
    <a href=”${pageContext.request.contextPath }/hello”
>第一浅采用Struts2</a>

   
在地方栏中输入:http://localhost/struts2_day01/index.jsp,访问过链接,就可以看到HelloAction类中之hello方法执行了,并且超过反到了hello.jsp页面。

7、流程分析:

图片 1

8、手写代码实现Struts2职能
    1)创建一个Filter:StrutsFilter
    2)在web.xml文件中安排StrutsFilter
   
3)在StrutsFilter中截留操作,并访问Action中的艺术,跳反至hello.jsp页面。

=============================================================================
以身作则代码:

struts.xml文件:

<struts>

    <action name=”hello” class=”com.wyc.action.HelloAction”
method=”hello”>

        <result name=”hello”>/hello.jsp</result>

        <result name=”hello2″>/hello2.jsp</result>

    </action>

</struts>


StrutsFilter:

package com.wyc.web.filter;

 

import java.io.File;

import java.io.IOException;

import java.lang.reflect.Method;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

 

public class StrutsFilter implements Filter {

 

    public void destroy() {

 

    }

 

    public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

        // 1、强转

        HttpServletRequest request = (HttpServletRequest)req;

        HttpServletResponse response = (HttpServletResponse)resp;

 

        /*

         * 2.1、得到请求资源路

         */

        // 得到请求路径

        // uri:/Struts_day01_1/hello

        String uri = request.getRequestURI();

        // 得到项目名为

        // contextPath:/Struts_day01_1

        String contextPath = request.getContextPath();

 

 

        // hello

        String path = uri.substring(contextPath.length()+1); 

 

 

        /*

         * 使用path去struts.xml文件被追寻某平<action name=path>

         */

        SAXReader reader = new SAXReader();

        try {

            Document doc = reader.read(new
File(this.getClass().getClassLoader().getResource(“struts.xml”).getPath()));

 

            Element action = (Element)
doc.selectSingleNode(“//action[@name='” + path + “‘]”); //
“//action[‘hello’]”

 

            if(action != null){

                // 得到action元素的class属性和method属性

                String className = action.attributeValue(“class”);

                String methodName = action.attributeValue(“method”);
 

 

                // 通过反射得到Class对象,然后取Method对象

                Class c = Class.forName(className);

                Method method = c.getDeclaredMethod(methodName);
 

 

                // 执行method方法,并收获返回值

                String returnValue = (String)
method.invoke(c.newInstance());

 

 

                //
使用返回的字符串去<action>下查找其子元素result的name属性值,获取与归字符串相同的<result>元素

                Element e = (Element)
action.selectSingleNode(“//result[@name='” + returnValue + “‘]”);

 

                if(e != null){

                    // 表示result存在,可以实行跳转

                    String skipPath = e.getText();

 

 

                    request.getRequestDispatcher(skipPath).forward(request,
response);

                    return;

                }

 

            }

 

        } catch (Exception e) {

            throw new RuntimeException(e);

        }

 

 

        // 3、放行

        chain.doFilter(req, resp);

    }

 

    public void init(FilterConfig arg0) throws ServletException {

 

    }

 

}


HelloAction.java

package com.wyc.action;

 

public class HelloAction {

    public String hello(){

        System.out.println(“hello”);

        return “hello”;

    }

}

=======================================================================

——Struts2之流程分析和工具配置

1、运行流程:
    请求  –>
 StrutsPrepareAndExecuteFilter(核心控制器、核心拦截器、前端控制器、前端拦截器)  –>
 Interceptors(拦截器,实现代码功能,核心是AOP动态代理)  –>
 Action的execute  –>  Result(结果页面)

    拦截器:在struts-default.xml中定义
    执行拦截器:在defaultStack中援拦截器

   
可以经源码级别断点调试,证明拦截器执行了(学会导入源码,选中完整类名,然后ctrl

  • t)。

图片 2

2、手动配置struts.xml文件被提拔操作
    1)复制http://struts.apache.org/dtds/struts-2.3.dtd
       
到拖欠目录中检索dtd文件:struts-2.3.15.1\src\core\src\main\resources
    2)在Windows —— Preferences —— 输入XML —— XML Catalog —— Add
——在Location中填入dtd文件路径 ——Key type选择URI ——
URI中填入(名称空间):http://struts.apache.org/dtds/struts-2.3.dtd ——
OK

    导入DTD时,应该与部署DTD版本相同。

3、关联Struts2之源文件
    Ctrl + Shift + t,输入类名查找对应类,然后关联源码。
    如果是com.opensymphony.xxx,就当xwork-core目录中检索。
    如果是org.apache.struts2.xxx,就在core目录中找寻

4、使用ConfigBroswer插件(了解)
    提供在浏览器被查Struts2配置加载情况。
   
将解压后的struts2/lib/struts2-config-browser-plugin-2.3.7.jar复制到WEB-INF/lib目录下
   
访问:localhost:8080/struts2_day01/config-browser/index.action查看struts2部署加载情况。

——Struts2配置(重点)

1、Struts2布局文件加载顺序:
    1)Struts2框架而想实行,必须先行加载StrutsPrepareAndExecuteFilter
       
在StrutsPrepareAndExecuteFilter类的init()方法中针对Dispatcher进行了初始化操作。
       
在Dispatcher类中定义的init()方法外虽叙了Struts2配置文件的加载顺序:

 

            init_DefaultProperties(); // [1] ——
struts2-core-2.3.15.1.jara包中的org/apache/struts2/default.properties

            init_TraditionalXmlConfigurations(); // [2] ——
struts2-core-2.3.15.1.jara包中的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

            第一独加载的公文:default.properties文件
                作用:定义了Struts2框架中负有常量。
                位置:org/apache/struts2/default.properties

                properties文件定义键值对,定义值。
                XML文件定义关系。

            第二独加载的文本:
                struts-default.xml:
                    作用:配置了bean, interceptor, result等信息。
                    位置:struts2-core-2.3.15.1.jara包中。
                struts-plugin.xml
                    它是struts2框架中所采取的插件的布局文件。
                struts.xml
                    使用struts2框架所采用的配置文件。

            第三独加载的文本:自定义之struts.properties
               
可以从定义常量,而无是故struts.properties中定义的常量。

            第四个加载的公文:web.xml

        在付出中,后加载文件被的配置会将先加载文件中之部署覆盖。

——关于Action的配置(重点)

1、struts.xml
    1)<package>:
            用于声明一个承保,管理Action类。(通常情况下一个模块一个package)
            Struts2所有action都通过package管理。
           
struts-default是struts-default.xml定义的一个package,其中蕴藏大量拦截器和结果集。
            Action的拜访路径 = namespace + action的name属性

        *   name
            包名,用于声明一个包名,包名不能够还。

        *   namespace
           
与<action>元素的name属性合并,确定了一个唯一可拜Action类的路子。
 
        *   extends
            表示继续的包名。

        *   abstract
            可以取值为true或false,(true)表示足用于后续。

    2)<action>
            用于声明一个Action类。
        *   name
           
表示一个Action类的称谓,在和一个包内,Action的称是绝无仅有的。
           
它跟<package>元素中之namespace属性确定了一个做客Action类的路径。

        *   class
            Action类的完好包名

        *   method(请求处理方式)
            表示如访问的Action类中之章程的称。

    3)<result>
            用于确定返回结果。

        *   name
            与Action类中之计返回值做对比,确定跳反路径。

        *   type
            确定跳转处理方式。

2、关于Action配置外细节
    1)默认值:
        <package namespace=”默认值”>
            *   namespace的默认值是”/”;

        <action class=”默认值” method=”默认值”>
            *   class的默认值:com.opensymphony.xwork2.ActionSupport
            *   method默认值:ActionSupport类中的execute()方法

        <result name=”默认值”>
            *   name的默认值是execute()方法的回值return
SUCCESS;,也尽管是”success”。

    2)关于访问Action的路问题
        现在的Action配置是:
            <package name=”default” namespace=”/”
extends=”struts-default”>
                <action name=”hello”
class=”com.wyc.action.DefaultAction”>
                    <resule>/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的name属性” />
       
配置是元素后,当所有的Action无法处理访问路径时,会尽name指定的<action>元素。
        只当同包中行之有效。

    4)Action的默认处理接近
       
在Action配置时,如果无写class属性,默认是:comm.opensymphony.xwork2.ActionSupport。
        <default-class-ref
class=”com.wyc.action.DefaultAction”/>
       
配置是元素后,在目前包中,如果<action>元素不写class属性,那么默认处理Action请求的拍卖接近即为class指定的近乎。
        只当同包中有效。

3、关于Struts2备受的常量配置
    在default.properties文件被扬言了Struts2面临的常量。

    可以在怎样文件被布局常量?
        *   struts.xml(应用最多)
            >   <constant name=”常量名称”
value=”常量值”></constant>
        *   struts.properties(基本不用)
        *   web.xml(了解)
            >  
在<filter>元素下通过<init-param>初始化参数进行安排。
            >  
在web.xml文件中布置的常量会覆盖struts.xml文件被的配备。

    1)常用常量:
        *   struts.action.extension=action,,
            这个常量用于指定Struts2框架默认拦截的继缀名,例如:
                localhost/Struts2_day01/hello.action(可以看)
                localhost/Struts2_day01/hello(可以拜)
                localhost/Struts2_day01/hello.abc(不得以看)
            在struts.xml文件被装置:
                <constant name=”struts.action.extension”
value=”abc,,”></constant>
            运行结果如下:
                localhost/Struts2_day01/hello.action(不得以看)
                localhost/Struts2_day01/hello(可以拜)
                localhost/Struts2_day01/hello.abc(可以看)

        *   struts.i18n.encoding=UTF-8
           
相当于request.setCharacterEncoding(“UTF-8”);,可以缓解POST请求的乱码问题。

        *   struts.serve.static.browserCache=false
           
false表示不缓存,true表示浏览器会缓存静态内容,产品环境设置true,开发环境设置false。

        *    struts.devMode=true
            DevelopModel,开发模式,相当给热部署。
            修改struts.xml文件后非需重开服务器。
            提供详实报错页面,而不是独自显示404齐错误信息。

        *   struts.configuration.xml.reload=true
            当struts的部署文件修改后,系统是否自动重新加载该公文,默认值为false(生产环境下用),开发阶段最好打开 

4、struts.xml文件的分离
   
因为多独模块的package太多会潜移默化看,为了好阅读,所以可以为一个模块保存一个布局文件,将多独package分离,使用时引入配置文件即可。
    引入方式:
        <include file=”文件路径” />

——Action类的始建方式

1、有三栽创建方式:
    1)创建一个POJO类(直接创造一个class)
        POJO类表示不曾实现其他接口,没继续任何父类,除了Object类。
        优点:无耦合。
        缺点:所有工作且使自己实现,代码量大。

        底层通过反射来实现:
            Struts2框架读取struts.xml获得完全Action类名 —— object =
Class.forName(完整类名).newInstance() —— Method m =
obj.getMethod(“execute”); —— m.invoke(obj);
通过反射执行execute()方法。

    2)实现Action接口
        为了给用户支出之Action更加正规,Struts2供了一个Action接口。
        创建一个像样,实现Action接口:com.opensymphony.xwork2.Action
       
优点:耦合低,提供了五种植逻辑视图(字符串常量),定义了一个行为方式(execute())。
        缺点:所有工作还设团结实现,但是都落标准规范。

        五栽逻辑视图:(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”;    //
主要权力认证(登录页面)

        示例代码:
            public class HelloAction implements Action {

                public String execute(){

                    System.out.println(“hello”);

                    return “success”;

                }

            }

    3)继承ActionSupport(推荐)
        com.opensymphony.xwork2.ActionSupport类实现了Action接口。
       
优点:功能比较完美,ActionSupport支持校验(实现Validateable接口)、错误信息设置、支持国际化(实现LocaleProvider接口)
        缺点:耦合度高。

        示例代码:

            public class HelloAction2 extends ActionSupport {

                @Override

                public String execute(){

                    System.out.println(“hello”);

                    // return “success”;

                    return NONE; // 相当于return null;

                }

            }

——关于Action的访问

如没有点名method属性,则默认执行execute()方法。

1、通过设置method的属于性值,来规定访问action类中之呐一个方式。

    <package name=”book” namespace=”/” extends=”struts-default”>

        <action name=”book_add” class=”com.wyc.action.BookAction”
method=”add”></action>

        <action name=”book_update” class=”com.wyc.action.BookAction”
method=”update”></action>

        <action name=”book_delete” class=”com.wyc.action.BookAction”
method=”delete”></action>

        <action name=”book_search” class=”com.wyc.action.BookAction”
method=”search”></action>

    </package>

    当访问book_add时,会调用BookAction类中之add方法,以此类推。

2、使用通配符来简化配置
    1)在struts.xml文件中配备:
        <action name=”*_*” class=”com.wyc.action.{1}Action”
method=”{2}”></action>

    2)在JSP页面中创造两只页面:book.jsp、product.jsp
        book.jsp:
            <body>

                <a href=”${pageContext.request.contextPath
}/Book_add”>book add</a>

                <a href=”${pageContext.request.contextPath
}/Book_update”>book update</a>

                <a href=”${pageContext.request.contextPath
}/Book_delete”>book delete</a>

                <a href=”${pageContext.request.contextPath
}/Book_search”>book search</a>

            </body>

        product.jsp:
            <body>

                <a href=”${pageContext.request.contextPath
}/Product_add”>product add</a>

                <a href=”${pageContext.request.contextPath
}/Product_update”>product update</a>

                <a href=”${pageContext.request.contextPath
}/Product_delete”>product delete</a>

                <a href=”${pageContext.request.contextPath
}/Product_search”>product search</a>

            </body>

        当访问book
add时,这时的不二法门是:Book_add,那么对struts.xml文件中首先只“*”就是Book,第二个“*”就是add。
       
对于{1}Action就相当给BookAction,对于method=”{2}”,就一定给method=”add”

    3)、使用通配符配置时注意事项:
       *   必须定义一个合的命名规范
       *   不建议利用过多之通配符,影响阅读性

3、动态方法调用(了解)
    在struts.xml文件被布置:
        <action name=”book”
class=”com.wyc.action.BookAction”></action>
    访问: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获取
        *   获取一个ActionContext对象
            >   ActionContext context = ActionContext();
        *   获取Servlet API
            >   通过ActionContext获取到之无是真正的Servlet
API,而是一个Map集合,集合中存放的便是目标(用键值对)存放的数据。
    2、通过注入方式得到
    3、通过ServletActionContext获取


1、Action访问Servlet
    在Action中因故解耦和艺术使用ActionContext对象间接访问Servlet API。
    在Struts2中Action API已经和Servlet API解耦和了(没有因关系)。
    Servlet API常见操作:
        *   获取表单提交请求参数
        *   向request, session, application三独作用域存取数据

    开发被答应先利用ActionContext,这样好免耦合。

ActionContext方法:
    *   Map  getParameters()
        获取有请求参数的Map集合。
        Map底层是一个HashMap。

    *   void  put(String key, Object value)
        对request域存放数据。

    *   Map  getApplication()
        获取ServletContext数据Map,对运用访问存取数据。

    *   Map  getSession()
        获取session数据Map,对Session范围存取数据。

/*

 * 通过ActionContext获取Servlet API

 */

public class ServletDemo1Action extends ActionSupport {

 

    @Override

    public String execute() throws Exception {

        /*

         * 1、获取ActionContext对象

         */

        ActionContext context = ActionContext.getContext();

 

        /*

         * 2、获取Servlet API

         */

 

        // 获取application中数据

        Map<String, Object> applicationMap =
context.getApplication();

        System.out.println(“application: ” +
applicationMap.get(“aname”));

 

        // 获取session中数据

        Map<String, Object> sessionMap = context.getSession();

        System.out.println(“session: ” + sessionMap.get(“sname”));

 

        return NONE;

    }

}


2、使用接口注入的法操作Servlet API(耦合)
    这种方式能够真的取得到Web对象。

    步骤:
        1)要求Action类必须贯彻指定接口:
            ServletContextAware接口:注入ServletContext对象
            ServletRequestAware接口:注入request对象
            ServletResponseAware接口:注入response对象
        2)重写接口中指定的方式:
            public void setServletRequest(HttpServletRequest request)
        3)声明一个web对象,使用接口中的法子对声明的web对象赋值
            private HttpServletRequest request;
            public void setServletRequest(HttpServletRequest request){
                this.request = request;
            }

    示例代码:

        /*

         * 通过注入方式取得Servlet API

         */

        public class ServletDemo2Action extends ActionSupport implements
ServletRequestAware {

            private HttpServletRequest request;

 

            public String execute() {

 

                System.out.println(request.getParameter(“username”));

 

                return null;

            }

 

            /*

             * 实现接口方法

             */

            public void setServletRequest(HttpServletRequest request) {

                this.request = request;

            }

        }

    分析其促成方式:
        通过Struts2的interceptor实现的。
        struts-default.xml:
            <interceptor name=”servletConfig”
class=”org.apache.struts2.interceptor.ServletConfigInterceptor”/>
        源码:
            org.apache.struts2.interceptor.ServletConfigInterceptor拦截器中的intercept()方法:
                public String intercept(ActionInvocation invocation)
throws Exception {

                    final Object action = invocation.getAction();

                    final ActionContext context =
invocation.getInvocationContext();

 

                    if (action instanceof ServletRequestAware) {    //
判断Action类是否贯彻了ServletRequestAware接口

                        HttpServletRequest request =
(HttpServletRequest) context.get(HTTP_REQUEST);    // 得到request对象
                        // 因为action是Object类型,所以要强转 

                        ((ServletRequestAware)
action).setServletRequest(request);    //
将request对象通过Action中重复写的办法注入,

                    }
                    ……. 

                    return invocation.invoke();

                }


3、通过ServletActionContext获取Servlet API
    在ServletActionContext中艺术都是静态的。
   
该类的父类是ActionContext,其中间代码也是经过ActionContext获取到之。

    方法大概:
        static PageContext  getPageContext()
            获取PageContext对象。

        static HttpServletRequest  getRequest()
            获取request对象。

        static HttpServletResponse  getResponse()
            获取response对象。

        static ServletContext  getServletContext()
            获取ServletContext对象。

       
没有getSession()方法,但是可通过getPageContext().getSession()获得。
        有矣pageContext,其它八单对象还可以得到。

    示例代码:

        /*

         * 通过ServletActionContext获取Servlet API

         */

        public class ServletDemo3Action extends ActionSupport {

            public String execute() {

 

                HttpServletRequest request =
ServletActionContext.getRequest();

 

                System.out.println(request.getParameter(“username”));

 

                return null;

            }

        }

——Result结果类型

在:struts-default.xml文件中定义。

1、理解处理结果
    *   Action处理终结用户请求后,会回一个日常字符串。
    *   整个普通字符串就是一个逻辑视图名。
    *   Struts2基于逻辑视图名,决定运行哪个结果。
    *   Struts2处理结果使用<result>元素进行部署。
        >  
局部结果:将<result>作为<action>的子元素进行配置
        >  
全局结果:将<result>作为<global-result>的子元素进行部署
    *   配置<result>元素通常用指定两单特性
        >   name:该属性指定安排逻辑视图名
        >   type:该属性指定结果类型(跳转方式、处理方式)

2、<result>标签属性:
    *   name属性:
        与action中之method的回值相当,获取超过反路径,进行跳转。

    *   type属性:
        作用是概念跳转方式。
       
对于type属性的取值范围来以下几种植:(可以于struts-default.xml文件中查)
        >  
chain:请求转发,一般情况下用于从一个Action跳反至任何一个Action。
        >  
dispatcher:请求转发,是默认值,一般用于自Action跳反到jsp页面。
        >  
freemarker:模板技术,将页面及数据分离,通过freemarker将数据和页面整合及联合。
        >   httpheader
        >   plainText
        >   redirect:重定向,一般用于自Action重定向到页面。
        >  
redirectAction:重定向,一般用来自Action重定向到另外一个Action。
            redirectAction有个别个参数:
                actionname:指定目标Action的号,它是默认属性。
                namespace:用来指定目标Action的称号空间,默认为”/”。 
        >   stream:代表于服务器端返回一个流,一般用于下载。
        >   velocity:模板引擎
        >   xslt

    <package name=”struts-default” abstract=”true”>

        <result-types>

            <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” />

        </result-types>
    </package>

    必须控制:
        chain、dispatcher、redirect、redirectAction、stream
        两单换车、两单又定向、一个流动。 
    了解:freemarker、velocity

3、局部结果页面和全局结果页面
   
当多单action中还是故了一如既往之result,这时可以管result定义为全局结果页面。

<struts>

    <package name=”default” namespace=”/”
extends=”struts-default”>

 

        <!– 全局结果,当前package中的Action都得以应用 –>

        <global-results>

            <result>/demo2_success.jsp</result>

            <!– 当是多独result时,以后当之result为准 –>

            <result>/demo1_success.jsp</result>

        </global-results>

        <action name=”demo1″
class=”com.wyc.action.ServletDemo1Action”>

            <!– 局部结果,仅限当前Action使用 –>

            <result>/demo1_success.jsp</result>

        </action>

        <action name=”demo2″
class=”com.wyc.action.ServletDemo2Action”>
            <!–
如果手上action下没有result,那么即便会见到全局中觅 –>
        </action>

        <action name=”demo3″
class=”com.wyc.action.ServletDemo3Action”></action>

    </package>

</struts>

——练习:登录操作

1、需求:
   
用户通过表单进行登录,登陆失败将页面转发到login.jsp,并显示错误信息。
   
登录成功后拿用户存储到Session中,重定向到success.jsp页面,并显示用户信息。

2、所待页面
    login.jsp
        >   提供登录表单
        >   登录失败时显得错误信息
    success.jsp
        >   登录成功后经过session获取用户信息并出示到页面
 
3、所需类
    LoginAction
        >   获取Servlet API,获取表单信息
        >   校验用户信息
            >   登录成功,重定向到success.jsp
            >   登录失败,转发到login.jsp
    User类
        实体类
        >   private String username;
        >   private String password;

——总结

    1、Struts2环境搭建
        *   导入jar包:
            >   struts2/apps/strut_blank.war文件
        *   web.xml如何安排:
            >   配置StrutsPrepareAndExecuteFilter

        *   struts.xml如何布置:
            >   在src目录下(classes)

    2、Struts2运行流程
        *   如何通过反射执行action

    3、配置文件加载顺序
        *   每个配置文件之用途是呀
        1)default.properties
        2)struts-default.xml  struts-plugin.xml  struts.xml
        3)struts.properties
        4)web.xml 

    4、<package><action><result>元素的部署
        *   package:用于管理action

            >   name:包名,唯一
            >   namespace:与action的name属性确定访问action的不二法门。
            >   extends:继承的包名,一般持续struts-default
        *   action:声明一个action
            >   name:action名称,在跟一个包下非克重名
            >   class:action完整类名,默认是ActionSupport
            >  
method:action类中之方名,要求无参,返回值为String,默认值为execute
        *   result:结果视图
            >  
name:与action的method方法的返值进行匹配确定跳反路径
            >   type:跳转方式
                在struts-default.xml文件被定义:
                    chain, dispatcher, redirect, redirectAction,
stream
    5、Action的老三种创建方式
        *   POJO

        *   实现Action接口

        *   继承ActionSupport类

    6、指定method的调用方法
        *   指定method属性
        *   通配符

        *   动态方法调用

    7、Action访问Servlet API
        *   ActionContext

        *   访问指定接口(注入)

        *   ServletActionContext

    8、结果类型
        *   <result>标签的type属性取值。
    9、自定义常量
        *   以struts.xml文件被定义
            >   <constant name=”” value=”” />
        *   在struts.properties文件中定义
        *   于web.xml文件中定义 
            >   <init-param></initparam>

 

——Struts2基本知识点和问题

1、struts2在web.xml配置的Filter叫什么?

2、struts2之Action有几乎栽书写道?

3、能否在struts2底Action定义多个事情方法?如何完成不等的请求访问Action的不等措施?

4、自定义struts2类型转换器实现实现谁接口,如何布置部分转换器和全局转换器?

5、struts2底国际化信息文件发出啊几看似?

6、xml进行struts2请求参数校验时,指定方法的校验文件和装有方校验文件命名规则是啊?

7、struts2底Action中哪使ServletAPI?

8、简单描述struts2之值栈对象的里边存储结构

9、addFieldError、addActionError和addActionMessage 有哪里区别?

10、struts2遭发出哪些常用结果类型?你用过怎样?

11、你是不是以struts2开销被 自定义了拦截器,实现啊效力?

12、struts2 UI主题来安?你用了怎样? 底层实现是什么?

13、struts2 和 struts1 有何区别?

14、struts2 中如何行使 Ajax ?

15、struts2 的拦截器使用了哪种设计模式 ?

 

——关于Struts2面临约定访问规则

自打struts2.1始,struts2 引入了Convention插件来支撑零配置

用约定无需struts.xml或者Annotation配置

需要 struts2-convention-plugin-2.3.7.jar 、asm-*.jar(三个)

插件会自动搜索action、actions、struts、struts2确保下有Java类

富有实现了com.opensymphony.xwork2.Action底Java类

具备类似名以Action结尾的Java类

下面类名都符合Convention插件

cn.itcast.struts2.HelloAction

cn.itcast.actions.books.BookSearchAction

cn.itcast.struts.user.UserAction

cn.itcast.estore.action.test.LoginAction

 

 

struts2-convention-plugin-2.3.7.jar 中struts-plugin.xml重要常量

<constant name=”struts.convention.package.locators”
value=”action,actions,struts,struts2″/>  默认扫描包

<constant name=”struts.convention.exclude.packages”
value=”org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*”/>
不扫描

<constant name=”struts.convention.action.suffix” value=”Action”/>
默认扫描以Action结尾的好像

<constant name=”struts.convention.result.path”
value=”/WEB-INF/content/”/> 结果result页面存放位置

<constant name=”struts.convention.classes.reload” value=”false” />
Action类文件再次活动加载

 

若果Action类名包含Action后缀,将Action后缀去丢

拿Action类名的驼峰写法,转成被写道写法

例如:

cn.itcast.struts2.HelloAction 映射到 /hello.action

cn.itcast.actions.books.BookSearchAction  映射到
/books/book-search.action

cn.itcast.struts.user.UserAction 映射到 /user/user.action

cn.itcast.estore.action.test.LoginAction 映射到 /test/login.action

 

默认情况下,Convention总会到Web应用的WEB-INF/content路径下一定结果资源

<constant name=”struts.convention.result.path”
value=”/WEB-INF/content/”/>

约定: actionName + resultCode + suffix 

例如:

访问cn.itcast.struts.user.UserAction返回success

Convention优先采取 WEB-INF/content/user/user-success.jsp

如果user-success.jsp不存在,会使用user-success.html

如果user-success.html不存在,会使用user.jsp

相关文章