一.Result结果配置

1.全局和局部结果

​   平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里面,针对不同的结果进行跳转时,也有可能跳转同一个页面,那么这个时候就可以配置全局结果页面。

1.1局部结果
  • 在action里面写上的result跳转的页面,称之为局部结果页面配置

    1. <action name="demo01_*" class="com.pri.web.action.ActionDemo01" method="{1}">
    2. <result name="error">/error.jsp</result>
    3. </action>
1.2全局结果
  • 如果有多个action的结果跳转的页面是一样的,那么我们可以提取出来,做成全局结果页面的配置. 全局页面通过package标签中配置global-results标签来定义

    1. <package name="test" extends="struts-default" namespace="/">
    2. <global-results>
    3. <result name="error">/error.jsp</result>
    4. </global-results>
    5. ....
    6. </package>

优先级: 局部>全局

1.3不同包里面的全局结果的配置
  1. <!--把全局的结果抽取到父包里面 -->
  2. <package name="base" extends="struts-default" abstract="true">
  3. <global-results>
  4. <!--全局的结果: 配置在package里面的 特点:可以被当前包里面所有的Action共用; 使用场景:不同的Action需要跳转到相同的结果的时候eg: 错误页面, msg页面等 -->
  5. <result name="error">/msg.jsp</result>
  6. </global-results>
  7. </package>

  8. <package name="test" extends="base" namespace="/">
  9. <action name="demo01_fun01" class="com.pri.web.ActionDemo01" method="fun01">
  10. </action>
  11. <action name="demo02_fun02" class="com.pri.web.ActionDemo02" method="fun02">
  12. </action>
  13. </package> 

2.结果的类型【常用】

​   根据前面学的servlet知识,我们知道服务器响应给浏览器的时候,有三种类型:response响应JSON数据&请求转发 & 重定向。 对于Struts2而言,无非就是Action跳转(转发重定向)到页面,Action跳转到Action....

  文档位置 docs/docs/result-types.html

2.1Action跳转页面
  • 转发(默认)
  1. <result name="success" type="dispatcher">/index.jsp</result> 
  • 重定向

<result name="success" type="redirect">/index.jsp</result>

2.2Action跳转Action
  • 转发

    1. <action name="demo01_*" class="com.pri.web.action.ActionDemo01" method="{1}">
    2. <result name="success" type="chain">demo02_fun02</result>
    3. </action>
    4. <action name="demo02_*" class="com.pri.web.action.ActionDemo02" method="{1}">
    5. </action>
  • 重定向

    1. <action name="demo01_*" class="com.pri.web.action.ActionDemo01" method="{1}">
    2. <result name="success" type="redirectAction">demo02_fun02</result>
    3. </action>
    4. <action name="demo02_*" class="com.pri.web.action.ActionDemo02" method="{1}">
    5. </action>
2.3其它的结果

​      一般来说,我们平常的请求到来,我们要不就是跳转到 页面上 ,要不就是跳转到下一个action 去。 但是除了这两种结果之外,我们仍然还有一些其他结果类型可以控制.

​   比如: 我们可以返回一个文件数据给客户端 (比如文件下载).再比如: 我们可以返回一个json字符串给来请求的页面,而不是重新打开新的页面 (有点像之前的Ajax请求,返回json数据)

2.3.1响应JSON数据【了解】
  • 导入struts-json-plugin-xxx.jar

  • Java代码

    1. public class ActionDemo01 extends ActionSupport {
    2. private User json;
    3.  
    4. public User getJson() {
    5. return json;
    6. }

    7. public String fun01(){
    8. json = new User();
    9. json.setName("张三");
    10. json.setAge(18);
    11. json.setPassword("123456");
    12.  
    13. return "success";
    14. }
    15. }
    • 配置文件

      1. <struts>
      2. <package name="test" extends="json-default" namespace="/">
      3. <action name="demo01" class="com.pri.web.action.ActionDemo01" method="fun01">
      4. <result name="success" type="json">
      5. <param name="root">json</param>
      6.      <!--这里的name必须是root 至于这个json 是我们在action里面的成员 变量 json(属性) -->
      7. </result>
      8. </action>
      9. </package>
      10. </struts>

  注意:

    • ​ root:配置对象。action类中必须提供一个和root值相同的属性名称,且需要提供getter方法。
    • ​ package需要继承json-default
    • ​ result的type值是json
