SpringMVC响应

第一章:数据处理及跳转

1. 结果跳转方式

①.ModelAndView

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .

<!--配置视图解析器-->
<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine" ref="templateEngine"/>
</bean>
<!-- templateEngine -->
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver"/>
</bean>
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><!--       页面返回导那个文件夹(html的文件夹)--><property name="prefix" value="/html/" /><!--        访问页面的后缀,如访问suc,视图解析器就会为他加上.html的后缀,匹配上地址,变成/html/suc.html--><property name="suffix" value=".html" /><property name="templateMode" value="HTML5"/>
</bean>

对应的controller类

/*** 返回ModelAndView对象的方式* @return*/
@RequestMapping("/save3")
public ModelAndView save3(){System.out.println("执行了...");// 创建mv对象ModelAndView mv = new ModelAndView();// 把一些数据,存储到mv对象中mv.addObject("msg","用户名或者密码已经存在");// 设置逻辑视图的名称mv.setViewName("suc");return mv;
}

②.ServletAPI

通过设置ServletAPI , 不需要视图解析器 .(需要导入servlet相关依赖包)

  • 1、通过HttpServletResponse进行输出
  • 2、通过HttpServletResponse实现重定向
  • 3、通过HttpServletResponse实现请求转发
@RequestMapping("/myServlet")
public void myServlet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setCharacterEncoding("utf-8");//数据返回形式 //返回字符集response.setContentType("text/json;charset=utf-8");String json = "{\"code\":\"200\",\"message\":\"成功\"}";response.getWriter().append(json);
}

请求转发

  • 请求转发是request对象的方法,是同一个请求内,共享该请求的资源
  • 请求地址不改变是,服务器端的行为
  • 通过setAttribute进行数据传递(set向request写入key-vale的数据),可以通过getAttribute(通过key获取)
  • 请求转发可以转发到页面或者servlet
