struts中的配置文件

来源:互联网 发布:外国语大学排名知乎 编辑:程序博客网 时间:2024/06/05 08:27

Struts2入门案例:

 
第一步 导入jar包
(1)找到apps目录,找到示例程序,从示例程序里面复制jar包:

Struts2_jar

 
随便改一个后缀为zip,然后点进去复制jar包;
 
第二步 创建Action
  public class HelloAction {
    public String execute() {
      return "success";
    }
  }
总结:
  (1)每次访问servlet的时候,servlet里面的service方法都会执行;
  (2)每次访问struts2的action的时候,action默认都会执行名称是execute的方法;
 
第三步:配置Action核心配置文件:
(1)类似于servlet进行配置
(2)具体实现
- 创建struts2核心配置文件:名称和位置 是固定的
    位置:必须在src下面,
    名称:必须 struts.xml
  
  核心配置文件举例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 配置一个包:package -->
    <package name="demo1" extends="struts-default" namespace="/">
        <!-- 配置action -->
        <action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">
            <!-- 配置页面跳转 -->
            <result name="success">/demo1/action1.jsp</result>
        </action>
        
        <action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
            <!-- 配置页面跳转 -->
            <result name="jump" type="redirectAction">/demo1/jump.jsp</result>
        </action>
    </package>
</struts>
          
访问action:
    建议写上.action后缀名
    浏览器访问:http://127.0.0.1/Struts2_day01_web1/hello.action
此时是无法访问的,因为还缺少一个过滤器。
 
第四步:配置struts2过滤器
(1)在web.xml中配置
  <!-- 配置Struds2的核心过滤器:前端控制器 -->
  <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>

访问Action的一个基本的流程:

struts2执行基本流程

什么是过滤器:

 
(1)什么是过滤器
- 在到达目标资源之前,进行操作
(2)过滤器在什么时候创建
- 服务器启动时间创建
(3)过滤器创建的时候,里面init方法执行
  
过滤器里面的init方法底层做的工作:
(1)加载struts2里面的配置文件
- 包含自己创建,和struts2自带配置文件

Struts2配置文件详解:

package标签:

 
1.如果在配置文件中,配置action访问的地址,首先必须写package标签;
  (1)package标签用于区别不同的action
  
2 在一个配置文件中,可以写多个package标签,但是多个package标签的name属性值不能相同的

package标签属性

 
3 extends属性:
(1)extends属性值是固定的,必须是 struts-default
(2)写了这个值之后,package标签里面的类具有action功能
4 namespace属性:
(1)namespace属性值  action标签name属性值,构成访问路径名称

package中namespace属性

action标签:

 
1 action标签必须写在package标签里面
  
2 在一个package标签里面可以写多个action标签,但是action标签的name属性值不能相同的,例如:
  <!-- 配置一个包:package -->
    <package name="demo1" extends="struts-default" namespace="/">
        <!-- 配置action -->
        <action name="strutsDemo1" class="cn.itcast.struts2.action.StrutsDemo1">
            <!-- 配置页面跳转 -->
            <result name="success">/demo1/action1.jsp</result>
        </action>
        
        <action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
            <!-- 配置页面跳转 -->
            <result name="jump" type="redirectAction">/demo1/jump.jsp</result>
        </action>
    </package>
          
3 action标签name属性:
 (1)namespace属性值  action标签name属性值,构成访问路径名称;
          
4 action标签class属性:
 (1)action类的全路径          
          
5 action标签method属性
 (1)让action里面的不同的方法执行

result标签:

 
1 result标签:根据action的方法返回值,配置到不同的路径里面
2 result标签必须写到action标签里面,在一个action标签中可以写多个result标签,但是name属性值不能相同的
3 result标签name属性:和action的方法返回值对应
4 result标签type属性:
(1)表示如何到路径中(转发还是重定向)
(2)type属性常用的值
- 默认值,dispatcher,做转发操作
- redirect,做重定向操作(但是一般不会用这个值,而是用下面要介绍的)
 (3)上面两个值 dispatcher和redirect,针对到页面中配置
如果到不同的action里面,需要其他值
- chain:不用,转发到action
- redirectAction:重定向到action里面
  举例:
  <action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
     <!-- 配置页面跳转 -->
     <result name="jump" type="redirectAction">/demo1/jump.jsp</result>
 </action>

全局结果页面配置:

为何配置全局页面

 
两个action方法的返回值,跳转到页面都是相同的,使用全局结果页面简化配置,进行如下配置:

全局页面配置

局部结果页面:

 
1 在action标签里面使用result标签进行配置
2 配置全局结果页面,也配置局部结果页面,最终以局部为准

Action编写方式(三种):

 
action编写有三种方式

第一种方式:

 
创建普通类,不继承任何类,不实现任何接口
  public class HelloAction {}

第二种方式:

 
创建类,实现接口Action
  public class UserAction implements Action {
    public String execute() throws Exception {
      return null;
    }
  }