2.3.2响应流(文件下载)【了解】
  • Action里面的代码

    1. public class ActionDemo01 extends ActionSupport {
    2. private InputStream stream;
    3.  
    4. public void setStream(InputStream stream) {
    5. this.stream = stream;
    6. }
    7. public InputStream getStream() {
    8. return stream;
    9. }
    10. public String fun01() throws Exception{
    11. System.out.println("demo01 执行了...");
    12. stream = new FileInputStream("E:/data/Desktop/a.jpg");
    13.  
    14. return "success";
    15. }
    16. }
  • 配置文件

    1. <struts>
    2. <package name="test" extends="struts-default" namespace="/">
    3. <action name="demo01" class="com.pri.web.action.ActionDemo01"
    4. method="fun01">
    5. <result name="success" type="stream">
    6. <param name="contentType">image/jpeg</param>
    7. <param name="inputName">stream</param>
    8. <param name="contentDisposition">attachment;filename="b.jpg"</param>
    9. <param name="bufferSize">1024</param>
    10. </result>
    11. </action>
    12. </package>
    13. </struts>

注意:

  • ​ contentType:下载文件类型
  • ​ contentDisposition:下载到客户端时,客户端文件名称
  • ​ bufferSize:读文件的缓存大小
  • ​ inputName:对应要输出到客户端流声明的名称,也就是说需要和Action里面声明的变量名要一致

二、Struts2中的Servlet的API的访问

​      客户端与服务端交互时,通常会带参数过来,服务器也会回写数据给客户端。在此过程中,参与着请求,和响应,以及会话。servlet在此过程中提供了HttpServletRequest作为获取请求数据的方案,HttpServletResponse作为响应的方案,HttpSession负责了会话方案。Struts其实是基于servlet实现的web框架,他需要遵循规则提供请求,响应和会话的API供开发人员使用,因此Struts针对这一问题提供了自己的一套API封装,提供了多种方式的访问。

1.ActionContext

1.1概述

​    ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameters等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext。

1.2使用
  • 获得(创建)ActionContext

    1. ActionContext context = ActionContext.getContext();
  • 获得请求参数

    1. Map<String, Object> parameters = context.getParamters();

    ​相当于Servlet中的request.getParamters()方法,只能获得所有的请求参数

2.ServletActionContext

2.1概述

​   ServletActionContext继承ActionContext,因此比ActionContext功能要强大。ServletActionContext提供了多个静态方法。

2.2使用
  • 获得Request对象

    1. HttpServletRequest request = ServletActionContext.getRequest();
  • 获得Response对象

    1. HttpServletResponse response = ServletActionContext.getResponse();
  • 获得ServletContext

    1. ServletContext servletContext = ServletActionContext.getServletContext();

3.实现接口的方式

  • 编写Action,让Action使用实现特定的接口的方式访问Servlet的API,有如下接口可以实现

    • ​ ServletContextAware
    • ​ ServletRequestAware
    • ​ ServletResponseAware
    • ​ SessionAware
    • ​ ApplicationAware
  • Eg:

    1. public class ActionDemo03 extends ActionSupport implements ServletRequestAware {
    2. private HttpServletRequest request;
    3. public String fun03() throws IOException{
    4. HttpServletRequest request = ServletActionContext.getRequest();
    5. String username = request.getParameter("username");
    6. String password = request.getParameter("password");
    7. System.out.println(username+":"+password);
    8. return NONE;
    9. }

    10. @Override
    11. public void setServletRequest(HttpServletRequest request) {
    12. this.request = request;
    13. }
    14. }

三、获得请求参数

1.获得零散数据

1.1使用上面介绍的Struts2中的Servlet的API获取
  • ActionContext

    1. //1.创建ActionContext对象
    2. ActionContext context = ActionContext.getContext();
    3. //2.获得所有的请求参数
    4. Map<String, Object> parameters = context.getParamters();
  • ServletActionContext

    1. //1.获得request对象
    2. HttpServletRequest request = ServletActionContext.getRequest();
    3. requet.getParameter(String key);
    4. requet.getParameterValues(String key);
    5. requet.getParameterMap();
