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

SpringMVC

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

SpringMVC

1. 什么是SpringMVC?

SpringMVC是Spring的一个模块,用于使用Spring框架来创建web应用程序。Spring提供了一个spring-webmvc来构建基于mvc的web应用程序。MVC是一种软件架构的思想,将软件按照模型,视图,控制器来划分M: model模型层,指工程中的JavaBean,作用是处理数据V: View视图层:指工程中的html和jsp等页面,作用是与用户进行交互,展示数据C:Controller控制层:指工程中的Servlet, 作用是接收请求和响应浏览器MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收, Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller, Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给服务器。
2. 基础案例: 1. 用Maven来管理项目工程和依赖(pom.xml):

        
        
            org.springframework
            spring-webmvc
            5.3.1
        

        
        
            ch.qos.logback
            logback-classic
            1.2.3
        

        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        

        
        
            org.thymeleaf
            thymeleaf-spring5
            3.0.12.RELEASE
        
2. 配置web.xml

注册SpringMVC的前端控制器DispatcherServlet来对浏览器发送的请求统一进行处理默认配置方式:

此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为


    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
    
        
        contextConfigLocation
        
        classpath:springMVC.xml
    
    
    1

我们在web.xml文件里注册的DispatcherServlet的名字叫SpringMVC我们映射此 Servlet 以处理以“/”开头的传入请求(相对于应用程序路径)可通过init-param来设置SpringMVC配置文件的位置和名称 3. 配置SpringMVC.xml:

配置自动扫描包和Themeleaf视图解析器

    
    

    
    
        
        
        
            
                
                    

                        
                        

                        
                        
                        
                        
                    
                
            
        
    

context:component-scan:

在xml文件中配置了comtext:component-scan后,Spring容器可以自动去扫描base-pack所指定的包下面的Java类文件。如果扫描到有@Component, @Controller, @Service, @Repository等注解修饰的Java类,则将这些类注册为Spring容器中的bean。 4. 引用Thymeleaf模版引擎:

什么是模版引擎?

模版引擎的作用就是我们来写一个页面模版,比如有些值呢,是动态的,我们写一些表达式,从哪来呢,就是我们在后台封装一些数据。然后把这个模版和这个数据交给我们模版引擎,模版引擎按照我们这个数据帮你把表达式进行解析,填充到我们的指定位置,然后把这个数据最终生成一个我们想要的内容给我们写出去,这个就是我们的模版引擎。不管是jsp文件还是其他模版引擎,都是这个思想。

Thymeleaf是一个可以完全替代jsp的模版引擎:

通过Maven引入Thymeleaf和Spring5模版引擎:

    
    
        org.thymeleaf
        thymeleaf-spring5
        3.0.12.RELEASE
    

我们要使用Thymeleaf,需要在html文件中导入命名空间的约束,方便显示


5. 创建请求控制器:

由于前段控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器

请求控制器中每一个处理请求的方法称为控制器方法

