SpringMvc的请求和响应

news2024/11/26 7:34:29

SpringMvc的数据响应

1.springmvc的数据相应方式

        (1)页面跳转

                直接返回字符串

                通过ModelAndView对象返回

        (2)回写数据

                直接返回字符串

                返回对象或集合

页面跳转

jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>success${username}</h1>
</body>
</html>

1.返回字符串形式        

        最出始的写法

 @RequestMapping("/quick")
    public String save(){
        System.out.println("Controller running ...");
        return "/jsp/success.jsp";
    }

 由于比较繁琐每次都要加上/jsp/  .jsp,于是直接返回字符串:此种方式将返回字符串与试图解析器的前后缀拼接后跳转

在springmvc.xml配置

<!--配置内部资源解释器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
  @RequestMapping("/quick")
    public String save(){
        System.out.println("Controller running ...");
        return "success";
    }

2.返回ModelAndView对象

自己手动创建ModelAndView对象,并且设置相应的值

@RequestMapping("/quick2")
    public ModelAndView save2(){
        /*
        * model:模型 作用封装数据
        * view:视图 作用展示数据
        * */
        ModelAndView modelAndView = new ModelAndView();
        //设置模型数据
        modelAndView.addObject("username","wukd");
        //设置试图名称
        modelAndView.setViewName("success");
        return modelAndView;
    }

通过框架调用该方法时,传参时传ModelAndView对象

 @RequestMapping("/quick3")
    public ModelAndView save3(ModelAndView modelAndView){

        //设置模型数据
        modelAndView.addObject("username","wukd2");
        //设置试图名称
        modelAndView.setViewName("success");

        return modelAndView;

    }

 单独传入model对象

 @RequestMapping("/quick4")
    public String save4(Model model){
        model.addAttribute("username","你好!");
        return "success";
    }

3.向request域中存入对象

(1)通过springmvc框架注入的request对象setAttribute()方法设置

 @RequestMapping("/quick5")
    public String save(HttpServletRequest request){
        //将数据存储到request域中
        request.setAttribute("username","lisi");
        return "success";
    }

(2)通过ModelAndView的addObject()方法设置

  @RequestMapping(value = "/quick5")
    public ModelAndView save5(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username","klc");
        modelAndView.setViewName("success");
        return modelAndView;
    }

回写数据

1.直接返回字符串

(1)通过springmvc框架注入的response.getWriter().print()回写数据,此时不需要试图跳转,业务方法返回值为void

 @RequestMapping("/quick6")
    public void save6(HttpServletResponse response) throws IOException {
       response.getWriter().print("kl");
    }

(2)将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMvc框架,方法返回的字符串不是跳转是直接在http响应体中返回

 @ResponseBody//告知Springmvc框架该方法不进行页面视图跳转直接进行页面数据响应(以Http响应体)
    @RequestMapping(value = "/quick7")
    public String save7(HttpServletResponse response) throws IOException {
        return "hellonk";
    }

(3)在异步项目中,客户端与服务器端往往要进行json格式字符串交互,此时可以动手拼接json字符串返回

@ResponseBody()//告知Springmvc框架该方法不进行页面视图跳转直接进行页面数据响应(以Http响应体)
    @RequestMapping(value = "/quick8")
    public String save8(HttpServletResponse response) throws IOException {
        return "{\"username\":\"lisi\",\"age\":18}";
    }

上述方式手动拼接json格式字符串很麻烦,可以使用jackson进行转换,导入jackson坐标

 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
 @ResponseBody()//告知Springmvc框架该方法不进行页面视图跳转直接进行页面数据响应(以Http响应体)
    @RequestMapping(value = "/quick9")
    public String save9(HttpServletResponse response) throws IOException {
        User user=new User();
        user.setAge(12);
        user.setUsername("fhds");
        //使用json的转换工具将对象转换为json的数据格式
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(user);
        return s;
    }

(4)通过springmvc帮助去我们对对象或集合进行json字符串的转换并回写,为处理器配置消息转换参数,指定使用jackson进行对象或集合的转换,在spring-mvc中进行如下配置:

<!--配置处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            </list>
        </property>

    </bean>
 @ResponseBody()//告知Springmvc框架该方法不进行页面视图跳转直接进行页面数据响应(以Http响应体)
    @RequestMapping(value = "/quick10")
    //期望springmvc自动将User转换成json格式
    public User save10(HttpServletResponse response) throws IOException {
        User user=new User();
        user.setAge(13);
        user.setUsername("fhds");
        return user;
    }

