Struts2请求数据自动封装:

  (1)实现原理:参数拦截器

  (2)方式1:jsp表单数据填充到action中的属性;

         普通的成员变量,必须给set,get可以不给的。

       注意点,Action中定义成员变量,成员变量的setXxx方法名中的Xxx和表单中name属性提交的参数对应起来的;

  (3)方式2:领域模型接受表单的参数(常用),jsp表单数据填充到action的对象的属性;

         对象类型,一定给get方法。

       注意点:Action中定义封装的实体类对象如private User user,并给set,get方法,在jsp页面需要注意是user.id;

  (4)方式3:模型驱动接受表单的参数,了解即可,这里省略;


1:方式1:

第一步:引包,省去

第二步:配置struts2的过滤器

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>struts2_20170221</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- struts2过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- struts2过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

第三步:开发Action

 package com.bie.type;

 import java.util.Date;

 import com.opensymphony.xwork2.ActionSupport;

 /**
* @author BieHongLi
* @version 创建时间:2017年2月21日 下午8:39:13
* Struts2的核心业务,请求数据自动封装和类型转换
* 这个继承不继承即可extends ActionSupport,习惯继承了
*/
public class TypeAction extends ActionSupport{ private static final long serialVersionUID = 1L;
private String name;
private String password;
private int age;
private Date birthday;//Date日期类型,导入的utilsl类型的 //普通的成员变量,必须给set,get可以不给的。
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public int getAge() {
return age;
}
public Date getBirthday() {
return birthday;
} //处理注册请求,String类型的,不能带参数的
public String register() {
System.out.println(name+" "+password+" "+age+" "+birthday);
return SUCCESS;
}
}

第四步:配置struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
    
    <!-- 声明包 -->
    <package name="finalPackage" extends="struts-default">
        <action name="requestAction" class="com.bie.finalImpl.FinalAction">
            <result name="success">success.jsp</result>
        </action>
        
        <action name="ImplAction" class="com.bie.finalImpl.ImplAction">
            <result name="success">success.jsp</result>
        </action>
        
        <action name="type_*" class="com.bie.type.TypeAction" method="{1}">
            <result name="success">show.jsp</result>
        </action>
    </package>
    
</struts>

第五步:注册页面index.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单提交的页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/type_register.action" method="post">
账号:<input type="text" name="name"/>
密码:<input type="password" name="password"/>
年龄:<input type="text" name="age"/>
出生:<input type="text" name="birthday"/>
<input type="submit" value="注册"/>
</form>
</body>
</html>

第六步:显示页面show.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示的页面</title>
</head>
<body>
<h1>Struts2的进行数据封装和类型转换的使用</h1>
</body>
</html>

方式2:

第一步:引包,省去

第二步:配置struts2的过滤器,和上面的一样

第三步:开发Action

 package com.bie.type;

 import java.util.Date;

 import com.opensymphony.xwork2.ActionSupport;

 /**
* @author BieHongLi
* @version 创建时间:2017年2月21日 下午8:39:13
* Struts2的核心业务,请求数据自动封装和类型转换
* 这个继承不继承即可extends ActionSupport,习惯继承了
*/
public class TypeAction extends ActionSupport{ private static final long serialVersionUID = 1L;
private User user;//对象类型,一定给get方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
} //处理注册请求,String类型的,不能带参数的
public String register() {
System.out.println(user.getName());
System.out.println(user.getPassword());
System.out.println(user.getAge());
System.out.println(user.getBirthday());
return SUCCESS;
} }

第四步:在开发action之前需要先创建一个实体类User.java

 package com.bie.type;

 import java.util.Date;

 /**
* @author BieHongLi
* @version 创建时间:2017年2月22日 下午4:17:02
*
*/
public class User { private String name;
private String password;
private int age;
private Date birthday;//Date日期类型,导入的utilsl类型的 //普通的成员变量,必须给set,get可以不给的。
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(int age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public int getAge() {
return age;
}
public Date getBirthday() {
return birthday;
} }

第五步:配置struts.xml,和上面的一样,省去

第六步:注册页面index.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单提交的页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/type_register.action" method="post">
账号:<input type="text" name="user.name"/><br/>
密码:<input type="password" name="user.password"/><br/>
年龄:<input type="text" name="user.age"/><br/>
出生:<input type="text" name="user.birthday"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>

第七步:显示页面show.jsp,和上面的一样,省去


2:Struts的数据类型转换:

  (1):Struts中jsp提交的数据,struts会自动转换为action中属性的类型。对于基本数据类型以及日期类型会自动转换;日期类型只支持yyyy-MM-dd格式,如何是其他格式,需要自定义类型转换器。

  (2):自定义类型转换器:

    a:局部类型转换器;

    b:全局类型转换器;

  (3):Struts2转换器API:

    |--TypeConverter                             转换器接口

      |--DefaultTypeConverter             默认类型转换器类

        |--StrutsTypeConverter         用户编写的转换器类,继承此类即可

  (4):局部类型转换器,转换器开发步骤:

    《需要注意的是TypeAction和TypeAction-conversion.properties必须在同一目录下,转换器类一般在utils包下》

    a:写转换器类,自定义转换器继承StrutsTypeConverter类,重写convertFromString和converToString方法;

    b:注册转换器,配置转换器类(告诉struts应用自己的转换器类)

        --》在同包的action目录下(在action所在包中建立),新建一个properties文件

        --》命名规则:ActionClassName-conversion.properties

           命名举例:TypeAction-conversion.properties

              《需要注意的是TypeAction必须放在相应的目录下面。》    

    c:内容,在所建立的ActionClassName-conversion.properties书写如下内容;

        user.birthday=转换器全路径(com.bie.type.MyConverter)

    d:总结:

        转换器,不能给其他Action使用。以上的转换器注册时候是与Action的名字相耦合的,因此只能在自己的Action中内部使用,称之为局部类型转换注册方式;


3:局部类型转换器,转换器开发步骤

  (1):写转换器类(依旧是上面的开发案例和内容,只是增加了转换器,数据类型转换的使用)

package com.bie.type;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /**
* @author BieHongLi
* @version 创建时间:2017年2月22日 下午5:10:49
* 自定义类型转换器
*/
public class MyConverter extends StrutsTypeConverter{     /***
     * 把String转换为指定的类型【String to Date】
     * @param context 当前上下文环境
     * @param values  jsp表单提交的字符串的值
     * @param toClass 要转换为目标类型
     */
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        //判断 内容不能为空
        if(values==null || values.length==0){
            return null;
        }
        //判断类型必须为Date
        if(Date.class!=toClass){
            return null;
        }
        try {
            //转换
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }     @Override
    public String convertToString(Map arg0, Object arg1) {
        return null;
    } }

  (2):配置转换器类(告诉struts应用自己的转换器类)

  (3):内容文件命名为:TypeAction-conversion.properties

 user.birthday=com.bie.type.MyConverter

4:全局类型转换器,转换器开发步骤:《需要写一个转换器,给所有的action用》

  (1):写转换器类  

  (2):配置全局转换器类(告诉struts应用自己的转换器类)

     --》在项目src目录下建立以下固定文件:xwork-conversion.properties  

  (3):内容

     Java.util.Date=转换器类(com.bie.type.MyConverter)

  (4)全局类型转换器,转换器开发步骤

    局部类型转换器和全局类型转换器的主要区别就是配置的不一样;

    文件命名为:xwork-conversion.properties

      要转换称的某种类型的全路径 = 自定义类型转换器的全路径;

 java.util.Date=com.bie.type.MyConverter

     注意:可以使用多种日期格式的进行转换,主要改变的是类转换器,这样yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日,这三种格式都可以进行输入了。

 package com.bie.type;

