SpringMVC

用于做请求的响应和处理 之前封装的Dispacher 接受请求 寻找资源 类 方法 处理 参数 响应 Servlet没有耦合 使用配置文件 1.导包(beans context core expression aop web webmvc) 2.主配置(本质是一个servlet) web.xml 中 配置入口 DispacherServlet 所有控制层统一接收 并分发(谁) *.do 3.小配置 请求--真实类(方法) 对应关系 文件默认是在web-inf文件夹下找的 文件默认名字是 标签名 - servlet.xml 如果想修改文件路径和名字 在步骤2的xml文件里进行修改 init-param contextConfigLocation classPath:xxx.xml 4.浏览器发请求 找到真实类 5.请求参数 真实类方法中写参数变量就行--参数的IOC和DI 普通类型 String int map类型 domain类型 6.响应信息 注解开发 1.导包(beans context core expression aop web webmvc) 2.主配置(本质是一个servlet) web.xml 中 配置入口 DispacherServlet 所有控制层统一接收 并分发(谁) *.do 3.小配置 请求--真实类(方法) 对应关系 文件默认是在web-inf文件夹下找的 文件默认名字是 标签名 - servlet.xml 如果想修改文件路径和名字 在步骤2的xml文件里进行修改 init-param contextConfigLocation classPath:xxx.xml 加载了HandlerMapping 4.自己写controller 没有继承或实现关系 方法可以随便写 参数可以随便传 返回值 void String ModelAndView 5.自己写的controller加注解 @Controller ---> Spring将对象管理起来 @RequestMapping ---> SpringMVC请求和对应资源连接起来 发送请求 1.如何发送 #方式一:发送时直接写 类名.do 在类上面写注解@RequestMapping(path|value="类名.do") 类中只有一个方法 方法上面添加注解RequestMapping #方式二:发送请求时候 类名字.do?method=方法名 类名上写注解(类名.do) 方法上写注解(params={""}) (请求结构就比较麻烦 类名.do?method=方法名) (类的注解也很麻烦 类上一个 方法上有一个 方法的这个注解还有params参数) 方法三:发送请求的时候 xxx.do (xxx通常是一个方法名) 类上面就不用写注解了 类中的方法上面写注解 注解中写与请求对应那个 xxx.do 2.@RequestMapping注解中的方法 path{"",""} value = {"",""} //同上面 有时多个请求一个方法 params = {"",""} method = {RequestMethod.GET} headers = {"Accept-Language",""} 接收参数 1.方法中直接传入变量 变量直接接收 要求变量名字看i与前面传递的key一致 即使是一个变量也需要对应key一致 否则接收不到 如果变量和前面传递的key不一致,可以利用注解@RequestParam("key") 参数的类型可以不一定是string,int等也可以 2.方法中直接传入实体对象 如果传递的参数可以组合成一个对象 可以直接使用对象接收 对象中的属性名和前面传递的key一致 如果对象里面还有对象 只需要在请求的时候写 对象的属性.属性名即可 计入User中有一个Wallet对象 Wallet中有个money属性 walet.money 3.方法中传入map集合的方式 可以使用Map类型来接收请求的参数的 前提是 Map参数的前面 必须添加@RequestParam 否则Map是无法接收到参数的 Model ModelMap ModelAndView 4.方法中传递原生Request对象 直接在方法中传递参数变量即可接收 HttpServletRequest HttpServletResponse ------- 中文 自定义转换器 接收请求参数的时候 产生的中文乱码问题(get没问题 post请求 配置一个Filter) 可以利用SpringMVC给我们提供的一个小过滤器处理 自定义转换器 Converter 1.自定义一个类 2.实现上面这个接口 接口支持泛型 Converter 3.重写接口中的转换方法 方法内部该做具体转化的事情 方法会返回一个转化后的对象 4.告知Spring这里有一个自定义的类型转换器 需要让Spring帮我们加载并管理起来 配置 配置驱动 ------------ 接收请求参数的时候 @RequestParam注解 变量 Map @RequestHeader注解 接受协议头数据 @CookieValue @RequestBody 接收 key=value&key=value 放在参数前面 注解只能接收Post请求方式 post请求是存在协议体(参数) get请求只有请求头没有请求体 @ResponseBody注解 json响应 @ModelAttribute注解 放在某一个方法上面 方法在请求的方法执行之前限制性的(块 init) 响应处理 void 自己写响应 原生response.getWriter().write(); string 转发 forward:xxx.jsp 重定向 redirect:xxx.jsp Json处理 现在开发项目都是前后端分离 JSP(编译过程,性能不好) 静态数据+动态数据 一次请求 一次拼接 一次响应 静态数据先响应 动态数据发送异步请求 而后在浏览器端拼接展示 HTML+AJAX+JSON(js操作) String 转发路径 Ajax请求直接响应 MAP domain->Ajax响应-Json 总结 响应信息方式如下 Object Domain String Map List----->Json 1.处理工具--jar 如jackson等包 2.告知框架方法的返回值需要解释 @Responsebody ModelAndView 一些是这种方式开发的 服务端业务层可能会产生一些数据 这些数据我们需要存入作用域中带走 request.setAttribute(); 1.可以使用原生Map处理 Map接受请求参数(@RequestParam) Map可以返回数据(@ResponseBody) 2.可以使用Model或ModelMap处理 Model底层继承ModelMap 存储数据之前不需要自己创建 只需将变量放置在方法的参数里即可 框架会帮我们自动注入 m.addAttribute("",object); 3.可使使用ModelAndView处理 不能放在方法的参数里 框架不会帮我们注入 需要用的时候自己new即可 mv.addObject("",object); mv.setViewName("xxx.jsp"); 可以包含数据和转发路径 需要见自己创建的mv对象返回 4.如果想要将值从session等中返回 涉及到Session的存储 类上面添加@SessionAttributes({"",""}) 异常处理 JSP <%%> EL+JSTL 异常页 异常的处理 1.自定义一个异常类MyException 将所有的异常都统一捕获 变成一个唯一的常量 交给总管 2.自定义一个异常处理类(处理异常 做转发 响应) ExceptionResolver(核心) 实现规则 实现接口HandlerExceptionResolver 重写方法public ModelAndView resolveException(request,response,object,exception){ 判断一下exception对象是否是我们自己抛出 创建ModelAndView对象 存储信息 转发路径 error.jsp return mv; } 3.告知Spring将我们自己定义的处理类管理起来(配置文件 xml 注解) 自己定义的处理类上面添加@Component注解(别忘了扫描包) 拦截器 原生Tomcat时候 Servlet---资源类 JSP(Java Server Pages)---本质就是Servlet 帮助Servlet服务的 响应拼接 静态资源+动态数据 静态动态分离 HTML+AJAX+JSON Filter---过滤器 特殊的Servlet 责任链设计模式 动态代理机制---AOP设计思想 SpringMVC的拦截器可以理解为是以前的Filter 在真正到达资源换(Controller---Servlet)之前做事情的 SpringAOP---自己定义类和方法---交给Spring帮我们管理 拦截器使用流程 1.自己定义一个拦截器的类(规则) 继承HandlerInterceptorAdapter 实现HandlerInterceptor(接口中三个方法都是default修饰) 2.自定义类的方法需要重写 preHandle 预先处理(controller之前) AOP前置 postHandle 请求后处理(controller之后) AOP后置 afterHandle 完成后处理(controller执行完毕之后) 3.配置ApplicationContext.xml文件 过滤器Filter 拦截器Interceptor Tomcat容器提供的 SpringMVC框架提供的 没有框架的时候可以 必须有框架支持 配置web.xml Spring核心文件ApplicationContext.xml 处理所有请求 处理Servlet请求 文件上传/下载 上传 依赖于Apache两个jar commons-io commons-fileupload 1.导包 commons-io、fileupload 2.DiskFileItemFactory ServletFileUpload upload.parseRequest 得factory 得upload 得itemList 3.List 4.判断是否为表单 item.isFormField() item.getFieldName item.getString("UTF-8") 5.文件对象 item.getName() item.write(new File("上传路径")) 基于SpringMVC的方式 1.导包 2.配置一个文件解析器 CommonsMultipartResolver 2.自己写一个Controller 方法内部像之前一样接收参数即可 直接变量接收 文件参数MultipartFile类型 变量名与前面的key一直 String text MultipartFile upload 3.获取文件名字 文件内容 传输 upload.getOriginalFilename(); upload.transferTo(new File("上传路径")) 下载 原生 1.获取请求过来的文件名 request.getParameter(filename); 2.直接创建文件输入流读取文件 InputStream is = new FileInputStream("src"+filename); 3.做响应--设置 文件名含中文 fileName = URLEncoder.encode(fileName,"UTF-8"); 响应头 response.setContentType("application/x-msdownload"); response.setHeader("Content-disposition","attachment;filename="+fileName); 4.正式开始写数据(输出流) OutputStream os = response.getOutputStream(); byte[] b = new byte[1024]; //读取有效字节个数 int length = is.read(b); while(length!=-1){ os.write(b,0); os.flush(); length = is.read(b); } SpringMVC public ResponseEntity xxx(String fileName) throws Exception 1.直接获取读取文件 File file = new File(src+fileName); 2.设置响应信息相关 有中文就处理 fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment",fileName) 3.将响应信息存入一个返回值对象内即可---ResponseEntity byte[] b = FileUtils.readFileToByteArray(file); return new ResponseEntity(b,headers,HttpStatus.CREATED);
posted @ 2022-04-30 17:10  画饼躺平学习冲  阅读(27)  评论(0)    收藏  举报