Day 25 - Struts2 核心配置

来源:互联网 发布:mysql优化方案 编辑:程序博客网 时间:2024/06/14 08:37
  1. 导入并且关联其他XML

    1. 因为在核心配置文件(Struts2.xml)中,如果存在很多需要配置的Action项目,会显得代码数量骤增,同时核心配置文件极其臃肿.

    由于Struts2提供了相应的带入功能,故将struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件即可。

    1. 导入位置,将struts-others.xml文件放在struts.xml同级目录,在主配置文件中

      添加<includefile="struts-others.xml"></include>即可。

      (注:<include 标签与 <package 标签同级)

    2. 此时在struts-others.xml配置相关信息即可

       

       

       

       

       

       

       

       

       

       

    Example:

     

     

     

     

     

     

     

     

     

    console输出结果:

     

     

     

     

  1. 关于struts.xml中package包

    <package ····· 主要是为了模块化管理

    1. <packagename="default"namespace="/"extends="struts-default"abstract="">

      name:包名,在整个应用中不能重复;没有实际意义;

      namespace:包命名空间;用于访问该包中action时额外加的路径;

      extends:继承(一定要继承),继承其他包的配置文件,才能使用锁提供的功能

      (在Struts2中,继承相当于把哪个包的全部代码拷贝过来)

      abstract:代表是抽象的包,用来被继承的(示例见struts-default.xml中的某些包)

    http://ip:port/<appContextPath>/<packageNamespace>/<actionName>[.action]

    http://ip:端口/<上下文路径>/<包的命名空间>/<action的名称>[.后缀名]

    注意的问题:

    1 同一个包下面的Action名称是不能重复的(意思就是不同包下的Action可以重复)

    2 包的名称(name)与包的命名空间(namespace)不能够相等

  2. Struts2包的查找过程OR相应规则

    例:/path1/path2/path3/someAction

    1. /path1/path2/path3/中找包,然后从path3向上一层一层找,直到找到
    2. 如果每隔path*中都没有找到,就会去'/'根目录寻找
    3. 如果找到了包,就会在这个包里面去找someAction
    4. 注:namespace = "/" 根目录OR根包

      namespace = "" 默认包

    如果Action找到了,就直接使用;

    当Action找不到的时候,就会尝试到默认包(Struts2中所提供的)中来寻找.

  3. Struts2配置文件

    1. Struts2框架按照如下顺序加载struts2配置

       

      default.properties

      默认/常量/配置

      该文件保存在struts2-core-2.3.7.jarorg.apache.struts2包里面

      我们配置中很多常量都在这里面

      struts-default.xml

       

      该文件保存在struts2-core-2.3.7.jar我们学习的阶段,可以来这里查看很多配置的方式

      struts-plugin.xml

       

      该文件保存在struts-Xxx-2.3.7.jar这里面是一些插件

      上面三个配置文件,是Struts2默认的配置文件,我们不能够对修改它

      struts.xml

      该文件是web应用默认的struts配置文件

      struts.properties

      该文件是Struts的默认配置文件(一般不写在这里面)

      web.xml

      该文件是Web应用的配置文件(一般不用)

      注:如果多个文件配置了同一个struts2    常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值

      1. default.properties 中可以找到我们的常量配置,我们可以在struts.xml中配置常量

    struts.devMode = true;

    //开发模式;修改配置文件不需要重启服务器

    struts.i18n.encoding = UTF-8;

    //系统使用编码

    struts.multipart.maxSize = 2097152

    //上传文件大小(byte)

    <constant name="struts.action.extension"

    value="action,do,,"></constant>

    //默认的后缀名 struts.xml中的写法

    1. <action>中常量配置

    <action>中class可以不写

    因为我们的package继承了struts-default包,struts-default包中定了<action>默认的class属性;

    <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

    <action>标签method可以不写,使用默认值:execute

    <result>标签name可以不写,使用默认值:success

    <result>标签type可以不写,使用默认值:dispatcher

     

     

  4. SevletAPI的获取

    1. 通过

      Map<String, Object> sess = ActionContext.getContext().getApplication();

      HttpSession session = ServletActionContext.getRequest().getSession();

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

      注:尽量使用第一种(ActionContext.getContext(),因为起完全脱离了ServletAPI)

    2. 使用实现接口,访问Action时完成注入,正常情况不使用.

       

  5. Struts2的返回类型

    1. dispatcher(默认使用的):请求转发
    2. redirect:重定向
    3. redirectAction:重定向到某一个Action中
      1. redirectAction这种类型是给程序看的,让我们一看这个代码就知道到底是跳转的是Action还是普通的页面。
      2. 如果跳转在同一个包,我们直接写Action的名称就可以了     
      3. 如果是跳转到不同的包中,就要使用完整的写法,它是把namespace与actionName分开写的
      4. redirectAction可以完成的,redirect都可以完成
      5. redirectAction如果要跳转到其它包

                    <result name="success" type="redirectAction">

                        <param name="namespace">/sys</param>

                        <param name="actionName">result2</param>

                    </result>

        4.有很多Action要用相同的结果视图的时候,我们可以做一个全局视图

             注意:全局视图只能在包里面

                 如果Action标签中有一个配置与全局一样,使用Action标签中的视图

            <global-results>

                <result name="success" type="dispatcher">/success.jsp</result>

                </global-results>

  6. 方法调用

    1. 普通类à访问普通对象(有一个公共无参的构造方法)

      就是在<action中配置的method = "方法名"

      <actionname="userAction01"class="全限定名"method="execute"></action>

    2. 实现一个Action的接口(覆写方法)(有几个可以直接返回的常量)(SUCCESS等)

      public class UserAction02 implementsAction{

          public void "方法名"(){return SUCCESS;}

      }

    <actionname="userAction02"class="全限定名"></action>

    1. 继承ActionSupport类(一个ActionSupport类,其也实现了来自Action的接口)
      1. publicclassUserAction03extends ActionSupport{

        public Stringexecute(){return "";}

        }

        <actionname="userAction03"class="全限定名"></action>

         

  7. Struts2多方法配置

    1. 动态方法调用(在地址后加感叹号!)
      1. 比如:http://localhost/demo02/curd!update

    :要开启动态调用的

    <constantname="struts.enable.DynamicMethodInvocation"value="true"/>

    动态调用的安全性不高,Struts2中也不推荐使用

    1. 使用通配符(*)

    <actionname="method01_*"class="全限定名" method="{1}" ></action>

    method01_*:所有method01_开头的都会找到这个Action

            method="{1}" :代表的就是第一个*

            如果我访问的时候使用 method01_save ,现在这个save就代替的*

            method="{1}" ,它的这个{1}代表的就是第一个*,它的值就会变成save

    如果我们访问execute这个方法,就可以直接写 http://localhost/method01这种路径,不需要加上下划线

    1. 多个通配符(*_*)

      不建议使用。

     

  8. Struts2接收参数

    1. 接受普通参数(如果参数很多就比较麻烦)
      1. 在Action中声明此参数: private String params;
      2. 在下面提供此参数的setParams()方法:

        publicvoid setParams (String params){ this. params = params;}

      3. 然后就可以在[execute()]方法中使用.
      4. 例子:

    接收参数

    publicclassParamsAction01extends ActionSupport{

        private String name;

        private String password;

        private String age;

        

        public String execute(){

            System.out.println(name);

            System.out.println(password);

            System.out.println(age);

            returnNONE;

        }

        publicvoid setName(String name) {

            this.name = name;

        }

        publicvoid setPassword(String password) {

            this.password = password;

        }

        publicvoid setAge(String age) {

            this.age = age;

        }

    }

    XML配置

    <packagename="default"namespace="/"extends="struts-default">

        <actionname="params"class="cn.itsource._06_params.ParamsAction01"></action>

    </package>

    JSP页面

    <formaction="/params"method="post">

        姓名:<inputtype="text"name="name"/><br />

        密码:<inputtype="password"name="password"/><br />

        年纪:<inputtype="number"name="age"/>

        <inputtype="submit"value="...提交..."/>

    </form>

    1. 利用对象来接受
      1. 准备一个和页面对应的Object对象,你如User类
      2. 在Action中讲User实例化(既private User user = new User())
      3. 在Action中必须提供getUser()方法(原因见下)

        如果不在Action中讲User实例化,则必须提供setUser(方法) a)    (原因见下)

      4. Jsp页面中<input 的名字 name = "user.username"("对象.属性")(规范)
      5. 关于利用对象接受的处理流程:
        1. 前台传了一个 user.name过来
          1. Struts2会把它分成两部分:第一部分 user ,第二部分name
          2. 看到user之后,
            1. 先通过getUser() 这个方法去拿这个User
            2. 如果拿不到user,它会通过反射创建一个user对象,创建好之后,执行setUser()将这个User放过来(现在User就存在了)
            3. 如果拿到了这个user,就直接拿来使用然后调用user对象的setName()方法,将前台传过来的值放进去(name就有值了)

                     User对象存在,name中有值

    1. 重复以上步骤(前台传了一个 user.password...过来)

       

       

    1. 例子:

       

    页面内容:    

    <formaction="/demo03/params2"method="post">

            用户名:<inputtype="text"name="user.name"/><br />

            密码:<inputtype="text"name="user.password"/><br />

            年纪:<inputtype="number"name="user.age"/><br />

            日期:<inputtype="text"name="user.bornDate"/><br />

            性别:<inputtype="radio"name="user.sex"value="true">

                <inputtype="radio"name="user.sex"value="false"><br />

            <inputtype="submit"value="提交"/>

        </form>

    Action内容:    

    private User user = new User();

        public User getUser() {

            returnuser;

        }

        @Override

        public String execute() throws Exception {

            System.out.println(user);

            returnnull;

        }

    publicclass User {

        private String name;

        private String password;

        private Integer age;

        private Date bornDate;

        private Boolean sex;

    必须提供getter,setter代码

    }

    1. 在Action中实现ModelDriver<T>接口(T为泛型),并在Action提供一个getModel()方法
      1. 与第二种相比,好处在于,jsp页面的时候,可以不用在<input 的name中添加类名前缀,如:user.username 可以改成username.
      2. 示例:

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

    2. 参数接受总结
      1. 第一种可以和第二种OR第三种配合使用,既1+2 OR 1+3 ;
      2. 第三种只有确定一个Action只封装一个对象时,推荐使用.因为他只能封装一个Object.
      3. 正常情况使用第二种,配合第一种使用,代码可维护性强,易于修改添加和测试.
0 0
原创粉丝点击