在方法上添加@ResponseBody就可返回json格式的字符串,但比较繁琐

可以用mvc的注解驱动代替

 <!--mvc的注解驱动 可以将对象转换为json格式-->
    <mvc:annotation-driven conversion-service="conversionService"/>

在SpringMvc的各个组件中,处理器映射器、处理器适配器、试图解析器称为SpringMvc的三大组件 使用<mvc:annotation-driven>自动加载 RequestMappingHandlerMapping(处理映射器)和 RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用 <mvc:annotation-driven>替代注解处理器和适配器的配置。 同时使用<mvc:annotation-driven>默认底层就会集成jackson进行对象或集合的json格式字符串的转换。

springmvc请求数据

1.获得请求参数

服务器端获得请求参数,有时还需要进行数据的封装,springmvc可以接收如下类型的参数:

基本类型

pojo类型参数

数组类型参数

集合类型参数

2.获得基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配

@ResponseBody()
    @RequestMapping(value = "/quick11")
    public void save11(String username,int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

 

 

 3.获得POJO类型参数

controller中的业务方法的POJO参数的属性名与请求参数的name一致参数值会自动映射匹配

@ResponseBody()
    @RequestMapping(value = "/quick12")
    public void save12(User user) throws IOException {
        System.out.println(user);
    }

 

 4.获得数组类型的参数

@ResponseBody()
    @RequestMapping(value = "/quick13")
    public void save13(String []strs) throws IOException {
        //将数组转为集合
        System.out.println(Arrays.asList(strs));
    }

 

 5.获得集合类型的参数

获得集合类型的参数,要将集合参数封装到POJO中才可以

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/2/10
  Time: 13:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/userController/quick14" method="post">
        <%--表明是第几个user对象的usernamr age--%>
        <input type="text" placeholder="姓名" name="userList[0].username"><br/>
            <input type="text" placeholder="年龄" name="userList[0].age"><br/>
        <input type="submit" title="提交"/>
    </form>
</body>
</html>
package com.lin.domain;

import java.util.List;

public class Vo {
    private List<User>userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "vo{" +
                "userList=" + userList +
                '}';
    }
}
 @ResponseBody()
    @RequestMapping(value = "/quick14")
    public void save14(Vo vo) throws IOException {
        System.out.println(vo);
    }

当使用ajax提交时,可以指定contextType为json形式,那么在方法参数位置使用

@ResponseBody可以直接接收集合数据而无需使用POJO进行包装

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/2/11
  Time: 12:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
    <%--导入jquery--%>
    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
    <script>
        var userList=new Array();
        userList.push({username:"张三",age:15});
        userList.push({username:"lisi",age:15});
        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/userController/quick15",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });
    </script>
</head>
<body>

</body>
</html>

注意:如果浏览器抓包工具发现,没有加载jquery文件,原因时springmvc的前端控制器DispatcherServlet的url-pattern配置的时/,代表所有的资源都进行过滤操作我们可以通过以下两种方式放行静态资源

        1.在spring-mvc.xml配置问件中指定的放行资源

        <!--开放资源的访问权限-->
            <!--mapping 映射地址-->
            <!--location 那个目录下的资源对外开放-->
        <!--<mvc:resources mapping="/js/**" location="/js/"/>-->

        2.使用标签

        <!--springmvc如果帮你找不到资源就交给原始的的容器Tomcat-->
        <mvc:default-servlet-handler/>

6.当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码过滤

<!--配置全局过滤的filter 解决乱码-->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

7.参数绑定注解@requestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示绑定

 @ResponseBody()
    @RequestMapping(value = "/quick16")
    /*
    * @RequestParam参数
    * value:与请求参数名称
    * required:在此指定的请求参数是否必须包括,默认值是true,提交时如果没有此参数报错
    * defaultValue:当没有前指定请求参数时,则使用指定的默认参数值
    * */
    public void save16(@RequestParam("name") String username) throws IOException {
        System.out.println(username);
    }

8.

Restful 是一种软件 架构风格 设计风格 ,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务 器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
GET:用于获取资源
  POST:用于新建资源
  PUT:用于更新资源
  DELETE:用于删除资源
  @ResponseBody()
    @RequestMapping(value = "/quick17/{username}")
    public void save17(@PathVariable("username") String username) throws IOException {
        System.out.println(username);
    }

9.自定义类型转换器

自定义类型转换器的开发步骤:

        1.定义转换器实现Converter接口

