struts2 二: 参数封装
封装请求正文到对象中(非常重要)
1、静态参数封装
在struts.xml配置文件中,给动作类注入值。调用的是setter方法。
struts.xml的编写:
<action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser">
<param name="username">张三</param>
<param name="age">18</param>
</action>
动作类中编写的:
/**
* 静态参数封装
*/
public class Demo1Action{
private String username;
private int age;
public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
原因:是由一个staticParams的拦截器完成注入的。
2、动态参数封装:开发时用到的
通过用户的表单封装请求正文参数。
2.1、动作类作为实体模型
实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)
<!-- 动态参数封装的第一种形式的配置 -->
<action name="action2" class="com.itheima.web.action.Demo2Action" method="addUser">
</action>
import com.opensymphony.xwork2.ActionSupport;
/**
* 动态参数封装,第一种情况:
* 数据模型与动作类写在一起
* @author zhy
*
*/
public class Demo2Action extends ActionSupport { private String username;
private int age; public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>动态参数封装</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/action2.action" method="post">
<%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
用户名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
原因:是由params拦截器完成的。
2.2、动作类和实体模型分开
配置文件代码:
package com.itheima.web.action; import com.itheima.domain.User;
import com.opensymphony.xwork2.ActionSupport;
/**
* 动态参数封装,第二种情况:
* 数据模型与动作类分开写
* @author zhy
*
*/
public class Demo3Action extends ActionSupport { //定义数据模型对象(可以实例化也可以不实例化)
private User user = new User(); public String addUser(){
System.out.println(user.getUsername()+","+user.getAge());
return null;//不返回任何结果视图 NONE常量
} public User getUser() {
System.out.println("getUser");
return user;
}
public void setUser(User user) {
System.out.println("setUser");
this.user = user;
} }
动作类代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>动态参数封装</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/action3.action" method="post">
<%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>
用户名:<input type="text" name="user.username" /><br/>
年龄:<input type="text" name="user.age"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
jsp代码
问题:
由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。
原因:
框架会get判断有误模型方法,有: 就再get一次拿到对象封装参数 没有: 创建一个对象set进动作类,之后再get对象封装参数。
2.3、模型驱动:建立动作类和模型分开的前提下(开发中采用的方式)
<!-- 动态参数封装的第三种形式的配置(模型驱动) -->
<action name="action4" class="com.itheima.web.action.Demo4Action" method="addUser"></action>
</package>
配置文件代码
/**
* 动态参数封装,第三种情况:模型驱动
* 要想使用模型驱动,必须数据模型与动作类分开写
* 实现模型驱动的步骤:
* 1.实现一个ModelDriven的接口
* 2.实现接口中的抽象方法getModel()
* 3.在使用模型驱动的时候,数据模型必须由我们自己来实例化
*
* 是由一个ModelDriven的拦截器为我们做的
*
* 实际开发中采用的方式
* @author zhy
*
*/
public class Demo4Action extends ActionSupport implements ModelDriven<User>{ //定义数据模型对象
private User user = new User() ;//使用模型驱动,必须自己实例化模型对象 //该方法返回的是数据模型
public User getModel() {
return user;
} public String addUser(){
System.out.println(user.getUsername()+","+user.getAge());
return null;//不返回任何结果视图 NONE常量
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} }
动作类
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>动态参数封装</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/action4.action" method="post">
<%--需要注意name属性的取值,已经不是一个普通的字符串了 --%>
用户名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age"/><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
jsp代码
原因:是由一个modelDriven拦截器做的, 先判断是否是想 ModeDriven接口,再看是否返回了模型对象,不是则跳过
是: 压入 valueStack栈顶, 之后由params 拦截器封装参数。
struts2 二: 参数封装的更多相关文章
- Struts2(二)之封装请求正文、数据类型转换、数据验证
一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...
- struts2 复杂参数封装
1.1.1 Struts2中封装复杂类型的数据: 封装到List集合: 页面: 商品名称:<input type="text" name="products[ ...
- struts2(二) 表单参数自动封装和参数类型自动转换
前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...
- (八)Struts2中的参数封装
一.静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变. 例子: (1)我们首先创建一个Action类,里面有两个参数,用来封装请求参数 public class User exten ...
- 二次封装Response类 | 视图类传递参数给序列化类context
二次封装Response类 源码: class Response(SimpleTemplateResponse): """ An HttpResponse that al ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- iOS项目相关@AFN&SDWeb的二次封装
一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache
虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...
随机推荐
- WPF中如何为ItemsControl添加ScrollViewer并显示ScrollBar
今天在开发的过程中突然碰到了一个问题,本来的意图是想当ItemsControl中加载的Item达到一定数量时,会出现ScrollViewer并出现垂直的滚动条,但是实际上并不能够达成目标,对于熟手来说 ...
- 学习 Spring (八) 注解之 Bean 的定义及作用域
Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...
- linu系统文件授权命令
- Cetos 中添加bbr服务
说明:此方法只适用于KVM架构的,OpenVZ平台无法使用: 一:安装bbr服务: # wget --no-check-certificate https://github.com/teddysun/ ...
- 学习Android过程中遇到的问题及解决方法——电话监听
也许有时你会有这样一个需求:通电话时有一个重要的事需要记下来或者和一个陌生人特别是大骗子通话时,这是就想如果能把通话录下来就方便多了.(这才是我写这个代码的目的!!!) 在此过程中,犯了一个很大的错误 ...
- 「BZOJ1691」[Usaco2007 Dec] 挑剔的美食家 (Treap)
Description 与很多奶牛一样,Farmer John那群养尊处优的奶牛们对食物越来越挑剔,随便拿堆草就能打发她们午饭的日子自然是一去不返了.现在,Farmer John不得不去牧草专供商那里 ...
- Node<T> 的作用
Java中常见到以下定义的类 public class Node<T> { T data; public Node<T> next; Node(T data) { this.d ...
- php+redis配置
系统环境: win10+phpstudy+lamp 安装扩展 php5.6.4 =>下载地址:http://windows.php.net/downloads/pecl/releases/red ...
- project 2013 显示标题
1.分析 右键只能插入任务,不能插入标题,而插入任务会被编号,目前只能在打印设置标题,不能在编辑界面显示标题的,或者使用最高级任务的方式 2.解决 文件,打印,页面设置,页眉,居中,输入标题,这样打印 ...
- 【BZOJ3561】DZY Loves Math VI (数论)
[BZOJ3561]DZY Loves Math VI (数论) 题面 BZOJ 题解 \[\begin{aligned} ans&=\sum_{i=1}^n\sum_{j=1}^m\sum_ ...