SpringMVC知识点一

SpringMVC知识点一,第1张

SpringMVC知识点一

目录
  • SpringMVC 概述
  • 搭建SpringMVC
    • HelloWorld深度解析
  • @RequestMapping注解
    • RequestMapping 映射请求注解
    • RequestMapping映射请求方式
    • RequestMapping映射请求参数&请求头
    • RequestMapping支持Ant 路径风格
    • RequestMapping映射请求占位符PathVariable注解
    • 测试代码
  • REST
  • 处理请求数据(后端接收前端页面发送的数据)
    • @RequestParam注解
    • @RequestHeader 注解
    • @cookievalue 注解
    • 使用POJO作为参数
    • 使用Servlet原生API作为参数
  • 处理响应数据(后端处理设置前端页面数据)
    • SpringMVC 输出模型数据概述
    • 处理模型数据之 ModelAndView
    • 处理模型数据之 Map Model

SpringMVC 概述

1、SpringMVC 概述
1)Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的MVC 框架之一
2)Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
3)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
4)支持 REST 风格的 URL 请求。 Restful
5)采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

2、SpringMVC是什么
1)一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层。Spring框架的一个后续产品。
2)Spring框架结构图(新版本):

3、SpringMVC能干什么
1)天生与Spring框架集成,如:(IOC,AOP)
2)支持Restful风格
3)进行更简洁的Web层开发
4)支持灵活的URL到页面控制器的映射
5)非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
6)因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
7)非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
8)更加简单、强大的异常处理
9)对静态资源的支持
10)支持灵活的本地化、主题等解析

4、SpringMVC怎么用
1)将Web层进行了职责解耦,基于请求-响应模型
2)常用主要组件
①DispatcherServlet:前端控制器

②Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理

③HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象)

④View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;
如InternalResourceViewResolver将逻辑视图名映射为JSP视图

⑤LocalResolver:本地化、国际化

⑥MultipartResolver:文件上传解析器

⑦HandlerExceptionResolver:异常处理器

搭建SpringMVC

1)新建Web工程,加入 jar 包
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

2)在web.xml中配置springMVC的核心(前端)控制器DispatcherServlet
作用:加载springMVC的配置文件: DispatcherServlet自动加载配置文件,此时的配置文件有默认的位置和名称:
默认位置:WEB-INF下
默认名称-servlet.xml

当加载了配置文件,springMVC就会根据扫描组件找到控制层



    
        springMVC
        org.springframework.web.servlet.DispatcherServlet
    

    
        springMVC
        /
    

3)创建配置文件

紧接上面第二步,创建并配置文件,注意:此文件的默认名称为:-servlet.xml;要与web,xml中的servletname一致。

当加载了配置文件,springMVC就会根据扫描组件找到控制层





    
  
    
    
        
        
    

4)创建一个POJO,在此类上加上@Controller注解,springMVC就会将此类作为控制层加载,让其处理请求响应
在控制层中,需要在方法上设置@RequestMapping(value=“xxx”)
springMVC就是通过此注解将请求路径与控制层中的方法进行匹配,此时请求路径为localhost:8080/projectName/xxx

处理请求的方法会返回一个字符串,即视图名称,最终会通过配置文件中配置的视图解析器实现页面跳转
方式:prefix + 视图名称 + suffix ,此为最终跳转的页面路径

package com.springMVC;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {//POJO:普通java类
    
    @RequestMapping("hello")
    public String respondhello() {
        System.out.println("success");
        return "success";
    }
}

5)再创建一个相应jsp页面:

<%--
  Created by IntelliJ IDEA.
  User: 86178
  Date: 2021/12/22
  Time: 17:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


 success


测试:

HelloWorld深度解析


流程分析:

基本步骤:
①客户端请求提交到DispatcherServlet
②由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
③DispatcherServlet将请求提交到Controller(也称为Handler)
④Controller调用业务逻辑处理后,返回ModelAndView
⑤DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
⑥视图负责将结果显示到客户端

@RequestMapping注解 RequestMapping 映射请求注解

1)SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些 URL 请求