第三种方式(常用):

 
创建类,继承ActionSupport类(建议使用这种方式):
  public class BookAction extends ActionSupport {
  }
(1)ActionSupport类是接口Action的实现类

访问Action的方法:

 
1 在一个action里面可以有很多的方法,action默认执行的名称是execute的方法。如何执行action的其他的方法,例如:
  public class BookAction extends ActionSupport {
    public String add() {
      return "add";
    }
    public String update() {
      return "update";
    }
  }
2 访问action的方法有多种方式:
  第一种: 使用action标签属性 method属性,在method属性值写 执行的action中的方法名称:
  例如:
  <action name="demo2" class="cn.itcast.struts2.action.StrutsDemo1" method="demo2">
    
(1)使用第一种方式配置,缺陷:action里面每个方法都需要配置action
 第二种:使用 通配符方式访问,使用method属性 (重点)
(1)使用符号进行配置,是 * 星号
- 在action标签的name属性值里面,写* ,星号匹配任意内容
-- 比如 访问 add,使用* 可以匹配
-- 比如访问 update,使用* 可以匹配
  代码实现:
    <!-- 配置action -->
        <action name="*" class="cn.itcast.struts2.action.Struts2Day02" method="{1}">        
            <!-- 配置页面跳转 -->
            <result name="toAddPage">/jsp/customer/add.jsp</result>
            <result name="findAll">/jsp/customer/list.jsp</result>
            <result name="success">/day2.jsp</result>
        </action>
          
method="{1}" //表示*号这个方法在action中第一次出现的方法名;          

通配符实际应用

常量配置和分模块配置:

常量配置:

 
修改struts2常量值有三种方式:
  第一种:在struts.xml进行配置修改:例如:
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  
  第二种:在src下面创建struts.properties,进行配置
  
  第三种:在web.xml中进行配置:
 <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>
 
常用常量:
struts.i18n.encoding=UTF-8
  
(1)表单提交中文数据,有乱码问题
(2)比如post提交,调用设置编码
     比如get提交,做编码转换
(3)封装功能:
- 如果表单提交方式是post,提交表单到action,在action获取post提交中文数据没有乱码问题,因为底层已经处理了post提交表单中的中文乱码问题,但是get提交的方式还是需要进行new String进行编码转换的。

分模块配置:

 
1 每个模块创建配置文件,把所有模块的配置文件,引入到核心配置文件中
  
  需要注意的是,每一个被创建的配置文件都是标准的Struts2配置文件,一样包含DTD约束、Struts2配置文件的根元素等信息。
  
  通过如下标签引入:
  <!--引入模块配置文件-->
  <include file="cn/itcast/action/book.xml"></include>

Action接收表单标签数据:

 
1 之前提交表单到servlet里面,在servlet中可以获取表单提交数据,调用request里面的方法得到
2 提交表单到action,可以在action获取表单提交数据,可以在action操作域对象
3 在action获取表单数据方式有很多种
(1)在action有ActionContext类获取
(2)在action有ServletActionContext类获取
下面是struts2里面封装实现操作
(1)属性封装
(2)模型驱动封装
(3)表达式封装

ActionContext类获取表单数据(不常用):

 
1 获取ActionContext独享,不是new出来的(通过静态方法得到给对象):
  static ActionContext      getContext();
2.调用ActionContext中的方法获取表单数据:
  Map<String,Object>    getParameters();

获取表单数据的第一种方式

ServletActionContext类获取表单数据(常用,因为有request对象):

在action中获取request对象的方法&接收数据

 
1.获得request对象:
  HttpServletRequest request=ServletActionContext.getRequest();
  //通过request对象获得表单数据
  String username=request.getParameter("username");

封装表单数据:

1.属性封装:

 
1 可以在action成员变量位置定义变量,把表单提交数据封装到变量里面
2 实现步骤
(1)在action成员变量位置定义变量,变量名称规范:和表单输入项name属性值一样
(2)生成变量的set和get方法
如下所示:

属性封装数据

2.模型驱动封装(常用):

模型驱动是通过拦截器来实现的。

 
1 把表单提交数据直接封装到实体类对象里面
2 实现步骤
(1)让action实现接口,ModelDriven<实体类名称>
(2)实现接口里面的方法,getModel方法
(3)在action成员变量位置,手动创建实体类对象
  
  注:要求:实体类属性名称 必须 和表单输入项中的name属性值一样。
代码演示如下:

模型封装数据

3.表达式封装:

 
1 把表单提交数据直接封装到实体类对象里面,在action中申明对应的实体类属性:
  //1.声明实体类变量
  private User user;
  //2. 生成变量get和set方法:
    public User getUser() {
      return user;
    }
    public void setUser(User user) {
      this.user=user;
    }
 
(2)需要在表单输入项name属性值中,写表达式形式,如下:

表达式封装,在页面的操作


0 0
原创粉丝点击