Struts2框架详解(二)
Struts2结果页面配置
全局结果页面
场景:多个action,有相同的方法返回值,且都到同一个结果页面
需求:创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个结果页面
(1)未使用全局结果页面,需要分别配置
创建两个action,并且默认方法execute都返回success
public class BookAction extends ActionSupport {@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubreturn "success";}
}public class UserAction extends ActionSupport {@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubreturn "success";}
}
分别配置结果页面
<struts><package name="demo" extends="struts-default" namespace="/"><action name="book" class="cn.itcast.action.BookAction"><result name="success">/index.jsp</result></action><action name="user" class="cn.itcast.action.UserAction"><result name="success">/index.jsp</result></action></package>
</struts>
(2)使用全局结果页面,只需要在package标签下,使用<golbal-results>标签和<result>标签即可
如果多个action,方法里面返回值是相同的,且到同一个结果页面,这个时候可以在package标签里面,使用全局结果页面配置。
<struts><package name="demo" extends="struts-default" namespace="/"><global-results ><result name="success">/index.jsp</result></global-results><action name="book" class="cn.itcast.action.BookAction"> </action><action name="user" class="cn.itcast.action.UserAction"> </action></package>
</struts>
局部结果页面
在package标签下,配置的结果页面是全局结果页面
<global-results ><result name="success">/index.jsp</result>
</global-results>
在action标签下,配置的结果页面是局部结果页面
<action name="book" class="cn.itcast.action.BookAction"><result name="success">/index.jsp</result>
</action>
注意:既配置了全局页面,也配置了局部页面,最终以局部页面配置为准
result标签中type属性
(1)type属性表示如何到路径里面(转发还是重定向)
- 转发(dispatcher),默认值
- 重定向(redirect)
示例:两个action的execute方法,分别采用转发和重定向到结果页面
<struts><package name="demo" extends="struts-default" namespace="/"><action name="book" class="cn.itcast.action.BookAction"><result name="success" type="dispatcher">/hello.jsp</result></action><action name="user" class="cn.itcast.action.UserAction"><result name="success" type="redirect">/hello.jsp</result></action></package>
</struts>
(2)上面两个值dispatcher,redirect这两个值一般针对跳转到页面中配置,配置到其他action里面使用chain,redirectAcion
- chain:转发到action(一般不用,缓存问题)
- redirectAction:重定向到action--------直接写action的访问名称,即要重定向的action的name属性值
示例:两个action(book和user)的execute方法,访问book的action时,将请求重定向到user的action
public class BookAction extends ActionSupport {@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.out.println("book");return "success";}
}public class UserAction extends ActionSupport {@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.out.println("user");return "success";}
}
<struts><package name="demo" extends="struts-default" namespace="/"><action name="book" class="cn.itcast.action.BookAction"><result name="success" type="redirectAction">/user</result></action><action name="user" class="cn.itcast.action.UserAction"><result name="success" type="redirect">/hello.jsp</result></action></package>
</struts>
在action中获取表单提交的数据
之前在web阶段,提交表单数据到Servlet中,在Servlet中使用request对象的getParameter方法获取。
现在提交表单数据到action中,但是action中没有request对象,所以不能直接使用request对象,需要先获取request对象。
使用一下几种方式,不需要得到request对象,即可获取表单数据。
(1)使用ActionContext类获取
使用这种方式,不需要得到request对象,即可获取表单数据。
使用ActionContext类中的getParameters()方法,获取包含所有HttpServletRequest参数信息的map对象
Map<String,Object> getParameters() //返回一个包含所有HttpServletRequest参数信息的map对象
因为这个方法不是静态的,所以需要创建ActionContext类的对象。但是这个ActionContext类对象不可以采用new的方式来获取,需要使用getContext()方法获取ActionContext类对象
static ActionContext getContext() //获取当前线程的ActionContext对象
示例:
书写form表单,并将form表单提交到对应的action中
<body><h1>表单提交demo</h1><hr/><form action="form" method="post">用户名:<input type="text" name="uname" value=""/>密码:<input type="password" name="pwd" value=""/><input type="submit" value="提交"/></form></body>
书写form表单处理的action
public class FormAction extends ActionSupport {@Overridepublic String execute() throws Exception {//获取ActionContext对象ActionContext ac=ActionContext.getContext();//调用方法得到表单数据//key是表单输入项name属性值,value是表单输入项value属性值Map<String,Object> map=ac.getParameters();//遍历mapSet<String> keys=map.keySet();for(String key:keys){//根据key得到value//value是数组形式,因为输入项里面可能由复选框的情况Object[] obj=(Object[]) map.get(key);System.out.println(Arrays.toString(obj));}return "none";}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction"></action>
(2)使用ServletActionContext类获取
调用类里面的静态方法,即可得到request对象,response对象等
示例:
书写form表单,并将form表单提交到对应的action中
<body><h1>表单提交demo</h1><hr/><form action="form" method="post">用户名:<input type="text" name="uname" value=""/>密码:<input type="password" name="pwd" value=""/><input type="submit" value="提交"/></form></body>
书写form表单处理的action
public class FormAction extends ActionSupport {@Overridepublic String execute() throws Exception {//使用ServletActionContext类获取request对象HttpServletRequest request=ServletActionContext.getRequest();//调用request对象里面的方法得到结果String unameString= request.getParameter("uname");String pwdString= request.getParameter("pwd");System.out.println(unameString+"---"+pwdString);return "none";}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction"></action>
(3)使用接口注入方式获取(一般不用)
让action实现接口,为了得到request对象
示例:
书写form表单,并将form表单提交到对应的action中
<body><h1>表单提交demo</h1><hr/><form action="form" method="post">用户名:<input type="text" name="uname" value=""/>密码:<input type="password" name="pwd" value=""/><input type="submit" value="提交"/></form></body>
书写form表单处理的action
public class FormAction implements ServletRequestAware {HttpServletRequest request;@Overridepublic void setServletRequest(HttpServletRequest request) {this.request=request; }public String execute(){String uname=request.getParameter("uname");String pwd=request.getParameter("pwd");System.out.println(uname+"---"+pwd);return "none";}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction"></action>
在action中操作域对象
在Servlet中,有三个域对象,分别是request域,session域,servletcontext域
使用ServletActionContext类来操作三个域对象:
public class FormAction {public String execute(){//request域HttpServletRequest request=ServletActionContext.getRequest();request.setAttribute("req", "reqValue");//session域HttpSession session=request.getSession();session.setAttribute("session", "sessionValue");//ServletContext域ServletContext context=ServletActionContext.getServletContext();context.setAttribute("context", "contextValue");return "none";}
}
Struts2提供获取表单数据的方式
原始方式获取表单数据封装到实体类对象(使用ServletActionContext类获取request对象,并获取表单数据)
示例:
实体类代码:
public class User {private String username;private String password;private String address;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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public User(String username, String password, String address) {super();this.username = username;this.password = password;this.address = address;}public User() {}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password+ ", address=" + address + "]";}
}
获取表单数据的action类:
public class UserAction extends ActionSupport {@Overridepublic String execute() throws Exception {//获取表单数据HttpServletRequest request=ServletActionContext.getRequest();String username=request.getParameter("username");String password=request.getParameter("password");String address=request.getParameter("address");//封装到实体类对象中User user=new User();user.setUsername(username);user.setPassword(password);user.setAddress(address);System.out.println(user);return "none";}
}
(1)属性封装
直接把表单提交数据封装到action的属性里面
使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面
实现步骤:
- 在action成员变量位置定义变量(变量名称和表单输入项的name属性值一样)
- 生成变量的set方法(把set和get方法都写出来)
示例:
public class UserAction extends ActionSupport {//定义变量(变量名称与表单name属性值一样)private String username;private String password;private String address;//生成变量的set和get方法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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String execute() throws Exception {System.out.println(username+"---"+password+"---"+address);return "none";}
}
(2)模型驱动封装(重点)
使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
实现步骤:(前提要求:表单输入项name属性值和实体类属性名称一样)
- action实现接口ModelDriver
- 实现接口里面的方法getModel方法
- 在action里面创建实体类对象
示例:
创建实体类:
public class User {private String username;private String password;private String address;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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public User(String username, String password, String address) {super();this.username = username;this.password = password;this.address = address;}public User() {}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password+ ", address=" + address + "]";}
}
创建action类,实现ModelDriver接口,重写getModel方法
public class UserAction extends ActionSupport implements ModelDriven<User> { User user=new User(); @Overridepublic String execute() throws Exception {System.out.println(user);return "none";}@Overridepublic User getModel() {//返回创建的user对象return user;}
}
使用属性封装和模型驱动封装注意问题:
- 在action中,获取表单数据可以使用属性封装,也可以使用模型驱动封装,但是不能同时使用属性封装和模型驱动封装获取同一个表单数据。
(3)表达式封装
使用表达式封装也可以把表单数据封装到实体类对象里面
实现步骤:
- 在action里面声明实体类
- 生成实体类变量的set和get方法
- 在表单输入项的name属性值里面书写表达式形式
示例:
创建实体类:
public class User {private String username;private String password;private String address;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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public User(String username, String password, String address) {super();this.username = username;this.password = password;this.address = address;}public User() {}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password+ ", address=" + address + "]";}
}
创建action类,声明实体类,并书写实体类的get和set方法
public class UserAction extends ActionSupport { //声明实体类User user; //生成实体类变量的set和get方法public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String execute() throws Exception {System.out.println(user);return "none";}
}
在表单输入项的name属性值里面书写表达式形式
<body><h1>form表单提交demo</h1><hr/><form action="user" method="post">username:<input type="text" name="user.username" value=""/><br/>password:<input type="password" name="user.password" value=""/><br/>address:<input type="text" name="user.address" value=""/><br/><input type="submit" value="提交"/></form></body>
比较表达式封装和模型驱动封装
相同点:
- 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
不同点:
- 使用模型驱动只能把数据封装到一个实体类对象里面,在一个action里面不能使用模型驱动把数据封装到不同的实体对象里面
- 使用表达式封装可以把数据封装到不同的实体类对象里面
示例:使用表达式封装将表单数据封装到不同实体类对象里面,这里建立两个实体类,分别为User和Book。
创建实体类:
public class User {private String username;private String password;private String address;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;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public User(String username, String password, String address) {super();this.username = username;this.password = password;this.address = address;}public User() {}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password+ ", address=" + address + "]";}
}
public class Book {private String bname;public String getBname() {return bname;}public void setBname(String bname) {this.bname = bname;}public Book(String bname) {super();this.bname = bname;}public Book() {}@Overridepublic String toString() {return "Book [bname=" + bname + "]";}
}
创建action类,声明实体类,并书写实体类的get和set方法
public class UserAction extends ActionSupport { //声明实体类User user; Book book;//生成实体类变量的set和get方法public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}@Overridepublic String execute() throws Exception {System.out.println(user);System.out.println(book);return "none";}
}
在表单输入项的name属性值里面书写表达式形式
<body><h1>form表单提交demo</h1><hr/><form action="user" method="post">username:<input type="text" name="user.username" value=""/><br/>password:<input type="password" name="user.password" value=""/><br/>address:<input type="text" name="user.address" value=""/><br/>bookname:<input type="text" name=book.bname value=""/></br><input type="submit" value="提交"/></form></body>
Struts2获取数据封装到集合中(会用)
(1)封装到list集合
实现步骤:
- 在action中声明List
- 生成List变量的set和get方法
- 在表单输入项里面书写表达式
示例:
书写form表单,以提交多个用户的数据信息,在表单输入项的name属性值里面书写表达式形式(采用List集合)
<body><h1>form表单提交demo</h1><hr/><form action="user" method="post">username:<input type="text" name="list[0].username" value=""/><br/>password:<input type="password" name="list[0].password" value=""/><br/>address:<input type="text" name="list[0].address" value=""/><br/><hr/>username:<input type="text" name="list[1].username" value=""/><br/>password:<input type="password" name="list[1].password" value=""/><br/>address:<input type="text" name="list[1].address" value=""/><br/><hr/><input type="submit" value="提交"/></form></body>
创建action类,声明List集合类,并书写List类对象的get和set方法
public class UserAction extends ActionSupport { private List<User> list;public List<User> getList() {return list;}public void setList(List<User> list) {this.list = list;}@Overridepublic String execute() throws Exception {System.out.println(list);return "none";}
}
(2)封装到map集合
实现步骤:
- 在action中声明Map
- 生成Map变量的set和get方法
- 在表单输入项里面书写表达式
示例:
书写form表单,以提交多个用户的数据信息,在表单输入项的name属性值里面书写表达式形式(采用Map集合)
<body><h1>form表单提交demo</h1><hr/><form action="user" method="post">username:<input type="text" name="map['one'].username" value=""/><br/>password:<input type="password" name="map['one'].password" value=""/><br/>address:<input type="text" name="map['one'].address" value=""/><br/><hr/>username:<input type="text" name="map['one'].username" value=""/><br/>password:<input type="password" name="map['one'].password" value=""/><br/>address:<input type="text" name="map['one'].address" value=""/><br/><hr/><input type="submit" value="提交"/></form></body>
创建action类,声明Map集合类,并书写Map类对象的get和set方法
public class UserAction extends ActionSupport { private Map<String, User> map;public Map<String, User> getMap() {return map;}public void setMap(Map<String, User> map) {this.map = map;}@Overridepublic String execute() throws Exception {System.out.println(map);return "none";}}
Struts2框架详解(二)相关推荐
- struts2框架详解
一.struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的 ...
- Struts2框架详解(四)
Struts2拦截器概述(interceptor) Struts2是框架,封装了很多的功能,Struts2里面封装的功能都是在拦截器里面 Struts2里面封装了很多的功能,有很多拦截器,并不是每次这 ...
- Linux内核Thermal框架详解十二、Thermal Governor(2)
本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...
- Pytest框架详解(二)
Pytest框架详解(二) 文章目录 Pytest框架详解(二) 一.引言 二.参数化 列表嵌套元组 三.标记 3.1显式指定 3.2模糊匹配 3.3pytest.mark 四.配置文件 五.依赖 六 ...
- jQuery Validate验证框架详解
2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...
- WebDriver自动化测试框架详解
webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...
- OS--进程间通信详解(二)
OS–进程间通信详解(二) 文章目录 OS--进程间通信详解(二) 一.进程间通信 1.互斥量 Futexes Pthreads中的互斥量 2.管程 3.消息传递 消息传递系统的设计要点 用消息传递解 ...
- Django REST FRAMEWORK swagger(一)框架详解
Django REST FRAMEWORK swagger(一.框架详解) 一.Django REST SWAGGER框架图 具体见下图 二.说明 RESTFul说明 每一个URI代表一种资源: 客 ...
最新文章
- linux tomcat集群配置笔记
- 学完这份「计算机基础知识」,你也可以来字节跳动(附下载)
- 【论文串讲】从GPT和BERT到XLNet
- JavaWeb学习之路——SpringBoot 中几种异常处理方法(四)
- 在线视频常见加密方式及安全性透析
- 50秒开门,3分钟开走,特斯拉Model S就这样不翼而飞
- php+mysql案例含源码_[源码和文档分享]基于PHP和MYSQL数据库实现的失物招领系统...
- iOS开发之国际化(二)
- easyUI替换非16x16的图标
- 熊族部落---要邀请码
- YouTube视频设置水印
- 华为路由交换工程师(VRP基础介绍)
- UEFI+GPT引导实践篇 (UEFI引导安装64位Win7/Win8)
- 数据挖掘的10个常见问题
- CentOS 7下的软件安装方法总结
- Android Handler机制(一) 为什么设计Handler
- 部署静态页面到腾讯云服务器
- Windows Server 2016 远程桌面会话主机授权设置
- 图的m色着色问题 回溯法(算法设计与分析)Java
- 使用ARD远程管理用户的Parental Control和Dock
热门文章
- HttpInvoker简单介绍以及使用
- Error response from daemon: error while removing network: network macvlan1 id 432b2be6bba68f376ffcfb
- 浙江大学计算机专业招高考日语吗,高考日语可以报哪些学校和专业
- 基于STM32单片机的智能家居烟雾温度火灾防盗报警的设计与实现
- PDF转图片,合并后加水印
- 使用 xlsx 下载 xlsx 文件
- 214Echarts - 数据区域缩放(Wind Barb)
- SAP-MM 采购订单净价取值精度问题
- JDK8 按List中元素对象的多字段对List进行排序
- 深度学习-神经网络CNN-感受野大小的计算公式有哪些?可能会遇到哪些坑?如何理解感受野大小的计算公式?