• Struts2 框架使用 核心以及其他详细配置


     

    因为在使用SSH框架的过程,关于struts2的配置比较繁琐,所以做个总结。

     

    一、导入并且关联其他XML

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

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

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

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

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

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

    Example:

      

      

      


    console输出结果:

      

     

     

    二、关于struts.xml中package包

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

    1.  <package name="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)不能够相等

     

    三、Struts2包的查找过程OR相应规则

    例:/path1/path2/path3/someAction

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

    namespace = “”  默认包

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

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

     

    四、Struts2配置文件

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

      

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

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

      

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

     

     

    五、SevletAPI的获取

    通过

     

    Map<String, Object> sess = ActionContext.getContext().getApplication();
    HttpSession session = ServletActionContext.getRequest().getSession();

     

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

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

     

    六、Struts2的返回类型

    1. dispatcher(默认使用的):请求转发

    2. redirect:重定向

    3. redirectAction:重定向到某一个Action中

      (a) redirectAction这种类型是给程序看的,让我们一看这个代码就知道到底是跳转的是Action还是普通的页面。

      (b) 如果跳转在同一个包,我们直接写Action的名称就可以了       

      (c) 如果是跳转到不同的包中,就要使用完整的写法,它是把namespace与actionName分开写的

      (d) redirectAction可以完成的,redirect都可以完成

      (e) 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>

    七、方法调用

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

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

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

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

    public class UserAction02 implements Action{
        public void “方法名”(){return SUCCESS;}
    }

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

     

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

    public class UserAction03 extends ActionSupport{
    public Stringexecute(){return “”;}
    }

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

     

    八、Struts2多方法配置

    1. 动态方法调用(在地址后加感叹号!)

      a) 比如:http://localhost/demo02/curd!update

        注:要开启动态调用的 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 

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

      b) 使用通配符(*)

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

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

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

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

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

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

      c) 多个通配符(*_*)

        不建议使用。

    九、Struts2接收参数

    1. 接受普通参数(如果参数很多就比较麻烦)

    a) 在Action中声明此参数: private String params;

    b) 在下面提供此参数的setParams()方法: public void setParams (String params){ this. params = params;} 

    c) 然后就可以在[execute()]方法中使用.

    d) 例子:

    Java文件实现:

     1 //接收参数
     2 public class ParamsAction01 extends ActionSupport{
     3     private String name;
     4     private String password;
     5     private String age;
     6     
     7     public String execute(){
     8         System.out.println(name);
     9         System.out.println(password);
    10         System.out.println(age);
    11         return NONE;
    12     }
    13     public void setName(String name) {
    14         this.name = name;
    15     }
    16     public void setPassword(String password) {
    17         this.password = password;
    18     }
    19     public void setAge(String age) {
    20         this.age = age;
    21     }
    22 }

     

      XML配置:

      <package name="default" namespace="/" extends="struts-default">
          <action name="params" class="cn.itsource._06_params.ParamsAction01"></action>
      </package>

     

      JSP页面:

    <form action="/params" method="post">
        姓名:<input type="text" name="name"  /> <br />
        密码:<input type="password" name="password"  /> <br />
        年纪:<input type="number" name="age" />
        <input type="submit" value="...提交..." />
    </form>

    2. 利用对象来接受

    a) 准备一个和页面对应的Object对象,你如User类

    b) 在Action中讲User实例化(既private User user = new User())

    c) 在Action中必须提供getUser()方法(原因见下)

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

    d) Jsp页面中<input 的名字 name = “user.username”(“对象.属性”)(规范)

    e) 关于利用对象接受的处理流程:

     1. 前台传了一个 user.name过来

     

        a) Struts2会把它分成两部分:第一部分 user ,第二部分name

     

        b) 看到user之后,

     

       i.   先通过getUser() 这个方法去拿这个User

            ii.  如果拿不到user,它会通过反射创建一个user对象,创建好之后,执行setUser()将这个User放过来(现在User就存在了)

            iii. 如果拿到了这个user,就直接拿来使用然后调用user对象的setName()方法,将前台传过来的值放进去(name就有值了)

                 User对象存在,name中有值

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

      f) 例子:

     1 <!-- 页面内容: -->    
     2 <form action="/demo03/params2" method="post">
     3         用户名:<input type="text" name="user.name"  /><br />
     4         密码:<input type="text" name="user.password"  /><br />
     5         年纪:<input type="number" name="user.age"  /><br />
     6         日期:<input type="text" name="user.bornDate" /><br />
     7         性别:<input type="radio" name="user.sex" value="true"> 8             <input type="radio" name="user.sex" value="false"><br />
     9         <input type="submit" value="提交" />
    10 </form>
     1 //Action内容:    
     2 private User user = new User();
     3 public User getUser() {
     4     return user;
     5 }
     6 @Override
     7 public String execute() throws Exception {
     8     System.out.println(user);
     9     return null;
    10 }
    1 //domain
    2 public class User {
    3     private String name;
    4     private String password;
    5     private Integer age;
    6     private Date bornDate;
    7     private Boolean sex;
    8     //这里必须提供getter,setter代码
    9 }

    3. 在Action中实现ModelDriver<T>接口(T为泛型),并在Action提供一个getModel()方法

    a) 与第二种相比,好处在于,jsp页面的时候,可以不用在<input 的name中添加类名前缀,如:user.username 可以改成username.

    b) 示例:

     1 public class Requestrecept extends ActionSupport implements ModelDriven<User> {
     2     User user = new User();
     3     @Override
     4     public String execute() throws Exception {
     5         System.out.println(user);
     6         return NONE;
     7     }
     8     @Override
     9     public User getModel() {
    10         return user;
    11     }
    12 }

    参数接受总结

    a) 第一种可以和第二种OR第三种配合使用,既1+2  OR  1+3 ;

    b) 第三种只有确定一个Action只封装一个对象时,推荐使用.因为他只能封装一个 Object.

    c) 正常情况使用第二种,配合第一种使用,代码可维护性强,易于修改添加和测试.

     

       另外,转载请留言。多谢。

  • 相关阅读:
    Pulp之四:其它应用样例(1)-一般的整数规划问题 (设置目标约束函数)
    Pulp之三:官网上的应用样例(4)-Blending Problem (混合问题)
    Pulp之三:官网上的应用样例(3)-Sudoku Problem by LP (数独问题)
    Pulp之三:官网上的应用样例(2)-A Set Partitioning Problem (集合划分问题)
    list转换dict的方式以及zip的用法
    Pulp之三:官网上的应用样例(1)-The_Whiskas_Problem (猫粮配料比例问题)
    Pulp之二:Pulp中几个重要的概念
    一个简单有趣的题(4个变量找出取走的数)
    Java之父 James Gosling 发表博文 《Too Soon》纪念乔布斯。
    第01课 OpenGL窗口(1)
  • 原文地址:https://www.cnblogs.com/applerosa/p/5947786.html
Copyright © 2020-2023  润新知