因为在使用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文件实现:

 //接收参数
public class ParamsAction01 extends 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);
return NONE;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(String age) {
this.age = age;
}
}

  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) 例子:

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

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

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

b) 示例:

 public class Requestrecept extends ActionSupport implements ModelDriven<User> {
User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
@Override
public User getModel() {
return user;
}
}

参数接受总结

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

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

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

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

Struts2 框架使用 核心以及其他详细配置的更多相关文章

  1. struts2框架的核心内容

     Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...

  2. Struts2之配置文件中Action的详细配置(续)

    承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...

  3. Struts2之配置文件中Action的详细配置

    在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置    包含其他配置文件的配置    Action配置  . 这其中 常量配置  和 包含其他配置文件的配置  二 ...

  4. struts2框架之自定义拦截器和配置

    struts框架中也存在拦截器,只不过系统自动调用.框架自带的拦截器的配置文件所在的位置为: java Resources--->Libraries--->struts2-core-2.3 ...

  5. Struts2 框架的快速搭建

    方便myEclipse 手动配置Struts2框架,写下此文,需要的朋友拿走不谢~ 一.引入JAR包 WEB工程->WebRoot->WEB-INF->lib引入Struts2对应版 ...

  6. [ SSH框架 ] Struts2框架学习之一

    一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...

  7. Struts2框架基本使用

    时间:2017-1-6 16:53 修改struts.xml配置文件不需要重启服务器.Struts2框架    一.        *   介绍Struts2        *   关于Struts2 ...

  8. struts2框架-----Action

    控制器Action Action对象是struts2框架的核心,每个URL映射到特定的Action,其提供处理来自用户的请求所需要的处理逻辑.Action有两个重要的功能,即将数据从请求传递到视图和协 ...

  9. 使用Maven搭建Struts2框架的开发环境

    一.创建基于Maven的Web项目

随机推荐

  1. Docker 管理应用程序数据

    1.将Docker主机数据挂载到容器 Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes , bind mounts 和tmpfs volumes:  Docker管理宿主机文件 ...

  2. [ci]jenkins构建容器项目java-helloworld-非docker plugin模式

    栗子思路说明: 不使用任何docker plugin 使用jenkins server本地(含mvn环境)构建,无jenkins slave jenkins server本地构建的war包,推送dep ...

  3. [Big Data - Suro] Netflix开源数据流管理器Suro

    Netflix近日开源了一个叫做Suro的工具,公司可以利用它来做数据源主机到目标主机的实时定向.它不只在Netflix的数据管道上扮演重要角色,大规模下的应用场景同样令人印象深刻. Netflix各 ...

  4. [Golang] 从零開始写Socket Server(4):将执行參数放入配置文件(XML/YAML)

    为了将我们写好的Server公布到server上.就要将我们的代码进行build打包.这样假设以后想要改动一些代码的话.须要又一次给代码进行编译打包并上传到server上.     显然,这么做过于繁 ...

  5. NodeJS的url验证库模块url-valid

    这是我10月份做的项目其中的一个部件,主要用于url检验的. 我们知道Javascript做url检验,通常是使用正则表达式来判定,其格式是否正确,例如: /^https?:\/\//.test(ur ...

  6. STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验

    1.实验目的 1)使用 TIM1 触发 ADC,ADC 采集的数据通过DMA 传至内存,然后通过串口打印出采集的数据: 2)学会 DMA 传输数据并将数据进行保存: 3)验证ADC 的采样率与实际设置 ...

  7. 聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  8. Paypal Rest Api自定义物流地址(跳过填写物流地址)

    PayPal之前的Rest Api是不支持自定义物流地址的,最新升级版本的提供了这个服务(Payment Experience),大概步骤如下: 1.申请一个自定义的配置ID 自定义配置包括Logo, ...

  9. pip install psutil出错-You are using pip version 10.0.1, however version 18.0 is available.

    今天想用python代替shell做运维相关的事,写代码都是在本机,调试在服务器上 C:\Users\0>pip install psutilRequirement already satisf ...

  10. (原创)Python文件与文件系统系列(1)—— file 对象

    本系列将从四个部分简单介绍Python对文件系统的操作与支持: 1. Python内置的 file 对象 2. Python的os模块对文件.文件系统操作的支持 3. Python的os.path模块 ...