Struts二框架基本使用

 

时间:2017-1-6 16:53

 

修改struts.xml配置文件不需求重启服务器。

Struts2框架

    一、
        *   介绍Struts2
        *   关于Struts2配置(关于Action配置)
        *   关于Struts贰结出类型
    二、
        *   Struts2甩卖请求参数
        *   Struts2的类型转换(了然)
        *   Struts2的校验
    三、
        *   Struts二的国际化
        *   Struts二的拦截器
        *   Struts二文本上传与下载
        *   Struts2中ognl与valuestack
    四、
        *   ognl与valuestack
        *   Struts2中的防止表单重复提交
        *   Struts2中的Ajax插件
    五、
        *   演习(增加和删除改查)

——什么是Struts2 

1、Struts贰是多个卓殊优秀的MVC框架,基于Model二设计模型,只可以在JavaWeb项目中动用。

二、由守旧Struts壹和WebWork三个经典框架发展而来。

三、Struts二主干职能
    *   允许POJO(Plain Old Java Object)对象作为Action。
    *   Action的excute方法不再与Servlet API耦合,更便于测试。
    *   援助越来越多视图技术(JSP、Free马克尔、Velocity)。
    *   基于Spring AOP思想的拦截器机制,更易扩大。
    *   更强大、更易用的输入校验成效。
    *   整合Ajax支持

4、Struts2核心:WebWork
   
WebWork宗旨是XWork,XWork提供了成都百货上千主导功用:前端拦截器(Interceptor),运营时表单属性验证,类型转换,强大的表明式语言,(OGNL

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

——Struts二的下载和设置

1、到http://struts.apache.org/download.cgi 去下载Struts二新颖版本。

2、Struts二目录结构
    *   apps:该公文包罗了依照Struts二的演示应用。
    *  
docs:该文件夹下包蕴了Struts贰城门失火文书档案,包罗Struts二飞快入门、Struts二的文书档案以及API等文书档案。
    *  
lib:该公文夹下包罗了Struts贰框架和大旨类库,以及Struts2第2方插件类库
    *   src:该公文夹下包罗了Struts框架的总体源代码。
        >   core:Struts二的源代码
        >   xwork-core:xwork的源代码

三、开发时没须求将lib目录下的jar文件整体复制到项目中。
   
可以到:struts-2.3.15.1\apps\struts2-blank\WEB-INF\lib目录下找到要求jar包。

——Struts2之HelloWorld

Struts贰的Web项目尽量使用JavaEE五.0本子,因为Struts二是基于配置文件进行支付的。

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

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

3、对Struts2框架举行配备
   
一)web.xml文件中配备前端控制器(核心控制器),其实正是三个Filter,目标是使Struts二框架生效。
        该过滤器的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>
 

   
②)创造贰个struts.xml配置文件,那一个是Struts2框架的安顿文件,目标是使Struts二的流水生产线能够进行。
        名称:struts.xml
        地点:src文件夹下(classes文件夹下)

 

肆、创制一个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>

陆、在index.jsp中添加链接,实行测试:
    <a href=”${pageContext.request.contextPath }/hello”
>第3遍使用Struts二</a>

   
在地点栏中输入:http://localhost/struts2_day01/index.jsp,访问超链接,就能够看看HelloAction类中的hello方法执行了,并且跳转到了hello.jsp页面。

七、流程分析:

图片 1

八、手写代码落成Struts二功力
    一)创立1个Filter:StrutsFilter
    ②)在web.xml文件中布局StrutsFilter
   
三)在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;

 

        /*

         * 二.一、获得请求财富路径

         */

        // 获得请求路径

        // 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文件中检索某1<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的流水生产线分析与工具配置

壹、运行流程:
    请求  –>
 StrutsPrepareAndExecuteFilter(核心控制器、宗旨拦截器、前端控制器、前端拦截器)  –>
 Interceptors(拦截器,达成代码功用,焦点是AOP动态代理)  –>
 Action的execute  –>  Result(结果页面)

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

   
能够透过源码级别断点调试,评释拦截器执行了(学会导入源码,选中完整类名,然后ctrl

  • t)。

图片 2

贰、手动配置struts.xml文件中升迁操作
    1)复制http://struts.apache.org/dtds/struts-2.3.dtd
       