@RequestMapping("/test1")
public void test1(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {response.setCharacterEncoding("utf-8");//数据返回形式 //返回字符集response.setContentType("text/json;charset=utf-8");request.setAttribute("msg","请求转发");System.out.println("test1 value="+request.getParameter("name"));//请求转发//request.getRequestDispatcher("/dept/test2").forward(request,response);//转发到页面request.getRequestDispatcher("/html/suc.html").forward(request,response);
}
@RequestMapping("/test2")
public void test2(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("test2 value="+request.getParameter("name"));Object msg = request.getAttribute("msg");System.out.println(msg);
}

重定向

  • 重定向是response对象的方法,是不同一个请求内

  • 由服务器端指导,是客户端的行为

  • 请求地址会改变,不共享数据

  • 重定向可以解决跨域的问题

    **跨域:**我们当前的访问地址不是当前项目的地址,如重定向到百度

@RequestMapping("/test3")
public void test3(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("test2 value="+request.getParameter("name"));response.sendRedirect("/SpringMVCDemo/dept/test4");//response.sendRedirect("/SpringMVCDemo/html/suc.html");
}
@RequestMapping("/test4")
public void test4(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("test2 value="+request.getParameter("name"));
}

③.SpringMVC

通过SpringMVC来实现转发和重定向 ——无需视图解析器;

测试前,需要将视图解析器注释掉

//MVC不使用视图解析器(不配置视图解析器)
//MVC正常返回页面
@RequestMapping("/test5")
public String test5(){return "html/suc.html";
}
//MVC的请求转发
@RequestMapping("/test6")
public String test6(){System.out.println("我是test6");return "forward:/html/suc.html";
}
//MVC的重定向
@RequestMapping("/test7")
public String test7(){System.out.println("我是test7");return "redirect:/html/suc.html";
}

2.ResponseBody响应json数据

json和JavaBean对象互相转换的过程中,需要使用jackson的jar包

<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-core</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version>
</dependency>

DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置

标签配置不过滤

    1. location元素表示webapp目录下的包下的所有文件
    1. mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
<!--设置静态资源不过滤-->
<mvc:resources mapping="/css/**" location="/css/"/> <!--样式-->
<mvc:resources mapping="/images/**" location="/images/"/> <!--图片-->
<mvc:resources mapping="/js/**" location="/js/"/> <!--javascript-->

html代码

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script></head>
<body>
<h3>异步的数据交互</h3>
用户名:<input type="text" value="name" id="name"></br>
年龄:<input type="text" value="password" id="password">
<input type="button" value="提交" onclick="get()"/>
</body>
<script>// 单击事件function get(){var name = $("#name").val();var password = $("#password").val();// 发送ajax的请求$.ajax({type: "post",url: "/SpringMVCDemo/dept/test10",data:{name:name,password:password},success:function(data){// 编写很多代码console.log(data);alert(data.name +"  "+data.password);}});};
</script>
</html>

controller

//要想返回User对象类型的json数据,我们需要用json和javaBean对象之间做一个相互的转换,需要导包@RequestMapping("/test9")@ResponseBodypublic User test9(){User user =new User();user.setusername("admin");user.setpassword("123445");return user;}//ajax 数据接收和传递@RequestMapping("/test10")@ResponseBodypublic Data test10(Data date){System.out.println(date.toString());return date;}

在springMVC当中如果要实现页面跳转就不要使用ajax,如果要json数据的返回就用ajax

第二章:SpringMVC实现文件上传

导入文件上传的jar包

<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>

在Springmvc.xml配置文件上传解析器

<!--配置文件上传的解析器组件。id的名称是固定,不能乱写--><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置上传文件的总大小 8M = 8 * 1024 * 1024 --><property name="maxUploadSize" value="8388608" /></bean>

编写文件上传的html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>文件上传</h3><form id="addForm"  action="/SpringMVCDemo/file/upload" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="file" width="120px"><input type="submit" value="上传">
</form><div id="upMenu" class="white_content"><form id="downForm"   lay-filter="updata" action="/SpringMVCDemo/file/down" method="get"><input type="text" id="filename" name="filename"><input type="submit" value="下载"></form><input type="button" value="完成"/>
</div></body>
</html>

controller层

package com.qcby.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;@Controller
@RequestMapping("/file")
public class FileController {@RequestMapping("/tofile")public String tofile(){//跳转到html下的file.html页面(图形解析器)return "file";}/*** 文件上传功能,以输入流的形式,相当于把上传的文件复制一份(是二进制输入流),如何把该文件放在指定的路径下即可* @param file* @return* @throws IOException*/@RequestMapping(value="/upload",method= RequestMethod.POST)@ResponseBodypublic  String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {// uploads文件夹位置String rootPath = request.getSession().getServletContext().getRealPath("WEB-INF/upload");// 原始名称String originalFileName = file.getOriginalFilename();// 新文件File newFile = new File(rootPath + File.separator  + File.separator + originalFileName);// 判断目标文件所在目录是否存在if( !newFile.getParentFile().exists()) {// 如果目标文件所在的目录不存在,则创建父目录newFile.getParentFile().mkdirs();}System.out.println(newFile);// 将内存中的数据写入磁盘file.transferTo(newFile);return  "{\"data\":\"success\"}";}/*** 文件下载功能* @param request* @param response* @throws Exception*/@RequestMapping("/down")public void down(HttpServletRequest request, HttpServletResponse response) throws Exception{String filename = request.getParameter("filename");System.out.println(filename);//模拟文件,myfile.txt为需要下载的文件String fileName = request.getSession().getServletContext().getRealPath("WEB-INF/upload")+"/"+filename;//获取输入流InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));//假如以中文名下载的话// String filename = "下载文件.txt";//转码,免得文件名中文乱码filename = URLEncoder.encode(filename,"UTF-8");//设置文件下载头response.addHeader("Content-Disposition", "attachment;filename=" + filename);//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型response.setContentType("multipart/form-data");BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());int len = 0;while((len = bis.read()) != -1){out.write(len);out.flush();}out.close();}
}

第三章:SpringMVC的异常处理

1. 异常处理思路

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

2. SpringMVC的异常处理

①:使用自己处理异常

controller代码

/*** 自己处理异常* @return*/
@RequestMapping("/findAll")
public String findAll(Model model){try {System.out.println("执行了...");// 模拟异常int a = 10/0;}catch (Exception e){model.addAttribute("errorMsg","系统正在维护,请联系管理员");return "404";}return "suc";
}

404页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>错误提示页面</title>
</head>
<body>
<h1>404  <b th:text="${errorMsg}"></b></h1>
</body>
</html>

②:使用处理器处理异常

controller代码

/*** 使用异常处理器方式//异常:dao层如果不处理异常,就会交给service层,service层不处理就会交给controller层,最后都不处理就交给控制器dispatcherServlet//而控制器没有能力对异常处理,就会在页面显示报错信息//我们可以使用try-catch解决异常,但是这个方式会随异常数量的增多而显得复杂。所以我们需要学习MVC的全局异常处理器* @return*/
@RequestMapping("/findAll2")
public String findAll2(){System.out.println("执行了...");//模拟异常int a = 10 / 0;return "suc";
}

自定义异常类

public class SysException extends Exception{// 提示消息private String message;public SysException(String message){this.message = message;}@Overridepublic String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "SysException{" +"message='" + message + '\'' +'}';}
}

自定义异常处理器

/*** 异常处理器*/
public class SysExceptionResolver implements HandlerExceptionResolver {/*** 程序出现了异常,调用异常处理器中的方法* @param httpServletRequest* @param httpServletResponse* @param o* @param e e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e* @return*/public ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o, Exception e) {e.printStackTrace(); //在命令行打印异常信息在程序中出错的位置及原因。// 做强转SysException exception = null;// 判断if(e instanceof SysException){exception = (SysException)e;}else{exception = new SysException("系统正在维护,请联系管理员");}// 存入异常提示信息ModelAndView mv = new ModelAndView();mv.addObject("errorMsg",exception.getMessage());// 设置跳转的页面mv.setViewName("404");return mv;}}

配置异常处理器

<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.qcby.conf.SysExceptionResolver" />

SpringMVC(三)——响应相关推荐

  1. 03 SpringMVC 处理响应

    目录 一.SpringMVC处理响应_配置视图解析器 二.SpringMVC处理响应_控制器方法的返回值 1.控制器方法的返回值为void 2.控制器方法的返回值为String 3.返回值为Model ...

  2. 如何通过SpringMVC框架响应JSON数据

    1. 通过SpringMVC框架响应JSON数据 在SpringMVC框架(含SpringBoot框架)中,当处理请求的方法之前添加了@ResponseBody后,或在控制器类之前使用的是@RestC ...

  3. SpringMVC自定义响应的HTTP状态码

    SpringMVC自定义响应的HTTP状态码有两种方法,一种是在返回方法上面加上@ResponseStatus注解,另一个种是在方法内部使用response.setStatus()方法. 注解方式: ...

  4. springmvc(三) 参数绑定、

    前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...

  5. SpringMVC的响应JSON数据和过滤静态资源

    1.过滤静态资源 @ResponseBody注解作用 作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端. 当方法上面没有写ResponseBody,底层会 ...

  6. SpringMVC的响应数据和结果视图

    响应数据之返回值是String类型 方法执行完,需要跳转到指定的页面,最终给用户一个响应.springmvc提供了很多种响应的方式. controller 方法返回字符串可以指定逻辑视图名,通过视图解 ...

  7. springmvc之响应类型,string,void,ModelAndView

    目录 响应之返回值是String类型 响应之返回值是void类型 响应之返回值是ModelAndView类型 响应之返回值是String类型 springmvc.xml需要先配置好视图解析器的jsp文 ...

  8. Java控制器controller_详解springMVC—三种控制器controller

    在springmvc中提供了三种controller的配置,1.针对不需要controller代码的,也就是只起到跳转页面的作用.2.可以接受实体类型的controller.3.可以接受表单数据的co ...

  9. SpringMVC(三):使用 POJO 对象绑定请求参数值

    2019独角兽企业重金招聘Python工程师标准>>> Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值.支持级联属性.如:dept.de ...

最新文章

  1. AntD02 Table组件的使用
  2. Swoole报错Failed to execute ‘send’ on ‘WebSocket’: Still in CONNECTING state. a
  3. Cache的一些总结
  4. asterisk extconfig.conf文件解析
  5. Python多线程--UDP聊天器
  6. 俞敏洪最新干货演讲:在动荡的时代做不动荡的自己
  7. Qt6 在线安装图文步骤
  8. 软件测试相关的63个国外站点
  9. 使用mprotect系统调用来调试内存问题:memalign,aligned_alloc
  10. 去掉iPhone、iPad的默认按钮样式
  11. 万稞pw80线切割编程软件_数控编程软件(CAM)大盘点,你选用的哪种?
  12. STM32F407控制舵机
  13. Oracle 19c 新特性一览
  14. concat,ucase/lcase,left/right,length,replace
  15. Java数字转中文大写,数字转英文
  16. 如何避免背光源正负极做错?
  17. 多目标优化系列(一)NSGA-Ⅱ
  18. 他,是碾压爱迪生的科技天才!尼古拉特斯拉的一生竟是这样...
  19. 数据分析--DataFrame(4)
  20. 关于回波损耗 和 驻波比的摘要 Return Loss and VSWR

热门文章

  1. 【Python】random.randint()用法
  2. 学前端到底哪个培训机构好?
  3. Hi,运维,你懂Java吗-No.2:JDK介绍及安装
  4. 【基础编程】猜数字游戏的提示
  5. [整理]程序员一生必读的30本书
  6. 数据库的基本常用命令
  7. base64转成文件
  8. 虚拟机网络连接方式 主机连接WLAN(wifi)时
  9. springboot集成阿里云短信验证码
  10. 单片机光敏电阻c语言程序怎么写,求助 关于光敏电阻模块的单片机程序