2)在控制器的类定义及方法定义处都可标注 @RequestMapping
①标记在类上:提供初步的请求映射信息。相对于 WEB 应用的根目录
②标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。

3)若类上未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录

4) 作用:DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。

RequestMapping映射请求方式

映射请求参数、请求方法或请求头
1)@RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求

2)@RequestMapping 的 value【重点】、method【重点】、params【了解】 及 heads【了解】 分别表示请求 URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。

3)params 和 headers支持简单的表达式:
param1: 表示请求必须包含名为 param1 的请求参数
!param1: 表示请求不能包含名为 param1 的请求参数
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1

RequestMapping映射请求参数&请求头
//了解: 可以使用 params 和 headers 来更加精确的映射请求. params 和 headers 支持简单的表达式.
@RequestMapping(value="/testParamsAndHeaders",
params= {"username","age!=10"}, headers = { "Accept-Language=en-US,zh;q=0.8" })
public String testParamsAndHeaders(){
System.out.println("testParamsAndHeaders...");
return "success";
}
RequestMapping支持Ant 路径风格

1)Ant 风格资源地址支持 3 种匹配符:【了解】

?:匹配文件名中的一个字符
*:匹配文件名中的任意字符
**:** 匹配多层路径

2)@RequestMapping 还支持 Ant 风格的 URL:

/usercreateUser
匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL

/user/createUser??
匹配 /user/createUseraa、/user/createUserbb 等 URL
RequestMapping映射请求占位符PathVariable注解

@PathVariable
带占位符的URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义。

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:
URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到 *** 作方法的入参中。

测试代码
package com.springMVC;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
//@RequestMapping("/mvc")
public class TestController {//POJO:普通java类
    
    @RequestMapping(value = "/hello",
            headers= {"Accept-Language=zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"} )
    public String respondhelloget() {
        System.out.println("success");
        return "success";
    }
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    public String respondhellopost() {
        System.out.println("success");
        return "success";
    }

    
    @RequestMapping(value="testAnt")
    public String testAnt() {
        System.out.println("SUCCESS:testAnt");
        return "success";
    }

    
    @RequestMapping("/testREST/{id}/{username}")
    public String testREST(@PathVariable("id")Integer id, @PathVariable("username")String username) {
        System.out.println("id:"+id+",username="+username);
        return "success";
    }
}
REST

REST是什么?
1)REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用

2)URL风格
示例:
/order/1 HTTP GET :得到 id = 1 的 order gerOrder?id=1
/order/1 HTTP DELETE:删除 id = 1的 order deleteOrder?id=1
/order HTTP PUT:更新order
/order HTTP POST:新增 order
扩展: 开放平台 支付功能: 你应该发送什么URL ,需要传递什么参数, 需要有哪些验证 ,响应哪些数据.

3)HiddenHttpMethodFilter
浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不
支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使
得支持 GET、POST、PUT 与 DELETE 请求。

HiddenHttpMethodFilter过滤器源码分析
1)为什么请求隐含参数名称必须叫做”_method”

2)hiddenHttpMethodFilter 的处理过程


测试代码:
1)配置HiddenHttpMethodFilter过滤器


HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter


HiddenHttpMethodFilter

@RequestMapping(value="/testRESTGet/{id}",method=RequestMethod.GET)
public String testRESTGet(@PathVariable(value="id") Integer id){
System.out.println("testRESTGet id="+id);
return "success";
}
 
@RequestMapping(value="/testRESTPost",method=RequestMethod.POST)
public String testRESTPost(){
System.out.println("testRESTPost");
return "success";
}
 
@RequestMapping(value="/testRESTPut/{id}",method=RequestMethod.PUT)
public String testRESTPut(@PathVariable("id") Integer id){
System.out.println("testRESTPut id="+id);
return "success";
}
 
@RequestMapping(value="/testRESTDelete/{id}",method=RequestMethod.DELETE)
public String testRESTDelete(@PathVariable("id") Integer id){
System.out.println("testRESTDelete id="+id);
return "success";
}

3)请求链接

testREST GET

处理请求数据(后端接收前端页面发送的数据) @RequestParam注解