到该目录中找找dtd文件:struts-贰.三.一伍.一\src\core\src\main\resources
    贰)在Windows —— Preferences —— 输入XML —— XML Catalog —— Add
——在Location中填入dtd文件路径 ——Key type选拔U奥迪Q5I ——
UHavalI中填入(名称空间):http://struts.apache.org/dtds/struts-2.3.dtd ——
OK

    导入DTD时,应该和配置DTD版本一样。

三、关联Struts二的源文件
    Ctrl + Shift + t,输入类名查找对应类,然后关联源码。
    要是是com.opensymphony.xxx,就在xwork-core目录中搜寻。
    假如是org.apache.struts贰.xxx,就在core目录中找找

4、使用ConfigBroswer插件(了解)
    提供在浏览器中查阅Struts二安顿加载景况。
   
将解压后的struts2/lib/struts二-config-browser-plugin-二.叁.七.jar复制到WEB-INF/lib目录下
   
访问:localhost:8080/struts2_day01/config-browser/index.action查看struts二配备加载情形。

——Struts2配置(重点)

1、Struts二铺排文件加载顺序:
    一)Struts二框架要想实行,必须先加载StrutsPrepareAndExecuteFilter
       
在StrutsPrepareAndExecuteFilter类的init()方法中对Dispatcher进行了初始化操作。
       
在Dispatcher类中定义的init()方法内就讲述了Struts二布置文件的加载顺序:

 

            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文件定义关系。

            第1个加载的文书:
                struts-default.xml:
                    作用:配置了bean, interceptor, result等信息。
                    位置:struts2-core-2.3.15.1.jara包中。
                struts-plugin.xml
                    它是struts二框架中所使用的插件的安顿文件。
                struts.xml
                    使用struts二框架所利用的配备文件。

            第多个加载的文本:自定义的struts.properties
               
能够自定义常量,而不是用struts.properties中定义的常量。

            第伍个加载的文书:web.xml

        在支付中,后加载文件中的配置会将先加载文件中的配置覆盖。

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

1、struts.xml
    1)<package>:
            用于声多美滋(Dumex)(Karicare)个包,管理Action类。(平时境况下3个模块一个package)
            Struts2所有action都通过package管理。
           
struts-default是struts-default.xml定义的二个package,当中含有多量拦截器和结果集。
            Action的访问路径 = namespace + action的name属性

        *   name
            包名,用于声爱他美(Aptamil)(Beingmate)个包名,包名不可能重新。

        *   namespace
           
与<action>成分的name属性合并,明确了2个唯一能够访问Action类的门道。
 
        *   extends
            表示继续的包名。

        *   abstract
            能够取值为true或false,(true)表示能够用于后续。

    2)<action>
            用于声美赞臣(Meadjohnson)(Aptamil)个Action类。
        *   name
           
表示1个Action类的名称,在同3个包内,Action的名目是绝无仅有的。
           
它与<package>成分中的namespace属性鲜明了3个访问Action类的路线。

        *   class
            Action类的完整包名

        *   method(请求处理办法)
            表示要访问的Action类中的方法的名称。

    3)<result>
            用于明确重临结果。

        *   name
            与Action类中的方法重回值做相比,鲜明跳转路径。

        *   type
            分明跳转处理情势。

二、关于Action配置其余细节
    1)默认值:
        <package namespace=”默认值”>
            *   namespace的暗许值是”/”;

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

        <result name=”默认值”>
            *   name的暗中认可值是execute()方法的归来值return
SUCCESS;,也正是”success”。

    二)关于访问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类。

        因为:Struts第22中学的Action被访问时,它会首先查找:
            1: namespace=”/a/b/c”    action的name=hello,未有找到
            二: namespace=”/a/b”       action的name=hello,未有找到
            3: namespace=”/a”          action的name=hello,未有找到
            4: namespace=”/”            action的name=hello,找到了

            即使最终也招来不到,会报40四荒谬。

    三)默许的拍卖请求Action
        功能:处理别的Action处理不了的路径。
        <default-action-ref name=”action的name属性” />
       
配置那几个因素后,当全数的Action不大概处理访问路径时,会执行name钦点的<action>元素。
        只在同包中央银立见成效。

    四)Action的私下认可处理类
       
在Action配置时,固然不写class属性,私下认可是:comm.opensymphony.xwork二.ActionSupport。
        <default-class-ref
