ToB企服应用市场:ToB评测及商务社交产业平台

标题: SpringMVC [打印本页]

作者: 何小豆儿在此    时间: 2023-7-12 16:37
标题: SpringMVC
SpringMVC

Spring集成web环境

集成步骤

ApplicationContext应用上下文的获取方式

之前每次我们都是通过new的方式创建的应用上下文,这样的弊端是在大项目中配置文件会加载多次,应用上下文被创建多次,繁琐且不节省资源
所以我们运用监听器来只创建一次,所有的用这一个容器,所以:

创建一个实现ServletContext监听器的类:
  1. public class ContextLoader implements ServletContextListener {
  2.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@Override
  3.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public void contextInitialized(ServletContextEvent sce) {
  4.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  5.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>//将这个应用上下文对象存储在servletContext域中
  6.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>ServletContext servletContext = sce.getServletContext();
  7.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>servletContext.setAttribute("app",app);
  8.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
  9.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@Override
  10.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public void contextDestroyed(ServletContextEvent sce) {
  11.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
  12. }
复制代码
web层中:
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>ServletContext servletContext = req.getServletContext();
  3.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
  4.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>UserService userService= app.getBean(UserService.class);
  5.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>userService.save();
  6.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
复制代码
web.xml:
  1. <listener>
  2.   <listener-class>com.myspring.listener.ContextLoader</listener-class>
  3. </listener>
  4.   <context-param>
  5.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/><param-name>contextConfigLocation</param-name>
  6.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/><param-value>classpath:applicationContext.xml</param-value>
  7.   </context-param>
复制代码
Spring提供的获得应用上下文的工具

没错,上面又白写了。。。
上面的不用手动实现。Spring提供了一个监听器ContextLoaderListener就是对该功能的封装
我们只需要做两件事:
SpringMVC简介

SpringMVC开发步骤

流程:

SpringMVC的组件解析

SpringMVC内部执行流程



SpringMVC注解解析

@RequestMapping(""):地址映射
常用参数:value:就是路径
​                                method:可以指定请求方式。值为枚举方式在RequestMethod
​                                params:指定请求参数条件,例如:

  1. @Controller@RequestMapping("/user")public class UserController {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>//当地址为localhost:8080/user/quick时访问该方法    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@RequestMapping("/quick")    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public  String save(){    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>System.out.println("Controller save running");//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>要跳转的视图:localhost:8080/user/success.jsp,当前的前一级目录下的该资源(/success.jsp.就代表当前web应用下,即webapp目录下)    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>return "success.jsp";    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}}
复制代码
SpringMVC配置解析

在上面的代码中,最后我们renturn了jsp页面
  1. return "success.jsp";
  2. //实际上本句为
  3. return "forword:success.jsp";
  4. //forword在本处意思为转发(不改变url地址访问资源),默认为forword
  5. return "redirect:/success.jsp"
  6. //redirect:代表重定向
复制代码
我们还可以在springmvc中配置视图解析器,来避免写前缀后缀
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>这样一来我们可以这样写:return "/success"代表:/jsp/success.jsp
复制代码
总结:

SpringMVC的数据响应

SpringMVC的数据响应方式:
页面跳转

​        返回字符串的形式也可以传递参数:
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@RequestMapping("/quick")    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public  String save(Model model){    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>model.addAttribute("username","lihua");//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>要跳转的视图    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>return "success";    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}//另外代替Model,还可以传HttpServletRequest等作为参数
复制代码
​        在index.jsp中
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
  2. 这个isELIgnored="false"表示el表达式可用
  3. <html>
  4. <body>
  5. <h2>Hello World!${username}</h2>
  6. </body>
  7. </html>
复制代码
回写数据

​        springmvc不需要我们自己来转json字符串,有更加简便的方式:
​        返回对象和集合。
​        首先需要我们在spring配置文件中进行一些配置(配置处理器映射器):
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>
复制代码
​        控制类中:
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@RequestMapping("/quick")//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>还是要写这个注解,因为还是返回的字符串数据    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@ResponseBody    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public UserServiceImpl save(HttpServletResponse response) throws IOException {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>UserServiceImpl userService = new UserServiceImpl();    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>userService.setAge(10);    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>userService.setName("lihua");    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>return userService;    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
复制代码
配置太麻烦了,可以通过mvc的注解驱动代替上述配置,没错,又又又有更加简便的操作:

在springmvc的配置文件中:
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>注意:注解驱动对应的命名空间必须是xmlns:mvc="http://www.springframework.org/schema/mvc"其他两个不行
复制代码
SpringMVC获取请求数据

获取请求参数




  1. @RequestMapping("/quick")@ResponseBodypublic void save(VO vo) throws IOException {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>System.out.println(vo.getStringList());}
复制代码
当请求为Ajax可以通过指定contenttype为json格式,通过注解直接获取集合数据:
ajax:
  1. @RequestMapping("/quick")@ResponseBodypublic void save(@RequestBody List userList) throws IOException {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>System.out.println(userList);}
复制代码
开放静态资源;
  1. 无法访问的js文件等静态资源是配置
  2.     <mvc:annotation-driven conversion-service="ConversionService"/><mvc:resources mapping="js/**" location="/js/"></mvc:resources><context:component-scan base-package="com.myspring.controller"/>
复制代码
这样也可以:在springmvc找不到资源是交给tomcat处理
  1. [/code][size=4]解决低版本tomcat请求数据为中文乱码问题[/size]
  2. 如果tomcat版本较低,当配置post请求时,数据为中文会出现乱码,所以我们通过配置过滤器来解决
  3. [code]  CharacterEncodingFilter  org.springframework.web.filter.CharacterEncodingFilter    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>  encoding    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>UTF-8    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>CharacterEncodingFilter  /*
复制代码
参数绑定注解@requestParam

当请求的参数名称和controller方法参数不一致时,就需要通过@requestParam注解显示
  1. @RequestMapping("/quick")@ResponseBody//当我在url中输入的是namepublic void save(@RequestParam("name") String username) throws IOException {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>System.out.println(username);}
复制代码
@requestParam注解的参数:

获得Restful风格的参数

Restful是一种软件架构风格、设计风格,而不是标准,只是提供一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更加简洁,更有层次等
HTTP协议中四个表示操作方式的动词:

具体实例:

自定义类型转换器

SpringMVC实际上已经具备了一些常用的类型转换器,例如客户端提交的字符串被转换成int型进行参数设置
但是可能并不完全满足我们的需求,所以我可以自定义类型转换器:
开发步骤:
获得Servlet的相关API

前面说过,直接在相关方法参数位置注入,就不在赘述

获取请求头

  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@RequestMapping("/quick")    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@ResponseBody//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>通过cookie的id获得cookie的值    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public void save(@CookieValue(value = "JSESSIONID") String cookie) throws IOException {    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>System.out.println(cookie);    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
复制代码
文件上传

文件上传客户端要求:

单文件上传步骤:
我在创建multipartResolver 实例时报500错误,后来发现是tomcat中没有commons-fileupload和commons-io的jar包,需要向tomcat下的lib目录手动导入上面那个两个坐标的包,另外可能jsp不识别el表达式需要在开头设置 isELIgnored="false"
多文件上传同理:
  1.     <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@RequestMapping("/quick")    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>@ResponseBody    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>//参数名必须与上传文件表单的各项name相同    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>public void save(String username, MultipartFile uploadFile1,MultipartFile uploadFile2) throws IOException {//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>获得文件名称    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>String originalFilename = uploadFile1.getOriginalFilename();    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>String originalFilename2 = uploadFile2.getOriginalFilename();//    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>保存文件到    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>uploadFile2.transferTo(new File("D:\"+originalFilename));    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>uploadFile1.transferTo(new File("D:\"+originalFilename));    <mvc:annotation-driven conversion-service="ConversionService"/><context:component-scan base-package="com.myspring.controller"/>}
复制代码
当然也可以把参数换成一个数组

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4