 import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /**
* @author BieHongLi
* @version 创建时间:2017年2月22日 下午5:10:49
* 自定义类型转换器
*/
public class MyConverter extends StrutsTypeConverter{ //新需求:要求项目中要支持的格式,如:yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日
//先定义项目中支持的转换的格式
DateFormat[] df={
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy年MM月dd日")
}; /***
* 把String转换为指定的类型【String to Date】
* @param context 当前上下文环境
* @param values jsp表单提交的字符串的值
* @param toClass 要转换为目标类型
*/
/*@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断 内容不能为空
if(values==null || values.length==0){
return null;
}
//判断类型必须为Date
if(Date.class!=toClass){
return null;
}
try {
//转换
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
return sdf.parse(values[0]);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}*/ @Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断 内容不能为空
if(values==null || values.length==0){
return null;
}
//判断类型必须为Date,注意Date是 java.util.Date;
if(Date.class!=toClass){
return null;
}
//迭代,转换失败向下一个格式转换,转换成功直接返回
for(int i=0;i<df.length;i++){
try {
//转换
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map arg0, Object arg1) {
return null;
} }

Struts2(接受表单参数)请求数据自动封装和数据类型转换的更多相关文章

  1. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  2. Spring 表单提交,后台自动封装有集合对象的对象

    from表单: <form action="${pageContext.request.contextPath}/vote/save" method="post&q ...

  3. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  4. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  5. 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂

    最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...

  6. Struts2第四篇【请求数据自动封装、Action得到域对象】

    前言 前三篇的Struts博文基本把Struts的配置信息讲解完了-..本博文主要讲解Struts对数据的处理 一般地,我们使用Servlet的时候都是分为几个步骤的: 得到web层的数据.封装数据 ...

  7. struts中的请求数据自动封装

    Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中.该工作主要是由Parameters拦截器做的.而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作.在st ...

  8. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  9. 项目总结15:JavaScript模拟表单提交(实现window.location.href-POST提交数据效果)

    JavaScript模拟表单提交(实现window.location.href-POST提交数据效果) 前沿 1-在具体项目开发中,用window.location.href方法下载文件,因windo ...

随机推荐

  1. Ruby 集合数组常用遍历方法

    迭代器简介 先简单介绍一下迭代器. 1.一个Ruby迭代器就是一个简单的能接收代码块的方法(比如each这个方法就是一个迭代器).特征:如果一个方法里包含了yield调用,那这个方法肯定是迭代器: 2 ...

  2. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  3. delimiter 与 存储过程

    1.如此执行语句不行,需要在 delimiter IF not EXISTS ( SELECT * FROM information_schema. COLUMNS WHERE table_schem ...

  4. C# print2flash3文件转化

    1.下载print2flash3 并且安装print2flash3 2.转换工具类 (1)需要导入using Print2Flash3; 这个程序集 using System; using Syste ...

  5. mysql 架构 ~异地容灾

    一 简介 我们来探讨下多机房下的mysql架构二 目的:    首先要清楚你的目的     1 实现异地机房的容灾备份      2 实现异地机房的双活 三 叙说     1 实现异地机房的容灾备份  ...

  6. Database学习 - mysql 连接数据库 库操作

    连接数据库 语法格式: mysql -h 服务器IP -P 端口号 -u用户名 -p密码 --prompt 命令提示符 --delimiter 指定分隔符 示例: mysql -h 127.0.0.1 ...

  7. shiro自定义realm认证(五)

    上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入 ...

  8. Shell高级编程学习笔记(基础篇)

    目录 1.shell脚本的执行方法  2.shell的变量类型  3.shell特殊变量 4.变量子串的常用操作  5.批量修改文件名实践   6.变量替换 7.在shell中计算字符串长度的方法  ...

  9. LogParse-Windows系统日志分析

    Windows系统日志分析 一.前言 本文将对常见的日志类型,利用微软日志分析工具(LogParser)结合已经掌握的恶意代码分析Windows系统日志,关联出系统的异常. 数据来源于Windows的 ...

  10. Python中的__init__()和__call__()函数

    Python中的__init__()和__call__()函数 在Python的class中有一些函数往往具有特殊的意义.__init__()和__call__()就是class很有用的两类特殊的函数 ...