class=”com.wyc.action.DefaultAction”/>
       
配置这么些因素后,在脚下包中,假使<action>成分不写class属性,那么私下认可处理Action请求的拍卖类就为class钦赐的类。
        只在同包中立竿见影。

三、关于Struts第22中学的常量配置
    在default.properties文件中宣称了Struts2中的常量。

    能够在如何文件中安插常量?
        *   struts.xml(应用最多)
            >   <constant name=”常量名称”
value=”常量值”></constant>
        *   struts.properties(基本不用)
        *   web.xml(了解)
            >  
在<filter>元素下通过<init-param>开首化参数举办安插。
            >  
在web.xml文件中布局的常量会覆盖struts.xml文件中的配置。

    一)常用常量:
        *   struts.action.extension=action,,
            那个常量用于钦赐Struts二框架暗中同意拦截的后缀名,例如:
                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-八”);,可以化解POST请求的乱码难点。

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

        *    struts.devMode=true
            DevelopModel,开发形式,也便是热安顿。
            修改struts.xml文件后不需求重启服务器。
            提供详实报错页面,而不是只显示40四等错误新闻。

        *   struts.configuration.xml.reload=true
            当struts的配备文件修改后,系统是还是不是自动重新加载该公文,默许值为false(生产条件下行使),开发阶段最棒打开 

四、struts.xml文件的分离
   
因为多个模块的package太多会影响阅读,为了方便阅读,所以能够让一个模块保存1个安顿文件,将多少个package分离,使用时引入配置文件即可。
    引入格局:
        <include file=”文件路径” />

——Action类的创建格局

一、有三种创设方式:
    壹)成立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.xwork贰.Action
       
优点:耦合低,提供了七种逻辑视图(字符串常量),定义了叁个行事艺术(execute())。
        缺点:全数工作都要团结实现,然则已经获取标准规范。

        多种逻辑视图:(Action处理多少后展开页面跳转)
            public static final String SUCCESS = “success”;    //
数据处理成功(成功页面)
            public static final String NONE = “none”;    //
页面不跳转,与return null 效果同样
            public static final String E福睿斯RO奥德赛 = “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的访问

万1未有点名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、使用通配符来简化配置
    一)在struts.xml文件中配备:
        <action name=”*_*” class=”com.wyc.action.{1}Action”
method=”{2}”></action>

    二)在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文件中第2个“*”就是Book,第二个“*”就是add。
       
对于{1}Action就一定于BookAction,对于method=”{二}”,就相当于method=”add”

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

叁、动态方法调用(掌握)
    在struts.xml文件中配备:
        <action name=”book”
class=”com.wyc.action.BookAction”></action>
    访问:http://localhost/Struts2_day01_2/book!add
    就足以访问到BookAction类中的add方法了。

    book!add就是动态方法调用,叹号后边写的正是艺术名。

    注意:
       
Struts二框架协助动态方法调用,能够在default.properties中装置动态方法调用为true
        struts.enable.DynamicMethodInvocation = true

——在Struts二框架中获得Servlet API

对此Struts二框架,不提议直接行使Servlet API。

在Struts第22中学取得Servlet API有三种方式:
    1、通过ActionContext获取
        *   获取1个ActionContext对象
            >   ActionContext context = ActionContext();
        *   获取Servlet API
            >   通过ActionContext获取到的不是确实的Servlet
API,而是贰个Map集合,集合中存放的正是目的(用键值对)存放的数目。
    二、通过注入格局获得
    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底层是3个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;

    }

}


贰、使用接口注入的方法操作Servlet API(耦合)
    那种方法能够真的赢获得Web对象。

    步骤:
        1)供给Action类必须完成内定接口:
            ServletContextAware接口:注入ServletContext对象
            ServletRequestAware接口:注入request对象
            ServletResponseAware接口:注入response对象
        2)重写接口中钦点的不二法门:
            public void setServletRequest(HttpServletRequest request)
        三)声Bellamy(Bellamy)个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.struts二.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文件中定义。

一、明白处理结果
    *   Action处理完用户请求后,会再次来到一个普普通通字符串。
    *   整个普通字符串就是一个逻辑视图名。
    *   Struts二基于逻辑视图名,决定运营哪个结果。
    *   Struts二处理结果使用<result>成分进行配置。
        >  