因为SpringMVC的控制器由一个POJO(普通的java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IOC容器管理,此时SpringMVC才能够识别控制器的存在。

@Controller
public class HelloController {
    // @RequestMapping注解:处理请求和控制器方法之间的映射关系
    // @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
    // localhost:8080/springMVC/
    @RequestMapping("/")
    public String index() {
        //设置视图名称
        return "index";
    }

    @RequestMapping("/hello")
    public String HelloWorld(){
        return "target";
    }
}

@Controller: 表示这是一个能够处理 Web 请求的 Spring MVC 控制器@RequestMapping: 注解用于将 Web 请求映射到 Spring Controller 方法 6.创建测试html页面:




    
    首页


    

首页

访问目标页面target.html
7. 测试结果:

3. @RequestMapping注解

@RequestMapping注解的功能:
从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。 SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求

@RequestMapping注解的位置:

@RequestMapping标识一个类:设置映射请求的请求路径的初始信息@RequestMapping表示一个方法:设置映射请求请求路径的具体信息

@Controller
@RequestMapping("/test")
public class RequestMappingController {
	//此时请求映射所映射的请求的请求路径为:/test/testRequestMapping
	@RequestMapping("/testRequestMapping")
 	public String success(){
    	return "success";
 	}
}

上面的请求映射的请求路径是:/test/testRequestMapping

@RequestMapping注解的value属性:

@RequestMapping注解的value属性通过请求的请求地址匹配请求映射@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能匹配多少个请求地址所对应的请求@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射

测试@RequestMapping的value属性-- >/testRequestMapping
测试@RequestMapping的value属性-->/test
@RequestMapping(value = {"/testRequestMapping", "/test"})
public String testRequestMapping(){ 
	return "success"; 
}

@RequestMapping注解的method属性:

@RequestMapping注解的method属性通过请求的请求方式(get或者post)匹配请求映射@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405对于处理指定请求的方法,SpringMVC中提供了@RequestMapping的派生注解:处理GET请求的映射: @GetMapping处理POST请求的映射: @PostMapping处理PUT请求的映射: @PutMapping处理DELETE请求的映射:@DeleteMapping

@RequestMapping注解的params属性:

params属性必须同时满足

@RequestMapping注解的params属性通过请求的请求参数匹配请求映射

@RequestMapping注解的params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系

“param”: 要求请求映射所匹配的请求必须携带param请求参数“!param”: 要求请求映射所匹配的请求必须不能懈怠param请求参数“param=value”: 要求请求映射所匹配的请求必须携带param请求参数且param=value“param!=value”: 要求请求映射所匹配的请求必须修带param请求参数但是param != value

案例:
index.html文件

  测试RequestMapping注解的params属性

控制器文件:

@RequestMapping(value="/testParamsAndHeaders", params={"username", "password!=123456"})
public String testParamsAndHeaders(){
    return "success";
}

若当前页面满足@RequestMapping注解的value和method属性,但是不满足params属性,此时页面会报错400:Parameter conditions “username, password!=123456” not met for actual request parameters: username={admin}, password={123456}

SpringMVC支持路径中的占位符:

原始方式:/deleteUser?id=1rest方式:/deleteUser/1
SpringMVC路径中的占位符常用于restful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符(xxx)表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参案例:
html文件:

测试RequestMapping支持路径中的占位符

Controller:

@RequestMapping(value="/testPath/{id}")
public String testPath(@PathVariable("id")Integer id){
    System.out.println("id is "+id);
    return "success";
}

Console Output:

id is 1
4. SpringMVC获取请求参数:

通过ServletAPI获取:
将HttpServletRequest作为控制器方法形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:" + username + " ,password:" + password);
    return "success";
}

通过控制器方法的形参获取请求参数:

@RequestMapping("/testParam")
public String testParam(String username, String password, String[] hobby){
    System.out.println("username: " + username + " ,password:" + password+ " ,hobby:" + Arrays.toString(hobby));
    return "success";
}

需要保持每一个请求的名字与参数名一致若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接受此请求参数。若使用字符串数组类型的形参,此参数的数组中包含了每一个数据若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果。

通过POJO实体类获取请求参数:
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。
html文件:

用户名:
密码:
性别:
年龄:
邮箱:

实体类文件:

public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
    private String email;
    ...

控制器文件:

@RequestMapping("/testPojo")
public String testPojo(User user){
    System.out.println(user);
    return "success";
}

Output:

User{id=null, username='adamc18', password='chen199928', age=22, sex='ç”·', email='75931296@qq.com'}
5. 域对象共享数据:

通过ModelAndView向request域对象共享数据:

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    ModelAndView mav = new ModelAndView();
    //处理模型数据,即向请求域request共享数据
    mav.addObject("testRequestScope","Hello, ModelAndView!");
    //设置视图名称
    mav.setViewName("success");
    return mav;
}

视图名称相当于跳转页面

使用Model向request域对象共享数据:

@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("testRequestScope", "Hello, model!");
    return "success";
}

使用map向request域对象共享数据:

@RequestMapping("/testMap")
public String testMap(Map map){
    map.put("testRequestScope", "Hello, Map!");
    return "success";
}

使用ModelMap向request域对象共享数据:

@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testRequestScope", "Hello, ModelMap");
    return "success";
}

向session域共享数据:

@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "Hello, Session!");
    return "success";
}

向application域共享数据:

@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
    ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "Hello, Application!");
    return "success";
}
6. SpringMVC的视图:

SpringMVC中的视图是View接口,视图的作用是渲染数据,将模型Model中的数据展示给用户。SpringMVC视图的种类很多,默认有转发视图和重定向视图。当工程引入jstl的依赖,转发视图会自动转换为JstlView。若使用的视图技术为Thymeleaf, 在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析后所得到的是ThymeleafView。

ThymeleafView:
当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。

@RequestMapping("/test_view")
public String testView(){
    return "test_view";
}