1.2属性驱动【常用】
  • 页面

    1. <h1>01使用属性驱动</h1>
    2. <form method="post" action="${pageContext.request.contextPath }/demo01">
    3. 用户名:<input type="text" name="username"/><br/>
    4. 密 码:<input type="password" name="password"/><br/>
    5. <input type="submit"/>
    6. </form>
  • Action.java

    1. public class ActionDemo01 extends ActionSupport {
    2. private String username;//和表单里面的name属性值要一致,并且提供set方法
    3. private String password;//和表单里面的name属性值要一致,并且提供set方法
    4. public void setUsername(String username) {
    5. this.username = username;
    6. }

    7. public void setPassword(String password) {
    8. this.password = password;
    9. }
    10. public String fun01(){
    11. System.out.println(username+":"+password);
    12. return NONE;
    13. }
    14. }

2.获得封装后的数据(对象)

2.1属性驱动
  • 页面

    1. <h1>01使用属性驱动方式</h1>
    2. <form method="post" action="${pageContext.request.contextPath }/demo01">
    3. 用户名:<input type="text" name="user.username"/><br/>
    4. 密 码:<input type="password" name="user.password"/><br/>
    5. <input type="submit"/>
    6. </form>
  • Action.java

    1. public class ActionDemo01 extends ActionSupport {
    2. //1. User类里面的字段属性需要和表单里面的name属性一致, 且提供无参构造
    3. //2. user需要set和get方法
    4. private User user;
    5. public User getUser() {
    6. return user;
    7. }
    8. public void setUser(User user) {
    9. this.user = user;
    10. }

    11. public String fun01(){
    12. System.out.println(user.toString());
    13. return NONE;
    14. }
    15. }
2.2模型驱动【常用】
  • 页面

    1. <h1>02使用模型驱动方式</h1>
    2. <form method="post" action="${pageContext.request.contextPath }/demo02">
    3. 用户名:<input type="text" name="username"/><br/>
    4. 密 码:<input type="password" name="password"/><br/>
    5. <input type="submit"/>
    6. </form>

Action.java

  1. public class ActionDemo02 extends ActionSupport implements ModelDriven<User> {
  2.  
  3. private User user;
  4.  
  5. public String fun02(){
  6. System.out.println(user.toString());
  7. return NONE;
  8. }
  9. @Override
  10. public User getModel() {
  11. if(user == null){
  12. user = new User();
  13. }
  14. return user;
  15. }
  16. }

结论:我们在实际开发里面,

  • ​ 如果要获得单个(零散)的数据,我们通常用属性驱动
  • ​ 如果要获得封装后的数据, 我们通常用模型驱动
2.3封装到集合

​   封装到集合,一般我们会在批量添加 、批量更新场景下见到。也就是说页面上同一个请求,这时候提交过来多份数据,如果我们是批量添加用户的话,可能会提交过来多个用户,那么这个时候,我们就需要把他们封装到List集合或者Map集合中去。 刨去批量操作、我们比较少用这种封装到集合的知识点。

2.3.1封装到list
  • 页面

    1. <h1>01封装到list</h1>
    2. <form method="post" action="${pageContext.request.contextPath }/demo01">
    3. 用户名:<input type="text" name="list[0].username"/><br/>
    4. 密 码:<input type="password" name="list[0].password"/><br/>
    5. 用户名:<input type="text" name="list[1].username"/><br/>
    6. 密 码:<input type="password" name="list[1].password"/><br/>
    7. <input type="submit"/>
    8. </form>
  • Action.java

    1. public class ActionDemo01 extends ActionSupport {
    2.  
    3. private List<User> list;
    4.  
    5. public List<User> getList() {
    6. return list;
    7. }

    8. public void setList(List<User> list) {
    9. this.list = list;
    10. }

    11. public String fun01(){
    12. System.out.println(list.toString());
    13. return NONE;
    14. }
    15. }