package com.lin.converter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DataConvert implements Converter<String,Date> {

    @Override
    public Date convert(String dateStr) {
        //将日期的字符串转换成日期对象
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
        Date date=null;
        try {
           date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

        2.在配置文件中声明转换器

 <!--声明转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.lin.converter.DataConvert"/>
            </list>
        </property>
    </bean>

        3.在<annotation-driver>中引用转换器

        <mvc:annotation-driven conversion-service="conversionService"/>

10.文件上传

       (1)文件上传客户端的三要素

                表单项type="file"

                表单的提交方式post

                表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”

        (2)单文件上传的步骤

                导入fileupload和io坐标

                

 <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
  </dependencies>

        配置文件上传解析器

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="6000000"></property>
    </bean>

        编写文件上传代码

@ResponseBody()
    @RequestMapping(value = "/quick23")
    public void save23(String username, MultipartFile upload1,MultipartFile upload2) throws IOException {
        System.out.println(username);
        //获得上传文件名称

        String originalFilename1= upload1.getOriginalFilename();
        upload1.transferTo(new File("C:\\upload\\",originalFilename1));
        String originalFilename2= upload2.getOriginalFilename();
        upload1.transferTo(new File("C:\\upload\\",originalFilename2));
    }
多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可
<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/2/12
  Time: 11:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/userController/quick22" method="post" enctype="multipart/form-data">
        名称<input type="text" name="username"><br/>
        文件1<input type="file" name="upload"><br/>
        文件2<input type="file" name="upload"><br/>
        <input type="submit" value="提交">
    </form>
        <%--enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值。

        application/x-www-form-urlencoded:默认的编码方式。但在用文本的传输和MP3等大型文件的时候,使用这种编码就显得效率低下。
        multipart/form-data:指定传输数据为二进制类型,比如图片,mp3,文件
        text/plain:纯文本的传输。空格转换为"+"号,但不对特殊字符编码。--%>
    <%--<form action="${pageContext.request.contextPath}/userController/quick22" method="post" enctype="multipart/form-data">
        名称<input type="text" name="username"><br/>
        文件1<input type="file" name="upload1"><br/>
        文件2<input type="file" name="upload2"><br/>
        <input type="submit" value="提交">
    </form>--%>
</body>
</html>

多文件上传方式的实现

@ResponseBody()
    @RequestMapping(value = "/quick22")
    public void save22(String username, MultipartFile[] upload) throws IOException {
        System.out.println(username);
        //获得上传文件名称
       for (MultipartFile multipartFile:upload){
           String originalFilename = multipartFile.getOriginalFilename();
           multipartFile.transferTo(new File("C:\\upload\\",originalFilename));
       }

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT的出现,为我们展现出来的是智能社会来临的美好图景

ChatGPT&#xff0c;的确是当下最炙手可热的一个话题。然而&#xff0c;人们对于ChatGPT的认识&#xff0c;依然还是仅仅停留在ChatGPT本身&#xff0c;而没有将它与它的「前任」——元宇宙、web3.0&#xff0c;乃至NFT联系在一起。如果在看待ChatGPT的时候&#xff0c;将它放置…

KDJ日周月金叉共振指标

昨天介绍了MACD多周期共振指标公式&#xff0c;KDJ通过类似的写法&#xff0c;也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移&#xff0c;接近周末月末的信…

如何用Redis实现延迟队列

背景前段时间有个小项目需要使用延迟任务&#xff0c;谈到延迟任务&#xff0c;我脑子第一时间一闪而过的就是使用消息队列来做&#xff0c;比如RabbitMQ的死信队列又或者RocketMQ的延迟队列&#xff0c;但是奈何这是一个小项目&#xff0c;并没有引入MQ&#xff0c;我也不太想…

企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean

文章目录一、Spring容器演示——采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Maven项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;采用传统方式让勇…

IDEA设置方法注释模板

IDEA设置方法注释模板 类注释模板方法注释模板 效果步骤 补充 类注释模板 类注释模板是IDEA创建类时生成的注释&#xff0c;之前发文章跟大家分享过了&#xff0c;而且这也不是本篇文章的重点&#xff0c;文章的链接附在下面&#xff0c;需要的朋友可以去看看。 Intellij ID…

从码农到开发攻城狮,我经历了什么?

对于很多想从事或者刚进入开发岗位的伙伴们来说&#xff0c;对于开发这个职位的了解并不多&#xff0c;甚至已经有些迷茫&#xff0c;感觉总有敲不完的代码和无尽的加班赶项目&#xff0c;一眼望不到头。今天就借用朋友的故事讲述一个普普通通的开发蜕变之路&#xff0c;可能会…

mybatis-plus 源码解析

序 没错&#xff0c;又是需求导致我 需要研究下 mybatis-plus了。。。。 本来我想直接网上百度出来一篇&#xff0c;看看得了&#xff0c;就不自己从头研究了 我都看了一遍&#xff0c;但是很可惜 &#xff0c;没一个能用的。。。。 有一个掘金的写的&#xff0c;我看了下他…

备战蓝桥杯【一维前缀和】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

如何使用Arduino IDE编程ATTINY13/ATTINY13A单片机

尽管ATtiny系列被认为是非常便宜和有用的&#xff0c;但是仍然缺少有关它的项目和教程。在本篇文章中&#xff0c;您将学习如何使用通过Arduino IDE编程的ATtiny13微控制器开始构建应用程序。 首先&#xff0c;ATtiny13是基于AVR增强RISC架构的低功耗CMOS 8位微控制器。通过在一…

Seata-Server分布式事务原理加源码 (四)- Seata事务日志储存方式DB

Seata Server&#xff08;TC&#xff09;环境搭建详解 Server端存储模式&#xff08;store.mode&#xff09;支持三种&#xff1a; file&#xff1a;单机模式&#xff0c;全局事务会话信息内存中读写并持久化本地文件root.data&#xff0c;性能较高&#xff08;默认&#xff…

【Redis】Redis持久化之RDB详解(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…

【Unity VR开发】结合VRTK4.0:创建一个门

语录&#xff1a; 独有英雄驱虎豹&#xff0c;更无豪杰怕熊罴 前言&#xff1a; 在我们做项目时&#xff0c;会遇到需要打开门&#xff0c;或者柜子的门&#xff0c;今天&#xff0c;我们就来学习一下关于门的控件。以模拟可以打开和关闭的门。我们将使用角度驱动器来创建此门…

大火的ChatGPT能为自动驾驶带来什么?

/导读/最近的科技圈&#xff0c;大家都被微软推出的ChatGPT刷屏&#xff0c;作为工智能公司OpenAI于2022年11月推出的聊天机器人&#xff0c;其能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;甚至能完成撰写邮件、视频脚本、文案…

MySql8.0 安全卸载

1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数据存放目录是在 C:\ProgramData\MySQL&#…

跳转语句与数组,函数

1.break语句作用: 用于跳出选择结构或者循环结构break使用的时机:出现在switch条件语句中,作用是终止case并跳出switch出现在循环语句中,作用是跳出当前的循环语句出现在嵌套循环中&#xff0c;跳出最近的内层循环语句2.continue语句作用 : 在循环语句中&#xff0c;跳过本次循…

vue项目第四天

使用elementui tabplane组件实现历史访问记录组件的二次封装<el-tabs type"border-card"><el-tab-pane label"用户管理">用户管理</el-tab-pane><el-tab-pane label"配置管理">配置管理</el-tab-pane><el-tab-…

如何量测太阳光模拟器的光谱致合度?

太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸&#xff0c;光斑强度的输出功率范围可以从0.1到1太阳光强度。此外&#xff0c;还提供了灵活的出光方向&#xff0c;以满足用户的研究需求&a…

JavaWeb_JSP

目录 一、概述 二、入门 1.创建一个maven的web项目 2.搭建环境 3.创建jsp页面 4.编写代码 5.测试 三、JSP原理 四、JSP脚本 五、JSP缺点 六、EL表达式 1.概述 2.代码演示 3.域对象 七、JSTL标签 1.概述 2.if标签 3.forEach标签 八、MVC模式和三层架构 1.MVC…

Linux驱动学习环境搭建

背景常识 一、程序分类 程序按其运行环境分为&#xff1a; 1. 裸机程序&#xff1a;直接运行在对应硬件上的程序 2. 应用程序&#xff1a;只能运行在对应操作系统上的程序 二、计算机系统的层次结构 所有智能设备其实都是计算机&#xff0c;机顶盒、路由器、冰箱、洗衣机、汽…

线程安全的集合类

1.多线程环境使用 ArrayList 1.自己使用同步机制 (synchronized 或者 ReentrantLock) 2.Collections.synchronizedList(new ArrayList); synchronizedList 是标准库提供的一个基于 synchronized 进行线程同步的 List.synchronizedList 的关键操作上都带有 synchronized 3…