对应的链接地址是http://localhost:8080/demo3_war_exploded/test_view

转发视图:
SpringMVC中创建转发视图的情况:
当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方法实现跳转:

@RequestMapping("/testForward")
public String testForward(){
    return "forward:/testThymeleafView";
}

转发后的页面路径还是/testForward。不是/testThymeleafView。但是如果使用重定向的话,页面路径就是/testThymeleafView。这就是转发和重定向的区别。

重定向视图:
SpringMVC中默认的重定向视图时RedirectView。当控制器方法中所设置的视图名称以“redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀“redirect:”去掉,剩余部分作为最终路径通过重定向的方式实现跳转。

@RequestMapping("/testRedirect")
public String testRedirect(){
    return "redirect:/testThymeleafView";
}

视图控制器View-Controller:
当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用View-Controller标签进行表示。




当在SpringMVC配置文件中设置任何一个View-Controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启MVC注解驱动的标签: 7. Restful简介:

Restful简介:
REST: Representational State Transfer,表现层资源状态转移。

资源:
资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象概念,所以它不仅仅能代表服务器文件系统中的一个文件,数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者可以理解。

资源的表述:
资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移和交换。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。

状态转移:
状态转移说的是:在客户端和服务器端之间转移,代表资源状态的表述。通过转移和操作资源的表述,来间接实现操作资源的目的。

Restful的实现:

具体说,就是HTTP协议里面,四个表示操作方式的动词:GET, POST, PUT, DELETE。他们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。但是通常浏览器html的form表单不支持PUT和DELETE请求,解决这个问题的方式是用springMVC来配置put和delete的过滤器。REST风格提倡URL地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为URL地址的一部分,以保证整体风格的一致性。 8. Restful 案例:

搭建环境:

配置pom.xml (maven)

配置web.xml:

配置编码过滤器:

    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
        
            forceResponseEncoding
            true
        
    
    
        CharacterEncodingFilter
        
    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    
    @Override
    protected Class[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterFilter = new CharacterEncodingFilter();
        characterFilter.setEncoding("UTF-8");
        characterFilter.setForceResponseEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterFilter, hiddenHttpMethodFilter};
    }
}

创建SpringConfig配置类,代替Spring的配置文件:

//将当前类标识为一个配置类
@Configuration
@ComponentScan("com.example.annotation.Controller") //
@EnableWebMvc //开启mvc注解驱动
public class WebConfig implements WebMvcConfigurer {
    //使用默认的servlet处理静态资源
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    //配置文件上传解析器
//    @Bean
//    public CommonsMultipartResolver multipartResolver(){
//        return new CommonsMultipartResolver();
//    }

//    //配置拦截器
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        FirstInterceptor
//    }

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public ViewResolver thymeleafResolver() {
        ThymeleafViewResolver ivr = new ThymeleafViewResolver();
        ivr.setTemplateEngine(templateEngine());
        ivr.setOrder(0);
        return ivr;
    }

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver srtr = new SpringResourceTemplateResolver();
        srtr.setApplicationContext(applicationContext);
        srtr.setPrefix("/WEB-INF/templates/");
        srtr.setSuffix(".html");
        return srtr;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }
}

ComponentScan: 注解扫描EnableWebMVC开启注解驱动:开启注解驱动的目的是为了告诉Spring这个class是Controller 13. SpringMVC执行流程:

SpringMVC常用组件:

DispatcherServlet: 前端控制器,不需要工程师开发,由框架提供。 作用:统一处理请求和响应,整个流程控制的中心,由它调用组件处理用户请求HandlerDispatcher: 处理器映射器,不需要工程师开发,由框架提供。 作用: 根据请求的url,method等信息查找Handler,即控制器方法。**Handler:**处理器(控制器),需要工程师开发。 作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理HandlerAdaptor: 处理器适配器,不需要工程师开发,由框架提供。作用:通过HandlerAdaptor对处理器(控制器方法)进行执行。**ViewResolver:**视图解析器,不需要工程师开发,由框架提供。作用:进行视图解析,得到相应的视图,例如:ThymeleafView, InternalResourceView, RedirectViewView: 视图。 作用: 将模型数据通过页面展示给用户。

DispatcherServlet初始化过程:
DispatcherServlet本质上是一个Servlet,所以天然的遵循Servlet的生命周期。所以宏观上是Servlet生命周期来进行调度。

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

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

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