2.3.2封装到Map
  • 页面

    1. <h1>02封装到map</h1>
    2. <form method="post" action="${pageContext.request.contextPath }/demo02">
    3. 用户名:<input type="text" name="map['user1'].username"/><br/>
    4. 密 码:<input type="password" name="map['user1'].password"/><br/>
    5. 用户名:<input type="text" name="map['user2'].username"/><br/>
    6. 密 码:<input type="password" name="map['user2'].password"/><br/>
    7. <input type="submit"/>
    8. </form>
  • Action.java

    1. public class ActionDemo02 extends ActionSupport {
    2.  
    3. private Map<String, User> map;
    4. public Map<String, User> getMap() {
    5. return map;
    6. }

    7. public void setMap(Map<String, User> map) {
    8. this.map = map;
    9. }

    10. public String fun02(){
    11. Set<Entry<String, User>> entrySet = map.entrySet();
    12. for (Entry<String, User> entry : entrySet) {
    13. System.out.println(entry.getKey()+":"+entry.getValue().toString());
    14. }
    15. return NONE;
    16. }

Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动的更多相关文章

  1. Struts2学习第2天--Struts2的Servlet的API的访问 Struts2的结果页面的配置 Struts2的数据的封装(包括复杂类型)

    启动后访问jsp 输入姓名密码: 提交后跳转打action 打印: 修改类: 配置同上 结果同上. 实现这俩接口 就得到了 以上代码附上: struts.xml: <?xml version=& ...

  2. Struts2中 Result类型配置详解

    一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...

  3. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

  4. ssh框架-Struts2(二)

    上篇文章我们了解了怎么配置struts.xml文件,以及前端控制器配置怎么配置,,Action进阶,Result结果配置,Struts2中的Servlet的API的访问,以及怎么获得请求参数.今天我们 ...

  5. spring-session之二:简单配置

    官方示例:https://docs.spring.io/spring-session/docs/current/reference/html5/#samples 配置Spring Session 在W ...

  6. 七 Struts2访问Servlet的API方式二:原生方式

    Struts2访问Servlet的API方式二:原生方式 和解耦合的方式不同,原生方式既可以拿到域对象,也可以调用域对象中的方法 前端jsp: <%@ page language="j ...

  7. struts2从浅至深(二)详细配置

    1.加载时机 当应用被服务器加载时,Struts的配置文件就已经加载了 2.加载顺序 default.properties------->struts-default.xml---------& ...

  8. struts2学习笔记(四)——访问Servlet的API&结果跳转&数据封装

    一.Struts2访问Servlet的API 前面已经对Struts2的流程执行完成了,但是如果表单中有参数如何进行接收?又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习Struts ...

  9. (转)Struts2访问Servlet的API及......

    http://blog.csdn.net/yerenyuan_pku/article/details/67315598 Struts2访问Servlet的API 前面已经对Struts2的流程已经执行 ...

随机推荐

  1. Spring Boot Cookbook 中文笔记

    Spring Boot Cookbook 一.Spring Boot 入门 Spring Boot的自动配置.Command-line Runner RESTful by Spring Boot wi ...

  2. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

  3. SQL Full Join 的 Where条件

    SQL需求是损益视图串资产负债视图 用Excel透视表模拟出来的结果就是 用SQL查询如下: 当Where条件是左边的视图的时候 select 损益视图.年 ,损益视图.年月 ,损益视图.期间 ,损益 ...

  4. 基于python的几种排序算法的实现

    #!usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2019/3/28 10:26 # @Author : Yosef-夜雨声烦 # @Email ...

  5. python的copy模块

    python的copy模块 概念 Python中的赋值语句不复制对象,它们在目标和对象之间建立索引,这就是浅复制.对于一些对象或者集合,我们有时需要一个副本,以便可以更改一个副本中的值而不改变其原对象 ...

  6. DGIS之遥感影像数据获取

    1.概要 在GIS圈的同行或多或少接触过遥感,记得在大学老师就说过"数据是GIS的核心".本文介绍在国内下载遥感影像的方法. 地理空间数据云,这个是中科院计算机网络中心建设的一个免 ...

  7. Android的启动模式(下)

    Android中的启动模式(下) 在这篇文章中,我会继续跟大家分享有关于Android中启动模式的相关知识.当然,如果对这个启动模式还不完全了解或者没有听过的话,可以先看看我之前写的有关于这个知识点的 ...

  8. ASP.NET MVC利用ActionLink实现动态组合查询

    一个文件传输数据表,内有日期.传输协议.传输方向(上传或下载).文件名等信息,完整的表内容显示如下: 现在需要分类查询,即按照协议和传输方向查询.单独的分类查询问题并不大,比如,按协议查询,在View ...

  9. python-五个面试题

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  10. Tomcat8-启动脚本分析

    1. Tomcat也是一个java程序 最终的入口启动文件:org.apache.catalina.startup.Bootstrap 最后一条命令: start "Tomcat" ...