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

 

由于在使用SSH框架的过程,关于struts2的配置比较繁琐,因此作个总结。

 

1、导入而且关联其余XML

1.   由于在核心配置文件(Struts2.xml)中,若是存在不少须要配置的Action项目,会显得代码数量骤增,同时核心配置文件极其臃肿.安全

  因为Struts2提供了相应的带入功能,故将struts.xml配置文件分解成多个配置文件,而后在struts.xml文件中包含其余配置文件便可。session

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

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

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

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

Example:ide

  

  

  


console输出结果:模块化

  

 

 

2、关于struts.xml中package包

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

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)不可以相等

 

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

例:/path1/path2/path3/someAction

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

namespace = “”  默认包

若是Action找到了,就直接使用;

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

 

4、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

 

 

5、SevletAPI的获取

经过

 

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

 

注:尽可能使用第一种(ActionContext.getContext(),由于起彻底脱离了ServletAPI)

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

 

6、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>

 

7、方法调用

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> 

 

 

8、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) 多个通配符(*_*)

    不建议使用。

 

9、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) 正常状况使用第二种,配合第一种使用,代码可维护性强,易于修改添加和测试.

 

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

相关文章
相关标签/搜索