struts2第二天——数据操作
先介绍一下大致内容:
大致内容:
结果页面配置
action获取表单提交数据
提供获取表单数据的方式(封装数据)
表单数据封装到集合中
表达式封装和模型驱动封装比较
一、结果页面配置:
result标签是配置action的返回值,然后到不同的路径去
(复制昨天的项目过来时,除了改项目名称外,还必须改web 项目名)
改web项目的项目名可以右击->properties->搜索web找到settings->修改context name
回顾流程:导包——创建action——创建核心配置文件——在web.xml中配置过滤器
1.全局结果页配置
场景:多个action返回的结果页是相同的,可以使用全局结果页作为共用的部分
在同一个package里的,在package下的作为子标签配置
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
2.局部结果页配置
在action里面写的就是局部结果页面,
同时配置全局与局部,以局部结果页配置为准
【重点】:
result标签中的 type 属性:通俗理解是如何到路径去的(默认是转发)
type属性值:
1.dispatcher(默认):用来转向页面,通常处理JSP ===转发页面
2.redirect:重定向到一个URL,被跳转的页面中丢失传递的信息,如request.===重定向页面
(ctrl + F5) :无缓存刷新,俗称大刷新
以上 1 2 针对到其他页面的
3.chain:用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息 ===转发action
4.redirectAction:重定向到一个Action,跳转的页面中丢失传递的信息. ===重定向action
!注意要写action的访问名称,直接写要去的action的name(不用写路径的加/的等)
3.4针对的是到其它action的操作,一般用4,因为3会有缓存
这是以上几点配置后的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 name="demo2" extends="struts-default" namespace="/">
<!-- 全局结果页面配置 -->
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="cn.action.BookAction">
<!-- 重定向action,写的是action的name -->
<result name="success" type="redirectAction">orders</result>
</action>
<action name="orders" class="cn.action.OrdersAction">
<result name="success">/hello2.jsp</result>
</action>
</package>
<package name="formDemo" extends="struts-default" namespace="/">
<action name="form1" class="cn.action.FormAction"></action>
<action name="data1" class="cn.action.FiledAction"></action>
<action name="data2" class="cn.action.ModelAction"></action>
<action name="list" class="cn.action.ListAction"></action>
</package>
</struts>
二、在action中获取表单提交数据(实际开发中使用最多的为模型驱动封装)
在web阶段,使用的是request对象,通过getParameter()等方法
但是action中不能直接使用request,
主要有三种方式:
1.通过ActionContext类
2.通过ServletActionContext类
3.接口注入的方式(使用较少)
1和2 为struts封装的好的类
1:ActionContext类:
(找的是xwork下的api)底层是使用request的封装,没有直接得到request对象,虽然官方推荐(解耦合),但更多人喜欢的是第二种
ActionContext如何获取:静态方法 getContext
可以简单创建表单页面提交到action进行获取
如何获取:getParameters() 得到一个map key为string value为Object[]数组是由于可能有复选框等,得到的是所有表单数据的map集合
如何直接输出数组值:Arrays.toString()
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
2:ServletActionCotext类(类似web一个顶九个的类,可以召唤其它域对象等)
(找的是org.apache.struts2包)可以直接调用静态方法得到request
喜欢用的理由是比较直观
表单提交中文没有乱码问题:因为struts2中存在处理POST提交的中文乱码问题(见day01)
package cn.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class FormAction extends ActionSupport { /**
* 演示ServletActionContext类的使用
*/
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
/*request.getSession();
ServletActionContext.getServletContext();*/
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+password);
return NONE;
} }
3.(只做了解)让action实现接口(ServletRequestAware),也能得到request对象
在action中操作域对象
Servlet域对象:request session servletContext
使用ServletActionContext进行操作(先get得到,再get/setAttribute()等)
当然,用的最多的还是request域
HttpServletRequest request = ServletActionContext.getRequest();
request.getSession(); //注意session的获取
ServletActionContext.getServletContext();
三、表单数据的封装
1.原始方式封装表单数据(案例DemoAction)(越是原始方式越是强大,但有时不是那么方便快捷 走路最原始,乘坐交通工具虽快,但有时不是那么高效)
package cn.action; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; import cn.entiry.User;
/**
* 封装表单数据到实体类中
* @author jiangbei01
*
*/
public class DemoAction extends ActionSupport { @Override
public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password"); User user = new User();
user.setUsername(username);
user.setPassword(password); return NONE;
}
}
struts2提供了:
1.属性封装
在action定义成员变量,而且变量名需要和表单项name属性需要一致
再生成get/set(虽然实际上只需要set方法)
思想类似于 beanutils 底层是内省
会进行属性匹配,匹配完成后调用set进行设置
这种情况要封装到对象中去还需要手动set数据,这种形式也不是特别方便
package cn.action; import com.opensymphony.xwork2.ActionSupport;
/**
* 使用属性封装获取表单数据
* @author jiangbei01
*
*/
public class FiledAction extends ActionSupport { private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} //测试
@Override
public String execute() throws Exception {
System.out.println(username+password);
return NONE;
}
}
2.【重点】模型驱动封装,最常用
底层也就是利用上一步的属性封装的操作
action实现ModelDrivern 模型驱动接口(传入泛型类型,也就是对应实体类类名)
创建实体类对象
实现getModel()方法,返回对象
代码量大大减少(request也不用自己得了)
大致执行流程:getModel()方法获取要赋值的实体类,此实体类必须要实例化,否则为空;此时实体类置于值栈栈顶,相关属性
也可以通过setValue()进行赋值,而 实现person的getter方法,用于当请求转发后,其他界面数据访问
package cn.action; import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; import cn.entiry.User; public class ModelAction extends ActionSupport implements ModelDriven<User>{ //手动创建实体类对象
private User user = new User();
//考虑是否需要user的set/get方法!
@Override
public User getModel() {
//返回创建的user对象
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
} }
使用属性封装和模型驱动封装注意的问题:
不能同时使用两种方式来获取同一个表单的数据。
3.表达式封装(会用)有时候也可以归类到属性封装
也可以把表单数据封装到实体类
在action里声明一个实体类;private User user
生成实体类的set/get方法 this.user = user等
在表单项的 name 值里写表达式的形式:<input type="text" name="user.username"/>
写法略显麻烦,但功能可以实现
表达式封装和模型驱动封装对比:
两者都可以封装数据到实体类对象中;
模型驱动只能封装到一个实体类中(ModelDrivern<T> T只能确定一个实体类),
而表达式封装可以封装到不同实体类中
四、表单数据封装到集合中(会用)
封装数据到list集合:(用的较少)
在action里面声明list
生成list的set/get方法
在表单输入项里写表达式的写法:
<form action="${pageContext.request.contextPath }/list.action" method="post">
用户名:<input type="text" name="list[0].username"/><br/>
密 码:<input type="password" name="list[0].password"/><br/>
用户名2:<input type="text" name="list[1].username"/><br/>
密 码2:<input type="password" name="list[1].password"/><br/>
用户名3:<input type="text" name="map['one'].username"/><br/>
密 码3:<input type="password" name="map['two'].password"/><br/>
<input type="submit" value="提交"/>
</form>
其中list[0] 表示List的第一个元素,也就是第一个User对象
package cn.action; import java.util.List;
import java.util.Map; import com.opensymphony.xwork2.ActionSupport; import cn.entiry.User;
/**
* 表单数据封装到list中
* @author jiangbei01
*
*/
public class ListAction extends ActionSupport { private List<User> list; public List<User> getList() {
return list;
} public void setList(List<User> list) {
this.list = list;
} @Override
public String execute() throws Exception {
//可以对list进行其他的操作等
System.out.println(list);
return NONE;
}
}
封装数据到map集合:(用的更少)
在action里声明map
private Map<String,User> map;
生成map的set/get方法
private Map<String,User> map; public Map<String, User> getMap() {
return map;
} public void setMap(Map<String, User> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
System.out.println(map.get("one").getUsername());
return NONE;
}
在表单项改成相应的写法
先设置key的值,再放value (代码见封装到List代码处)
用户名3:<input type="text" name="map['one'].username"/><br/>
密 码3:<input type="password" name="map['one'].password"/><br/>
key是one,把username设置进value的User中
小结:
封装到集合使用的都较少,因为需要知道固定的对象,写法非常固定
常用的是ServletActionContext操作域对象获取数据
封装表单数据常用的是模型驱动,实现接口,实现方法,注意实体类与表单项name属性值一致
struts2第二天——数据操作的更多相关文章
- python第二十九课——文件读写(读取数据操作)
演示读取数据操作:path=r'a.txt' 1.打开文件f1=open(path,'r') 2.读取数据content1=f1.read(3)print(content1) content1=f1. ...
- 深入了解Struts2返回JSON数据的原理
首先来看一下JSON官方对于"JSON"的解释: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析 ...
- Jqgrid入门-结合Struts2+json实现数据展示(五)
DEMO用的是ssh框架实现的,具体怎么搭建的就不多做说明了.分页表格的数据操作难点就是数据展现.至于增删改直接用hibernate原生的方法实现即可. 初步分析:表格要实现分页,那么 ...
- Struts2第二天
Struts2第二天 昨天: 1.Action的编写方式:实现Action接口.继承ActionSupport.自定义pojo作为action 2.action调用方法:默认的execute.meth ...
- (转)Struts2返回JSON数据的具体应用范例
转载自 yshjava的个人博客主页 <Struts2返回JSON数据的具体应用范例> 早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...
- Struts2返回JSON数据的具体应用范例
早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身,渐渐的也淡忘了此事.直到前两天有同事在工作中遇到这个问题,来找 ...
- SSH框架之Struts2第二篇
1.2 知识点 1.2.1 Struts2的Servlet的API的访问 1.2.1.1 方式一 : 通过ActionContext实现 页面: <h1>Servlet的API的访问方式一 ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- oracle-2-sql数据操作和查询
主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是 ...
随机推荐
- tomcat idea optinos
-server -XX:PermSize=128M -XX:MaxPermSize=256m -Xms512m -Xmx1024m
- 关于Entity Framework关系配置,提示列名XXXX_Id无效的问题
问题描述 : 数据库中有两张表,如下: Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表 ...
- [翻译] BTSimpleRippleButton
BTSimpleRippleButton https://github.com/balram3429/btSimpleRippleButton This is a custom button for ...
- Python入门-模块2(sys模块、shutil 模块)
sys模块: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 s ...
- 铁乐学Python_day10_函数2
今天书接昨天的函数继续去学习了解: 昨天说到函数的动态参数. 1.函数的[动态参数] *args 动态参数,万能参数 args接受的就是实参对应的所有剩余的位置参数,并将其放在元组( )中. def ...
- APUE 4.8 umask函数
- tomcat-7.0.30安装及配置
使用说明: 一.1.下载jdk(http://java.sun.com/javase/downloads/index.jsp),2.安装jdk-6u14-windows-i586.exe 3.配置环境 ...
- python处理数据(一)
CSV数据处理 csv文件格式 逗号分隔符(csv),有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本的形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进 ...
- C# 词法分析器(一)词法分析介绍
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 虽然文章的标题是词法分析,但首先还是要从编译原理说开 ...
- AOP-Advisor-笔记
一.Advisor接口 这个接口是一个通知者的顶层接口.它实现类持有一个通知(advice)和一个过滤器的引用.用过滤器来决定通知是否合适目标对象. 这个接口只有两个方法,所以将整个代码贴上来. /* ...