局地结果:将<result>作为<action>的子成分举行布局
        >  
全局结果:将<result>作为<global-result>的子成分进行布置
    *   配置<result>成分日常需求钦定几个属性
        >   name:该属性指定安插逻辑视图名
        >   type:该属性内定结果类型(跳转方式、处理格局)

二、<result>标签属性:
    *   name属性:
        与action中的method的再次回到值匹配,获取跳转路径,实行跳转。

    *   type属性:
        成效是概念跳转方式。
       
对于type属性的取值范围有以下二种:(能够在struts-default.xml文件中查看)
        >  
chain:请求转载,一般情形下用于从一个Action跳转到另1个Action。
        >  
dispatcher:请求转载,是暗中同意值,1般用来从Action跳转到jsp页面。
        >  
freemarker:模板技术,将页面与数量分离,通过freemarker将数据和页面整合到壹块。
        >   httpheader
        >   plainText
        >   redirect:重定向,1般用来从Action重定向到页面。
        >  
redirectAction:重定向,壹般用于从Action重定向到另3个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

三、局地结果页面与全局结果页面
   
当多个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页面,并呈现用户音讯。

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

——总结

    一、Struts2条件搭建
        *   导入jar包:
            >   struts2/apps/strut_blank.war文件
        *   web.xml如何安插:
            >   配置StrutsPrepareAndExecuteFilter

        *   struts.xml怎么样布署:
            >   在src目录下(classes)

    贰、Struts2运行流程
        *   怎样通过反射执行action

    三、配置文件加载顺序
        *   每一个配置文件的用途是什么样
        1)default.properties
        2)struts-default.xml  struts-plugin.xml  struts.xml
        3)struts.properties
        4)web.xml 

    肆、<package><action><result>成分的安排
        *   package:用于管理action

            >   name:包名,唯一
            >   namespace:与action的name属性显著访问action的门路。
            >   extends:继承的包名,一般持续struts-default
        *   action:声Bellamy个action
            >   name:action名称,在同贰个包下不能够重名
            >   class:action完整类名,私下认可是ActionSupport
            >  
method:action类中的方法名,须要无参,重临值为String,暗中同意值为execute
        *   result:结果视图
            >  
name:与action的method方法的重临值进行匹配鲜明跳转路径
            >   type:跳转格局
                在struts-default.xml文件中定义:
                    chain, dispatcher, redirect, redirectAction,
stream
    伍、Action的二种创立格局
        *   POJO

        *   实现Action接口

        *   继承ActionSupport类

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

        *   动态方法调用

    7、Action访问Servlet API
        *   ActionContext

        *   访问钦命接口(注入)

        *   ServletActionContext

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

 

——Struts第22中学央知识点及难点

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

二、struts二的Action有三种书写格局?

3、能还是不能够在struts二的Action定义多少个工作方法?如何成功不等的乞求访问Action的不等格局?

4、自定义struts二类型转换器实现完成哪个接口,如何安插部分转换器和全局转换器?

五、struts2的国际化音信文件有哪几类?

6、xml举行struts2请求参数校验时,钦点方法的校验文件和具有办法校验文件命名规则是怎么?

柒、struts二的Action中什么运用ServletAPI?

八、简单描述struts贰的值栈对象的个中存款和储蓄结构

九、addFieldError、addActionError和addActionMessage 有啥差异?

10、struts第22中学有如何常用结果类型?你用过什么?

1一、你是或不是在struts二成本中 自定义过拦截器,完结怎么样意义?

1二、struts2 UI大旨有哪些?你用过如何? 底层达成是何等?

一三、struts二 和 struts1 有什么差别?

1四、struts贰 中哪些选用 Ajax ?

15、struts2 的拦截器使用了哪类设计方式 ?

 

——关于Struts第22中学约定访问规则

从struts2.壹初始,struts二 引入了Convention插件来援救零配备

使用约定无需struts.xml大概Annotation配置

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

插件会自动搜索action、actions、struts、struts二包下全体Java类

持有完结了com.opensymphony.xwork二.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-二.3.七.jar 中struts-plugin.xml首要常量

<constant name=”struts.convention.package.locators”
value=”action,actions,struts,struts二”/>  暗许扫描包

<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

相关文章