一.Result结果配置

1.全局和局部结果

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

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

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

    <package name="test" extends="struts-default" namespace="/">
    <global-results>
    <result name="error">/error.jsp</result>
    </global-results>
    ....
    </package>

优先级: 局部>全局

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

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

2.结果的类型【常用】

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

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

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

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

2.2Action跳转Action
  • 转发

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

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

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

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

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

  • Java代码

  •  public class ActionDemo01 extends ActionSupport {
    private User json; public User getJson() {
    return json;
    }

    public String fun01(){
    json = new User();
    json.setName("张三");
    json.setAge(18);
    json.setPassword("123456"); return "success";
    }
    }
    • 配置文件

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

  注意:

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

  •  public class ActionDemo01 extends ActionSupport {
    private InputStream stream; public void setStream(InputStream stream) {
    this.stream = stream;
    }
    public InputStream getStream() {
    return stream;
    }
    public String fun01() throws Exception{
    System.out.println("demo01 执行了...");
    stream = new FileInputStream("E:/data/Desktop/a.jpg"); return "success";
    }
    }
  • 配置文件

    <struts>
    <package name="test" extends="struts-default" namespace="/">
    <action name="demo01" class="com.pri.web.action.ActionDemo01"
    method="fun01">
    <result name="success" type="stream">
    <param name="contentType">image/jpeg</param>
    <param name="inputName">stream</param>
    <param name="contentDisposition">attachment;filename="b.jpg"</param>
    <param name="bufferSize">1024</param>
    </result>
    </action>
    </package>
    </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

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

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

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

2.ServletActionContext

2.1概述

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

2.2使用
  • 获得Request对象

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

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

    ServletContext servletContext = ServletActionContext.getServletContext();

3.实现接口的方式

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

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

  •  public class ActionDemo03 extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    public String fun03() throws IOException{
    HttpServletRequest request = ServletActionContext.getRequest();
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println(username+":"+password);
    return NONE;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
    this.request = request;
    }
    }

三、获得请求参数

1.获得零散数据

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

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

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

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

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

    public void setPassword(String password) {
    this.password = password;
    }
    public String fun01(){
    System.out.println(username+":"+password);
    return NONE;
    }
    }

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

2.1属性驱动
  • 页面

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

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

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

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

Action.java

 public class ActionDemo02 extends ActionSupport implements ModelDriven<User> {

     private User user;

     public String fun02(){
System.out.println(user.toString());
return NONE;
}
@Override
public User getModel() {
if(user == null){
user = new User();
}
return user;
}
}

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

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

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

2.3.1封装到list
  • 页面

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

    public class ActionDemo01 extends ActionSupport {
    
        private List<User> list;
    
        public List<User> getList() {
    return list;
    }

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

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

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

  • public class ActionDemo02 extends ActionSupport {
    
        private Map<String, User> map;
    public Map<String, User> getMap() {
    return map;
    }

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

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

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. 用flask实现一个用户登录的功能

    #!/usr/bin/python #coding=utf-8 from flask import Flask,session,redirect,url_for,request app=Flask(_ ...

  2. oracle创建表空间、用户、权限

    原链接:https://www.cnblogs.com/wxm-bk/p/6510654.html oracle 创建临时表空间/表空间,用户及授权   1:创建临时表空间 create tempor ...

  3. delphi 10.2 ----memo 的例子 实现基本记事本功能

    unit Unit2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  4. 隔离python 运行环境和Pycharm 设置代码同步

    隔离python 运行环境 查看当前有哪些虚拟环境:workon 进入虚拟环境:workon django 退出虚拟环境:deactivate 创建虚拟环境: mkvirtualenv -p /usr ...

  5. 对drf视图的理解

    视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...

  6. 【转载】MSDN-MDX#001 - 多维表达式 (MDX) 参考

    摘录于MSDN MDX 的一些重要概念 1. MDX 介绍 多维表达式 (MDX) 是用于在 Microsoft SQL Server Analysis Services (SSAS) 中处理和检索多 ...

  7. vue环境搭建简介

    简单整理下vue的安装的新建项目 安装node.js和npm 参考其他教程 安装vue npm install vue 安装脚手架 vue-cli npm install --global vue-c ...

  8. Log中关于zVideoApp与zChatApp之间的消息传递可以搜索以下字符串

    [CSSBConfIPCAgent::OnMessageReceived]  (这是zVideoApp端的) 和 [CSSBPTIPCListener::OnMessageReceived]      ...

  9. Jenkins 源代码编译

    最近一直想写一个关于 Jenkins 管理的 InelliJ 插件,但是尝试很多次总是在登录认证上面失败,各种办法都不起作用,而且官方的文档含糊不清,就动起了从源代码编译在开发环境中进行调试. 废话少 ...

  10. Mac下像Windows那样带有预览图的快速切换-HyperSwitch

    这东西是免费的,他家还出了一个HyperDock的收费软件. 下载:https://bahoom.com/hyperswitch/get 离线版本:(链接: https://pan.baidu.com ...