栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC学习笔记

目录

SpringMVC

概述

SpringMVC的使用步骤

SpringMVC中常用的两个注解

接收用户提交的参数

可以直接出现在处理器方法上的参数

逐个接收参数,处理器方法的形参名和请求中参数名一样,按名称对应赋值

解决请求中post方式有中文乱码的问题

逐个接收中,请求参数名和形参名不一样,使用@RequestParam解决问题

使用java对象接收请求的参数,要求属性名和请求参数名相同

SpringMVC处理器方法的形参还可以是Map,List等集合类型,数组也可以

处理器方法的返回值:表示请求的处理结果

返回:ModelAndView

返回:String

返回:void

返回:对象

SpringMVC处理器方法放回对象,转为json响应ajax步骤

SpringMVC中关于url-pattern的问题

SSM整合开发

涉及的容器

创建容器的方式

涉及的配置文件

开发步骤

转发和重定向

转发

重定向

特点

异常处理

拦截器


SpringMVC

概述

SpringMVC是做web开发的框架,实际上是Spring框架中的一个模块

SpringMVC的使用就是基于Spring容器的概念,SpringMVC会创建容器:WebApplicationContext,SpringMVC作为容器是创建和管理控制器对象的,使用@Controller创建控制器对象

SpringMVC底层访问依然是Servlet-----DispatcherServlet(中央调度器) 创建WebApplicationContext对象,读取配置文件,进而创建控制器对象 它是一个Servlet,接收用户的请求,显示处理结果

SpringMVC的使用步骤

1、加入依赖

spring-webmvc依赖,间接把Spring的依赖都加入到项目中 jsp、servlet依赖


 ​
 
     4.0.0
 ​
     com.hgc
     ch01-hello-springmvc
     1.0-SNAPSHOT
     war
 ​
     ch01-hello-springmvc Maven Webapp
     
     http://www.example.com
 ​
     
         UTF-8
         1.8
         1.8
     
 ​
     
         
         
             junit
             junit
             4.11
             test
         
 ​
         
         
             javax.servlet
             javax.servlet-api
             3.1.0
             provided
         
 ​
         
         
             javax.servlet.jsp
             jsp-api
             2.2
         
 ​
         
         
             org.springframework
             spring-webmvc
             5.3.7
         
 ​
 ​
     
 ​
     
 ​
     
 

2、重点:在web.xml文件中注册SpringMVC框架的核心对象DispatcherServlet

  • DispatcherServlet叫做中央调度器,是一个Servlet,它的父类是HttpServlet

  • DispatcherServlet也叫前端控制器(front controller)

  • DispatcherServlet负责接收用户提交的请求,调用其它的控制器对象,并把请求的处理结果显示给用户


 
     
     
     
         springmvc
         org.springframework.web.servlet.DispatcherServlet
         
         
             
             contextConfigLocation
             
             classpath:springmvc.xml
         
 ​
         
         1
     
 ​
     
         springmvc
 ​
         
         *.do
     
     
 

