zoukankan      html  css  js  c++  java
  • Struts入門學習(自用)

    1、獲取struts2

      

    2、選擇常用jar包

      path:Struts文件下/lib/...

      常用jar包有

        

    3、導入jar包到項目下

      導入到WebRoot下的WEB-INF/lib,然後buildPath

      

    4、配置filter(web.xml)

      

    5、創建Action(三種方式,類名規範:類的結尾為Action,eg: DefaultAction)

      5.1.1、創建一個類繼承ActionSupport類(最好)

      5.1.2、複寫方法(返回值為String而且拋出一個異常)

      5.2.1、直接創建一個普通類

      5.2.2、在struts中配置就ok了

      5.3.1、創建一個類繼承Action接口

      5.3.2、複寫方法(返回值為String而且拋出一個異常)

      5.4、配置Struts.xml文件,注意,該文件必須放在src文件夾下,且命名正確

       

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
        
    <struts>
        <!-- 使用動態方法調用時所需配置 -->
        <constant name="struts.devMode" value="true"></constant>
        <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
        
        <!-- name:配置包名 extends=struts-default為固定   -->
        <!-- 虛擬資源路徑 eg:若namespace="/xxx" 則要訪問此package下的action,url為webPath/xxx/actionName -->
        <package name="MyPackage" namespace="/" extends="struts-default">
            <!-- 動態調用時配置 -->
            <global-allowed-methods>這裡寫入*允許被動態調用的方法名,如Login</global-allowed-methods>
            <!--配置action 
                name->url-pattern 
                method->調用action中指定的一個方法 -->
            <action name="LoginAction" class="com.struts.web.UserAction" method="execute">
                <!--依據execute的返回值來決定跳轉(默認為請求轉發) 配置type決定重定向-->
                <result name="success" type="redirect">/index.jsp</result>
                <result name="error">/index.jsp</result>
            </action>
            <!-- 動態方法調用(根據url中*的名稱來調用UserAction中對應的方法) eg: url=webRoot/LoginAction_Login時會調用UserLogin下的Login方法 -->
            <action name="LoginAction_*" class="com.struts.web.UserAction" method="{1}">
    
            </action>
        </package>
    </struts>

     6、參數傳遞(接收參數)

      6.1、屬性驅動方式

        在action里聲明對應參數的字段,生成對應的getter和setter,struts會自動獲取request域中同名的參數

      6.2、類驅動方式(不推薦)

        在action里聲明屬性所屬的類(不用實例化),生成對應的getter和setter,如:User(有username和password屬性並且實現getter和setter方法)

        在前端form表單中對應屬性input的name屬性需為,如:name="user.username"

      6.3、封裝參數(推薦)

        繼承ModelDriven<要封裝的pojo類>接口,複寫getModel()方法:返回實例化的類(注意要先把要封裝的類實例化,且這個類要有getter和setter)

        (與servlet區別,servlet的數據封裝是通過導入BeanUtils工具包對對象進行封裝,方便數據類型轉換)

        

     7、傳遞參數(ActionContext)

      ActionContext的數據結構是Map,存儲了一下(對象:對象地址)

      request、response、servletContext(application)、session、attr域、param域、valueStack。。。

      //常用方法

      ActionContext.getContext().put(key, value) == servlet中 request.setAttribute(key, value) //get同理

      ActionContext.getContext().getSession() 獲取session,返回Map對象,使用put、get對應存取

      ActionContext.getContext().getApplication() 獲取servletContext,返回Map對象,使用put、get對應存取

      

       PS:ActionContext的生命週期:每次請求都會創建一個與請求對應的ActionContext對象,請求處理完,ActionContext就會被銷毀

       通過ActionContext的子類ServletActionContext可以獲得原生的request、response

       

     8、action的方法规范:

        1、返回值是String(也可以是void)

        2、没有参数

        3、用public修饰

     9、ognl(升级版的jstl)的使用

        1、再jsp文件中加上<%@taglib uri="/struts-tags" prefix="s"%>

        2、常用标签:

          2.1、循环

              <s:iterator value=" 作用域中(存的某个对象)的键名 " var=" 给每一次循环的内容用一个变量表示 ">

                循环体:

                  获取对象的某个值<s:property value=" 对象中对应的属性名,如UserName "/>

              </s:iterator>  

          2.2、判断:

              <s:if test=" 逻辑判断 "></s:if><s: else></s:else>

          2.3、获取对象中的某个字段

              <s:propety value="#ObjectName.属性名(有对应的getter)"/>(# == ActionContext.getContext())

              由于它其实是用ActionContext去取值,那么就会有作用域先后问题:pageContext --> HttpSession --> ServletContext

    10、action获取request中值的三种方法:

          属性驱动:

             表单获取数据(属性)---->struts(params拦截器)---->ognl---->valueStack---->对应action属性值

          对象驱动

             表单获取数据(ObjectName.属性)---->struts(params拦截器)---->ognl---->valueStack---->对应action里的对象---->对象的属性

          模型驱动

               表单获取数据(属性)---->struts(params拦截器)---->ognl---->valueStack------>直接找root中对应的对象(在action中已实例化,modelDriver将实例化的对象压入ValueStack)--->对象中的属性名

    12、Action原理

         request --->  前端控制器(FC) ---> struts(拦截器)  ---> action与jsp数据交互的媒介:valueStack(root栈、actionContext、ognl引擎) ---> struts创建action ----> 当所有的拦截器(1、2、3)拦截完后  --->  将action压入root栈  ---> 执行action --->  反向执行拦截器(3、2、1)---> FC创建result结果集 ---> 转发或重定向

    13、result结果集(输出的处理):

        每个result是一个类,每个类都实现了共同的接口Result,struts2预置了10种类型的result,它们被定义在struts-default.xml(在package的extends=“structs-default”就是声明继承struts-default,继承了才能使用result标签)中

        四种常用type:

          dispatcher转发:默认

          chain:转发到action

          redirect:重定向

          redirectAction:重定向到Action

    14、拦截器(拦截器只能控制访问Action,不能控制访问jsp)实现:

        第一种(推荐):

          创建:创建一个类继承MethodFilterInterceptor

          复写String doIntercept(ActionInvocation invocation)方法(放行 invocation.invoke())

        第二种:

          创建:创建一个类实现Intercept接口

          实现String intercept(ActionInvocation invocation)方法(放行一样)

        配置(注意:package中配置是有顺序要求的):     

        Content Model : (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-
                class-ref?, global-results?, global-allowed-methods?, global-exception-mappings?, action*)

        <!-- name:配置包名 extends=struts-default為固定   -->
        <!-- 虛擬資源路徑 eg:若namespace="/xxx" 則要訪問此package下的action,url為webPath/xxx/actionName -->
        <package name="MyPackage" namespace="/" extends="struts-default">    
    
            <interceptors>
                <!-- 注册拦截器  -->
                <interceptor name="myIntercept" class="com.struts.intercept.MyIntercept"></interceptor>
                <!-- 注册拦截器栈  -->
                <interceptor-stack name="myStack">
                    <!-- 引入自己创建的拦截器  -->
                    <interceptor-ref name="myIntercept">
                        <!-- 配置不经过此拦截器的方法(login方法不仅过拦截器)  -->
                        <param name="excludeMethods">login</param>
                    </interceptor-ref>
                    <!-- 引入struts本身的拦截器(20) -->
                    <interceptor-ref name="defalutStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!-- 指定包中的默认拦截器栈(不指定则用struts的默认)  -->
            <default-interceptor-ref name="myStack"></default-interceptor-ref>
            
            <!-- 配置全局结果集(配合拦截器) -->
            <global-results>
                <result name="toLogin" type="redirect">/login.jsp</result>
            </global-results>
  • 相关阅读:
    2017-5-21 Asp.Net内置对象 和 DropDownList时间年月日的三级联动
    【2017-04--28】Winform中ListView控件
    【2017-04-27】布局及容器控件、打开多窗体、构造函数传值、打开唯一窗口
    【2017-04-25】winform公共控件、菜单和工具栏
    【2017-04-24】WinForm基础、登录窗口、窗口属性
    【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类
    【2017-04-18】Ado.Net C#连接数据库进行增、删、改、查
    【2017-04-17】类库、通用变量、is和as、委托
    【2017-04-16】抽象类、接口、构造函数、重载、静态成员和方法
    【面向对象】类、访问修饰符、封装、继承、多态
  • 原文地址:https://www.cnblogs.com/hachiman/p/10560771.html
Copyright © 2011-2022 走看看