【SSH】Struts2学习(二)(待完善)结果视图、访问ServletAPI、数据封装(获取页面参数)、Struts校验
来源:互联网 发布:阳光灿烂的日子知乎 编辑:程序博客网 时间:2024/06/04 18:34
一、Struts2结果类型视图(逻辑结果视图)
前奏:该部分内容指的就是struts2配置文件中的result元素的使用
1、result元素
作用:为动作指定结果视图
属性:name:逻辑视图的名称,对应着动作方法的返回值。默认值是success。
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。
属性:name:逻辑视图的名称,对应着动作方法的返回值。默认值是success。
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。
2、result元素中type的取值
type属性的取值在struts-default.xml中定义着。常用结果类型介绍:
dispatcher:(默认值) 使用请求转发,转向一个页面。
redirect: 使用重定向,转向一个页面。
redirectAction:注意:使用的是重定向。
a.重定向到另一个相同名称空间的动作。
b.重定向到不同名称空间的动作必须使用result下的子元素,param来指定
如:
dispatcher:(默认值) 使用请求转发,转向一个页面。
redirect: 使用重定向,转向一个页面。
redirectAction:注意:使用的是重定向。
a.重定向到另一个相同名称空间的动作。
b.重定向到不同名称空间的动作必须使用result下的子元素,param来指定
如:
<result type=”redirectAction” ><param name=”namespace”>/house</param><param name=”actionName”>/addhouse</param></result>代表访问namespace为house的package下的,action的name属性为addHouse的action
chain:注意: 使用的是请求转发。
a.转发到另一个相同名称空间的动作。
b.请求转发到不同名称空间的动作
四种结果处理方式示例:
<?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="result" namespace="/" extends="struts-default"><!-- 转发 --><action name="Demo1Action" class="com.sh.a_result.Demo1Action" method="execute"><result name="success" type="dispatcher">/hello.jsp</result></action><!-- 重定向 --><action name="Demo2Action" class="com.sh.a_result.Demo2Action" method="execute"><result name="success" type="redirect">/hello.jsp</result></action><!-- 转发到Action --><action name="Demo3Action" class="com.sh.a_result.Demo3Action" method="execute"><result type="chain"> <!-- Action的名字 --> <param name="actionName">Demo2Action</param> <!-- Action所在的命名空间 --> <param name="namespace">/</param> </result></action><!-- 重定向到Action --><action name="Demo4Action" class="com.sh.a_result.Demo4Action" method="execute"><result name="success" type="redirectAction"> <!-- Action的名字 --> <param name="actionName">Demo1Action</param> <!-- Action所在的命名空间 --> <param name="namespace">/</param> </result></action></package></struts>
3、result元素中param子元素
在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。param元素的作用:依赖注入(Dependence Injection)思想
我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。而param元素就是将配置的参数,注入到该类中。
调用的是对应类的setter方法进行注入的。
例如:redirectAction结果视图
该类中肯定会有对actionName和namespace属性的注入方法(setter方法)。
4、自定义结果类型
通过前面的内容,我们看出,其实结果类型就是一个类,这些类都实现了com.opensymphony.xwork2.Result接口。或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport。
这些类都有一个doExecute方法,用于执行结果视图。
综上:我们也可以自己写一个结果视图。
例子:
输出CAPTCHA(验证码)图像的结果类型。
第一步:写一个类,实现接口或者继承接口的实现类
关键:在struts中怎么使用servlet中的对象:ServletActionContext
public class MyResultType implements Result {private int width ;private int height ;public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}@Overridepublic void execute(ActionInvocation invocation) throws Exception {//生成验证码ValidateCode validateCode = new ValidateCode(width,height,4,10);String code = validateCode.getCode();System.out.println("验证码:"+code);//怎么把验证码显示到页面//怎么在struts2中使用servlet的apiHttpServletResponse response = ServletActionContext.getResponse();//把验证码展示到页面validateCode.write(response.getOutputStream());}}第二步:在struts.xml文件中配置结果类型使用result-types标签的子标签result-type指定结果视图
第三步:在action配置时引用把result的type属性设置为自定义结果视图。
扩展:通过可配置的参数,实现图像大小的调整
使用param标签给自定义结果类注入高度和宽度
<?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> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <!-- 配置自定义结果 --> <result-types> <result-type name="yanzhengma" class="com.itqf.resulttype.MyResultType"></result-type> </result-types> <!-- 全局视图 --> <global-results> <result name="error">/error.jsp</result> </global-results> <action name="showImg" > <result type="yanzhengma"> <!-- 给自定义结果类型注入值 --> <param name="width">500</param> <param name="height">100</param> </result> </action> <action name="toLogin" class="com.itqf.action.UserAction"> <result>/login.jsp</result> <!-- 局部结果 --> <result name="error">/error1.jsp</result> </action> </package></struts>
5、全局视图和局部视图
5.1、局部视图
5.2、全局视图
使用global-results配置全局视图原则:先查找局部视图,如果没有,再查找全局结果视图
<!-- 全局视图 --> <global-results> <result name="error">/error.jsp</result> </global-results>
二、访问ServletAPI的3种方式
访问原理:
1、第1种方式——通过ActionContext(常用)
/** * 如何在action中获得原生ServletAPI * @author Administrator * */public class Demo5Action extends ActionSupport{public String execute() throws Exception {//request域 => map(struts2并不推荐使用原生request域)Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");//推荐ActionContext.getContext().put("name", "requestTom");//Session域 => mapMap<String, Object> sessionScope = ActionContext.getContext().getSession();sessionScope.put("name", "sessionTom");//application域 => mapMap<String, Object> applicationScope = ActionContext.getContext().getApplication();applicationScope.put("name", "applicationTom");return SUCCESS;}}
2、第2种方式 ——通过ServletActionContext
public class Demo6Action extends ActionSupport {//并不推荐public String execute() throws Exception {//原生requestHttpServletRequest request = ServletActionContext.getRequest();//原生sessionHttpSession session = request.getSession();//原生responseHttpServletResponse response = ServletActionContext.getResponse();//原生servletContextServletContext servletContext = ServletActionContext.getServletContext();return SUCCESS;}}
3、第3种方式——通过实现相关接口 XXXAware
public class Demo7Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware {private HttpServletRequest request;public String execute() throws Exception { System.out.println("原生request:"+request);return SUCCESS;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;}@Overridepublic void setServletContext(ServletContext arg0) {// TODO Auto-generated method stub}@Overridepublic void setServletResponse(HttpServletResponse arg0) {// TODO Auto-generated method stub}}
三、数据封装(struts获得页面参数)3种方式
struts2将数据的封装分为两大类,一类为属性驱动,一类为模型驱动,属性驱动可分为两种,一种只需要提供属性的set方法即可,另一种则是通过表达式的方式直接封装到对象当中
1、提供属性的set方法的方式(属性驱动)
页面:
<%@ 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>Insert title here</title></head><body><form action="${pageContext.request.contextPath }/Demo8Action">用户名:<input type="text" name="name">年龄:<input type="text" name="age">生日:<input type="text" name="birthday"><input type="submit" value="提交"></form></body></html>
Action类:
public class Demo8Action extends ActionSupport {public Demo8Action() {super();System.out.println("demo8Action被创建了!");}// 准备与参数键名称相同的属性private String name;// 自动类型转换 只能转换8大基本数据类型以及对应包装类private Integer age;// 支持特定类型字符串转换为Date ,例如 yyyy-MM-ddprivate Date birthday;public String execute() throws Exception {System.out.println("name参数值:" + name + ",age参数值:" + age + ",生日:" + birthday);return SUCCESS;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}}
弊端:传的字段比较少,属性很多的情况下,代码量会非常臃肿
2、页面提供表达式的方式(对象驱动)
<%@ 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>Insert title here</title></head><body><form action="${pageContext.request.contextPath }/Demo9Action">用户名:<input type="text" name="user.name">年龄:<input type="text" name="user.age">生日:<input type="text" name="user.birthday"><input type="submit" value="提交"></form></body></html>
public class Demo9Action extends ActionSupport {private User user;public String execute() throws Exception {System.out.println(user);return SUCCESS;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
这种方式需要封装一个实体类,在Action中要提供user的get方法
3、模型驱动
页面:<%@ 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>Insert title here</title></head><body><form action="${pageContext.request.contextPath }/Demo10Action">用户名:<input type="text" name="name">年龄:<input type="text" name="age">生日:<input type="text" name="birthday"><input type="submit" value="提交"></form></body></html>
Action类:
public class Demo10Action extends ActionSupport implements ModelDriven<User>{//手动构建对象private User user = new User();public String execute() throws Exception {System.out.println(user);return SUCCESS;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic User getModel() {// TODO Auto-generated method stubreturn user;}}
该方法需要Action实现ModelDriven接口,需要手动构建对象
四、集合类型参数封装
1、封装到List集合中
页面:
Action:
2、封装到Map集合中
页面:
Action:
五、Struts2校验
待完善
六、Struts2对json的支持
待完善
参考源码:https://github.com/AmazeLee/Struts2.git
To live is the rarest thing in the world. Most people exist. That is all.
生活,世间最罕见之事。生存,世间最常见之事。仅此而已。
阅读全文
0 0
- 【SSH】Struts2学习(二)(待完善)结果视图、访问ServletAPI、数据封装(获取页面参数)、Struts校验
- struts2(六)获取servletAPI和封装表单数据
- 细谈struts2(六)获取servletAPI和封装表单数据
- Struts2学习(第六篇)——获取servletAPI和封装表单数据
- Struts2 - Struts访问ServletAPI和OGNL学习(从零开始学习Strust2_07)
- Struts2(二)使用Struts2访问ServletAPI对象
- Struts2(二)使用Struts2访问ServletAPI对象
- struts2学习笔记(2)---Action中访问ServletAPI获取Map类型的Servlet元素
- struts2学习笔记(3)---Action中访问ServletAPI获取真实类型的Servlet元素
- struts2学习(11)——action访问ServletAPI
- Struts2获取/访问ServletAPI
- Java程序员从笨鸟到菜鸟之(四十三)细谈struts2(六)获取servletAPI和封装表单数据
- Java程序员从笨鸟到菜鸟之(四十三)细谈struts2(六)获取servletAPI和封装表单数据
- struts2的开发(获取ServletAPI对象)
- (Struts2学习篇) Struts2数据校验之二
- Struts2学习(二)数据封装机制
- Struts2的结果类型、ServletAPI获取、参数接收
- okHttp学习(待完善)
- 找出单链表的倒数第k个节点
- TensorFlow升级到1.0版本的问题
- 狗狗生病需要打点滴吗?
- iText制作PDF文件 学习笔记 (五)
- Python探索之路(六)---读取文件
- 【SSH】Struts2学习(二)(待完善)结果视图、访问ServletAPI、数据封装(获取页面参数)、Struts校验
- cmake小知识
- OceanBase由于合并操作导致事务被杀死的情况。
- GraphX SVDPlusPlus Java源码
- 基本数据结构-->堆
- Linux dd 命令
- 第一个QNX程序(Run)
- 开机自启动
- angularjs的聚焦行为