3、创建一个发起请求的页面(index.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
 
     第一个springmvc项目
 
 
     

发起some.do请求

   

4、创建控制器(处理器)类

package com.hgc.controller;
 ​
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
 ​
 
 @Controller
 public class MyController {
     
 ​
     
     @RequestMapping(value = "/some.do")
     public ModelAndView doSome(){
         ModelAndView mv = new ModelAndView();
         // 添加数据,框架在请求最后把数据放入到request作用域
         mv.addObject("msg", "hello SpringMVC");
         mv.addObject("fun", "执行的doSome方法");
         // 指定视图,指定视图的完整路径
         // 框架对视图执行的forward操作,request.getRequestDispatcher("/show.jsp").forward(request, response)
         // mv.setViewName("/show.jsp");
         // mv.setViewName("/WEB-INF/view/show.jsp");
 ​
         // 当配置了视图解析器后,可以使用逻辑名称(文件名),指定视图
         // 框架会使用视图解析器的前缀 + 逻辑名称 + 后缀 组成完整路径,就是字符串连接操作
         mv.setViewName("show");
         // 返回mv
         return mv;
 ​
     }
 }

5、创建一个作为结果的jsp,显示请求的处理结果

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
 
     显示结果
 
 
     msg数据:${msg}
     fun数据:${fun}
 ​    

6、创建SpringMVC的配置文件

  • 声明组件扫描器,执行@Controller注解所在的包名

  • 声明视图解析器,帮助处理视图的


 
 ​
     
     
 ​
     
     
         
         
         
         
     
 

7、测试

  • 打开浏览器,在地址栏输入:http://localhost:8080/some.do

8、结果

SpringMVC中常用的两个注解

@Controller

@Controller:创建控制器类的对象,接收请求,处理请求

@RequestMapping

@RequestMapping:请求映射,把请求绑定到一个方法,让这个方法处理请求

@RequestMapping的两个属性

  • value:请求的uri地址,唯一值

  • method:请求的方式,使用RequestMethod类的枚举值 例如:RequestMethod.GET

接收用户提交的参数

可以直接出现在处理器方法上的参数

HttpServletRequest HttpServletResponse HttpSession 这三个可以直接出现在参数的位置

逐个接收参数,处理器方法的形参名和请求中参数名一样,按名称对应赋值
 @RequestMapping(value = "/receiveParam.do")
 public ModelAndView doSome(String name, Integer age){
     ModelAndView mv = new ModelAndView();
     mv.addObject("name", name);
     mv.addObject("age", age);
     mv.setViewName("show");
     return mv;
 }

解决请求中post方式有中文乱码的问题

使用过滤器

     
     characterEncodingFilter
     org.springframework.web.filter.CharacterEncodingFilter
     
     
         encoding
         utf-8
     
     
     
         forceRequestEncoding
         true
     
     
     
         forceResponseEncoding
         true
     
 
 ​
 
     characterEncodingFilter
     
     
 ​
 @RequestMapping(value = "/receiveParam2.do")
 public ModelAndView doOther(@RequestParam(value = "rname", required = true) String name,
                             @RequestParam(value = "rage", required = false) Integer age){
     ModelAndView mv = new ModelAndView();
     mv.addObject("name", name);
     mv.addObject("age", age);
     mv.setViewName("show");
     return mv;
 }

使用java对象接收请求的参数,要求属性名和请求参数名相同
 @RequestMapping(value = "/receiveObject.do")
 public ModelAndView doThird(Student student){
     ModelAndView mv = new ModelAndView();
     mv.addObject("name", student.getName());
     mv.addObject("age", student.getAge());
     mv.setViewName("show");
     return mv;
 }

SpringMVC处理器方法的形参还可以是Map,List等集合类型,数组也可以

处理器方法的返回值:表示请求的处理结果

返回:ModelAndView

ModelAndView:表示数据和视图,对视图执行forward

@RequestMapping(value = "returnModelAndView.do")
 public ModelAndView doReturnModelAndView(String name, Integer age){
     ModelAndView modelAndView = new ModelAndView();
     modelAndView.addObject("name", name);
     modelAndView.addObject("age", age);
     modelAndView.setViewName("show");
     return modelAndView;
 }

返回:String

String:表示数据,如果方法上有@ResponseBody注解,那么String表示数据,表示数据时,会有中文乱码的问题,需要使用@RequestMapping中的produces属性来指定字符集:text/plain;charset=utf-8

返回String表示数据

 @ResponseBody
 @RequestMapping(value = "/returnStringDate.do", produces = "text/plain;charset=utf-8")
 public String doReturnStringData(String name, Integer age) {
     Student student = new Student();
     student.setAge(1);
     return "Hello SpringMVC 返回String表示数据";
 }

返回String表示视图

String:表示视图,表示视图的话,可以是逻辑名称(文件名,不带后缀),也可以是完整视图路径,对视图执行forward

@RequestMapping(value = "/returnString.do")
 public String doReturnString(HttpServletRequest request, String name, Integer age) {
     // 这里我们可以自己手动添加数据
     request.setAttribute("name", name);
     request.setAttribute("age", age);
 ​
     // 使用完整视图路径,不能注册视图解析器
     //return "/WEB-INF/view/show.jsp";
 ​
     // 使用逻辑名称,必须注册视图解析器
     return "show";
 }

返回:void

void:返回值本身不能表示数据和视图,可以响应ajax请求

 @RequestMapping(value = "/returnVoid.do")
 public void doReturnVoid(HttpServletResponse response, String name, Integer age) throws IOException {
     Student student = new Student();
     student.setAge(age);
     student.setName(name);
 ​
     String json = "{}";
     if (student != null) {
         ObjectMapper om = new ObjectMapper();
         json = om.writevalueAsString(student);
     }
 ​
     response.setContentType("application/json;charset=utf-8");
     PrintWriter writer = response.getWriter();
     writer.println(json);
     writer.flush();
     writer.close();
 }

返回:对象

返回对象:表示数据的,响应ajax请求

 @RequestMapping(value = "/returnStudent.do")
 @ResponseBody
 public Student doReturnStudent(String name, Integer age) {
     Student student = new Student();
     student.setName(name);
     student.setAge(age);
     return student;
 }

SpringMVC处理器方法放回对象,转为json响应ajax步骤

1、加入处理java到json转换工具库的依赖

 
     com.fasterxml.jackson.core
     jackson-core
     2.9.0
 
 
     com.fasterxml.jackson.core
     jackson-databind
     2.9.0
 
 
     com.fasterxml.jackson.core
     jackson-annotations
     2.9.0
 

2、在SpringMVC配置文件中加入注解驱动

 
 

3、在处理器方法上加入@ResponseBody注解

SpringMVC中关于url-pattern的问题

设置中央调度器的url-pattern是 "/":导致静态资源访问失败都是404 动态资源可以正常访问


 
     
     
         springmvc
         org.springframework.web.servlet.DispatcherServlet
         
             contextConfigLocation
             classpath:springmvc.xml
         
         1
     
     
         springmvc
         
         /
     
 

第一种解决静态资源访问的方案:在SpringMVC的配置文件中加入两个标签


原理:加入DefaultServletHttpRequestHandler对象,让这个对象处理静态资源的访问

第二种处理静态资源

  • 使用框架中的mvc:resources标签,由框架自己处理静态资源的访问

  •      
             springmvc
             org.springframework.web.servlet.DispatcherServlet
             
                 contextConfigLocation
                 classpath:conf/dispatcherServlet.xml
             
             1
         
         
             springmvc
             *.do
         
         
         
         
             contextConfigLocation
             classpath:conf/applicationContext.xml
         
         
             org.springframework.web.context.ContextLoaderListener
         
     ​
         
         
             characterEncodingFilter
             org.springframework.web.filter.CharacterEncodingFilter
             
                 encoding
                 utf-8
             
             
                 forceRequestEncoding
                 true
             
             
                 forceResponseEncoding
                 true
             
         
         
             characterEncodingFilter
             
     @RequestMapping(value = "/forward.do")
     public ModelAndView doForward(){
         ModelAndView mv = new ModelAndView();
         mv.addObject("msg", "转发操作,能够转发不在WEB-INF/view目录下的jsp");
         mv.setViewName("forward:/show.jsp");
         return mv;
     }

    重定向

    重定向:redirect

     @RequestMapping(value = "/redirect.do")
     public ModelAndView doRedirect(String name, Integer age){
         ModelAndView mv = new ModelAndView();
         mv.addObject("msg", "重定向");
         mv.addObject("myname", name);
         mv.addObject("myage", age);
         mv.setViewName("redirect:/show2.jsp");
         return mv;
     }

    特点

    特点

    都不和视图解析器一同工作,就好像项目中没有配置视图解析器一样

    异常处理
    package com.hgc.handler;
     ​
     import com.hgc.exception.AgeException;
     import com.hgc.exception.NameException;
     import org.springframework.web.bind.annotation.ControllerAdvice;
     import org.springframework.web.bind.annotation.ExceptionHandler;
     import org.springframework.web.servlet.ModelAndView;
     ​
     // 注意这个注解
     @ControllerAdvice
     public class UserExceptionHandler {
     ​
         
     ​
         
         @ExceptionHandler(value = NameException.class)
         public ModelAndView donameException(Exception exception) {
             ModelAndView mv = new ModelAndView();
             mv.addObject("msg", "姓名必须是:张三。不然就会出错,不信你再试试");
             mv.addObject("ex", exception);
             mv.setViewName("nameError");
             return mv;
         }
     ​
         @ExceptionHandler(value = AgeException.class)
         public ModelAndView doAgeException(Exception exception) {
             ModelAndView mv = new ModelAndView();
             mv.addObject("msg", "年龄必须在200岁一下,不然会认为你是老妖怪");
             mv.addObject("ex", exception);
             mv.setViewName("ageError");
             return mv;
         }
     ​
         
         @ExceptionHandler
         public ModelAndView doOtherException(Exception exception) {
             ModelAndView mv = new ModelAndView();
             mv.addObject("msg", "发生了不可描述的异常");
             mv.addObject("ex", exception);
             mv.setViewName("defaultError");
             return mv;
         }
     ​
     }

    拦截器

    注册一个拦截器

    
         
             
             
              
    

    =========================================================================作者:晚枫

    链接:https://blog.csdn.net/q2570558854/article/details/121161439

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号