1)在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法
2)value:参数名
3)required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
4)defaultValue: 默认值,当没有传递参数时使用该值
实验代码
1)增加控制器方法

@RequestMapping(value="/testRequestParam")
public String testRequestParam(
@RequestParam(value="username") String username,
@RequestParam(value="age",required=false,defaultValue="0") int age){
System.out.println("testRequestParam - username="+username +",age="+age);
return "success";
}

2)增加页面链接

testRequestParam
@RequestHeader 注解

1)使用 @RequestHeader 绑定请求报头的属性值
2)请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中

实验代码

//了解: 映射请求头信息 用法同 @RequestParam
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){
System.out.println("testRequestHeader - Accept-Language:"+al);
return "success";
}
testRequestHeader
@cookievalue 注解

1)使用 @cookievalue 绑定请求中的 cookie 值
2)@cookievalue 可让处理方法入参绑定某个 cookie 值

实验代码
1)增加控制器方法

//了解:@cookievalue: 映射一个 cookie 值. 属性同 @RequestParam
@RequestMapping("/testcookievalue")
public String testcookievalue(@cookievalue("JSESSIONID") String sessionId) {
System.out.println("testcookievalue: sessionId: " + sessionId);
return "success";
}

2)增加页面链接

testcookievalue
使用POJO作为参数

1)使用 POJO 对象绑定请求参数值
2)Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等

实验代码:
1)增加控制器方法、表单页面

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


2)增加实体类

package com.atguigu.springmvc.entities;
public class Address {
private String province;
private String city;
//get/set
}
package com.atguigu.springmvc.entities;
public class User {
private Integer id ;
private String username;
private String password;
private String email;
private int age;
private Address address;
//get/set 
}

3)执行结果:

4)如果中文有乱码,需要配置字符编码过滤器,且配置其他过滤器之前,
如(HiddenHttpMethodFilter),否则不起作用。(思考method=”get”请求的乱码问题怎么解决的)

	
		encodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
		encodingFilter
		
@RequestMapping("/testServletAPI")
public void testServletAPI(HttpServletRequest request,HttpServletResponse response, Writer out) throws IOException {
System.out.println("testServletAPI, " + request + ", " + response);
out.write("hello springmvc");
//return "success";
}
testServletAPI
处理响应数据(后端处理设置前端页面数据)

javaWEB: request.setAttribute(xxx) request.getRequestDispatcher(“地址”).forward(req,resp);

SpringMVC 输出模型数据概述

提供了以下几种途径输出模型数据
1)ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
2)Map 或 Model: 入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。

处理模型数据之 ModelAndView

1、ModelAndView介绍
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数
据信息。
1)两个重要的成员变量:
private Object view; 视图信息
private ModelMap model; 模型数据
3)添加模型数据:
MoelAndView addObject(String attributeName, Object attributevalue) 设置模型数据
ModelAndView addAllObject(Map modelMap)
4)设置视图:
void setView(View view) 设置视图对象
void setViewName(String viewName) 设置视图名字

5)获取模型数据
protected Map getModelInternal() 获取模型数据
public ModelMap getModelMap()
public Map getModel()

实验代码:

@RequestMapping(value="/param", method=RequestMethod.POST)
	public ModelAndView param() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("username", "root");//往request作用域中放值
		mav.setViewName("success");//设置视图名称,实现页面跳转
		return mav;
	}

success.jsp


	成功
	
${requestScope.username }
处理模型数据之 Map Model

1、Map介绍
1)Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据
具体使用步骤
2)Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
3)如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
4)在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据

实验代码:

@RequestMapping(value="/param", method=RequestMethod.POST)
	public String param(Map map) {
		map.put("username", "admin");//向作用域中放值
		return "success";//返回视图名称
	}
	@RequestMapping(value="/param", method=RequestMethod.POST)
	public String param(Model model, String username) {
		System.out.println(username);
		model.addAttribute("username", "张三");//向作用域中放值
		return "success";//返回视图名称
	}

总结:根据ModelAndView源码调试,不管使用以下那种方式,最终都会把model数据和view数据封装到一个ModelAndView中

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5684001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存