zoukankan      html  css  js  c++  java
  • 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录

    1. 需要注意:Struts2需要运行在JRE1.5及以上版本 

    2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <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>

    3. 引入Struts2的依赖包,将依赖包拷贝到WEB-INF/lib下

        * commons-logging-1.0.4.jar

        * freemarker-2.3.15.jar

        * ognl-2.7.3.jar

        * struts2-core-2.1.8.1.jar

        * xwork-core-2.1.6.jar

       * commons-fileupload-1.2.1.jar

    4. 提供struts2配置文件struts.xml,放到src下

    5. 创建Struts2的Action,Struts2的action可以不用继承Struts2框架中的任何类,也不用实现Struts2框架中的任何接口,所以Struts2的Action可以是一个POJO(纯粹的Java对象),所以Struts2的

        Action测试更容易。一般情况下会继承ActionSupport。

        继承的好处:

        1). 重写方法,可以防止方法名写错,重写方法时加上override。

        2). 利用父类或接口中定义好的字符串常量。

        3). 开发更规范

        Struts2缺省方法名称:public String execute() throws Exception;默认情况下执行。

    6. 在Action中提供getter和setter方法,便于收集数据(这样收集数据的模式一般可以称为属性驱动模式)。若页面有与它对应的属性时,可以直接获取值(通过拦截器利用反射取值)。

    7. struts2中配置文件对应的action中方法若有返回值必须是String类型且无参数。 

    8. 将JSP和Action配置到struts.xml配置文件中。

        1). action需要配置在package中

        2). 返回需要配置在result

        3). package必须继承struts-default(18个拦截器),这样就拥有了最基本的功能。

        标准配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <struts>
     
             <package name="struts2" extends="struts-default" namespace="/">
     
                    <action name="testShow" class="com.bjpowernode.action.TestAction">
     
                            <result name="bj">/index.jsp</result>
     
                    </action>
     
             </package>
     
    </struts>

      在配置文件中result中name="success"和type="dispatcher"为默认值,可以不写。

    9. 了解struts-default.xml配置文件,default.properties,Struts2的默认后缀为.action

    10. StrutsPrepareAndExecuteFilter实现Filter接口。记住这个过滤器。

    struts2的常用配置参数

    1. struts2的常用配置参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- 配置编码方式 -->
     
    <constant name="struts.i18n.encoding" value="utf-8"></constant>     
     
    <!-- 会提供更加友好的提示信息 -->
     
    <constant name="struts.devMode" value="true"></constant>     
     
    <!-- 当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置 -->
     
    <constant name="struts.configuration.xml.reload" value="true"></constant>

        以上参数配置方式有两种:

        * 在struts.properties文件中配置

        * 在struts.xml配置文件中(借助帮助提示查看位置,配置文件报错可能是位置顺序错误)                        

    2. 可以为某个模块建立单独的配置文件,该配置文件的格式需要和struts.xml配置文件的格式一致在struts.xml配置文件中采用<include>标签引入。引入格式为:

        </package>下面加上:

        <include file="com/bjpowernode/action/one.xml"></include>

    Struts2的Action访问Servlet API 和设置Action中对象的值

    1. Struts2的Action访问Servlet API

        1). 可以通过ActionContext访问Servlet API,此种方式没有侵入性。(静态方法)

             ActionContext.getContext().getSession().put("username",user.getUsername());

             实际上是将数据存到了MAP中。通过map的集合设置session和取得session里面的值(get)。

             ActionContext对象的getSession方法返回的是一个map集合。该map集合是session底层实现,键值对。存到session中的值,可以通过map.get()方法取出来。ActionContext.getContext()

             先得到一个actionContext对象。

        2). 使用ServletActionContext(是ActionContext的子类)访问serlvet API

            ServletActionContext.getRequest().getSession().setAttribute("username", user.getUsername());

            * getPageContext();

            * getRequest();

            * getResponse();

            * getServletContext();

       3). 可以实现Aware(这个文档里没查到)接口访问ServletApi,具有一定的侵入性

            a. 要实现某个AWare接口    (ServletRequestAware,ServletResponseAware...)

            b. 要声明一个对应的serlvet对象:private HttpServletRequest request;

            c. 要实现AWare接口的方法:

               public void setServletRequest(HttpServletRequest request) {

                                this.request = request;

               }

               * ServletRequestAware取得HttpServletRequest对象

               * ServletResponseAware取得HttpServletResponse对象

               * ServletContextAware取得ServletContext对象(工具类)

    2. 在Struts2中默认为转发,也就是<result>标签中的type="dispatcher",type的属性可以修改为重定向

        Struts的重定向有两种:

        type="redirect",可以重定向到任何一个web资源,如:jsp,html或Action,如果要重定向到Action,需要写上后缀:xxxx.action 

        type="redirectAction",可以重定向到Action,不需要写后缀,此种方式更通用些,不会因为后缀的改变影响配置                                                     

    3. 关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法。他们体现了策略模式,具体Result类型参见:struts-default.xml文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <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>

         我们完全可以自己根据需求扩展Result类型

    4. 全局Result(紧接着写在<package>下面)和局部Result(写在action中)。可以通过配置文件继承,让多个包继承这个全局结果。

        <!-- 全局result -->

        <global-results>

                  <result name="login" type="redirect">/login.jsp</result>

        </global-results> 

    5. 设置Action中对象的值(该对象的类中的属性有set和get方法)。

        1). 直接对Action中的对象赋值,在action中定义对象: (推荐)

            eg:private User user;(action中有user的set和get方法)

            在html中可以采用如下方式命名输入域:

            <form action="login.action">

                     用户:<input type="text" name="user.username"><br>

                     密码:<input type="password" name="user.password"><br>

                     <input type="submit" value="登录">

             </form>

              或:

             <s:textfield name="user.username" label="姓名"></s:textfield>

        2). Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式  (不推荐此种方式)

              如何实现模型驱动模式?

              * 创建User

              * Action需要实现ModelDriven接口

              * 实体对象不使用setter getter方法,但是要实例化对象(new)

              * 实现getModel()方法,返回Bean对象(如:返回user).

              * 页面只填写属性名称即可

    命名空间和乱码处理

    1. 采用命名空间,可以区分不同的包下相同的Action名称。如果package的namespace属性没有指定,使用的默认命名空间为""

        Struts2中Action的完整路径应该为:namespace+ "/" + Action的名称

        包中加空间:<package name="struts-one" extends="struts2" namespace="/a">

        首先在指定的命名空间下查找Action,如果找到了就使用此Action,如果没有找到在上层目录中查找,一直到根(缺省命名空间),在此过程中如果找到了Action就会使用此Action,如果都没有找到就会

        抛出Action没有找到异常

        命名空间中,可以建立相应的文件夹,将相应的jsp文件放入其中。可以在提交页面直接写要访问的jsp,但jsp页面中要去掉basepath。

    2. 关于Struts2的字符集问题,主要有三种配置方式(这些方法貌似只对POST请求有作用?):

        * struts.properties配置文件中

           struts.i18n.encoding

        * struts.xml配置文件

           <constant name="struts.i18n.encoding" value="UTF-8"/>

        * 在StrutsPrepareAndExecuteFilter中配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <filter>
     
        <filter-name>struts2</filter-name>
     
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
     
        <init-param>
     
                <param-name>struts.i18n.encoding</param-name>
     
                <param-value>UTF-8</param-value>
     
        </init-param>
     
    </filter>

    3. 数据库为mysql时需要处理中文范例:

        1). 修改tomcat--->server.xml的编码方式

        2). struts.xml配置常量

        3). 在数据库连接串中加编码格式:

             jdbc:mysql://localhost:3306/dljd?useUnicode=true&amp;characterEncoding=UTF8(好像是mysql特有)

             注意:转义字符

    Struts2的Action中包含多个方法如何调用

    1. 具体的调用方式:

        * 方法的动态调

        * 在<action>中配置method属性

        * 使用通配符

        1). 方法的动态调用方式:(不推荐,会将方法名暴漏出来。但可以通过伪连接隐藏起来。)

             action名称+!+方法名称+后缀

             <a href="user!add.action">添加用户</a><br>

             <a href="user!del.action">删除用户</a><br>

             !!动态调用参数配置,默认为true,可以调用,设置为false不能通过此种方式调用。

             <constant name="struts.enable.DynamicMethodInvocation" value="false"/>                

             !!Action中的所有方法格式必须和execute方法一致(参数,返回值,异常最好也一样)

        2). 在<action>中配置method属性

             <action name="add" class="com.bjpowernode.struts2.UserAction" method="add">

             <action name="update" class="com.bjpowernode.struts2.UserAction" method="update">

        3). Struts2的Action中包含多个方法如何调用(使用通配符)

             具体配置("{1}"表示第一个*所代表的值。)

             <action name="*User" class="com.bjpowernode.struts2.UserAction" method="{1}">

                      <result>/{1}Success.jsp</result>

             </action>

             注意:页面上也要与action中保持一致,如:

             <a href="loginUser.action" target="_blank">login</a>

             <a href="saveUser.action" target="_blank">login</a>

             showUser.jsp 

             saveUser.jsp

             在Struts2的<action>标签class、name、method和result标签上都可以使用通配符。通配符的作用就是为了减少配置量,通配符需要建立在约定的基础上。

    2. 多个通配符*-*(*代表变化的)

        1). 配置xml文件:

             <package name="one" extends="struts2" namespace="/">  

                    <action name="*-*User" class="com.bjpowernode.action.TestAction" method="{1}">

                                 <result name="{2}">/{1}User.jsp</result>

                                 <result name="input">/index.jsp</result>

                    </action>                                

             </package>

             单个通配符和多个通配符若后面跟的内容一样时(*User*-*User),不能同时使用。因为可能第一个会将第二个的请求拦截住。

        2). 页面调用:<a href="save-saveUser.action" target="_blank">save</a> 

        3). action类中的返回值:

             public String save(){

                      str = "保存方法";

                      return "save";

            }          

  • 相关阅读:
    字符串处理(包括正则生成工具)
    php.ini 个别字段笔记
    php-5.4 升级到 php7.2
    【mysql笔记】针对 group_concat 长度限制
    七牛,前端上传图片
    PHP 替换 特殊空白符
    【代码块】定时任务<swoole> 100%无人值守
    安装nodejs
    linux安装beanstalkd
    个人笔记上传 -- redis安装
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5693405.html
Copyright © 2011-2022 走看看