SpringMvc

SpringMvc

1.配置前端控制器
在这里插入图片描述2.创建Controller
在这里插入图片描述3.配置Controller
在这里插入图片描述二、SpringMvc注解使用
1 注解介绍
1.1@Controller
@Controller 注解用于指定 Bean 对象为控制器。
1.2@RequestMapping
@RequestMapping 用于将一个 URI 绑定到类上或类的方法中。
2.步骤
2.1:配置前端控制器
在这里插入图片描述2.2:.创建控制器
在这里插入图片描述2.3:配置注解扫描:
在这里插入图片描述2.4:配置注解驱动:
添加mvc命名空间
在这里插入图片描述
配置注解驱动:
在这里插入图片描述

****三:springmvc获取参数:****
3.1:在 Servlet 中我们通过 request.getParameter(name)方法获取请求参数。该方式存在

两个问题:
请求参数较多时会出现代码冗余的显现。
与容器紧耦合。

3.2:在 SpringMVC 中可以使用 HttpServletRequest 对象获取请求数据,同时还提供了参数注入的方式用于获取请求数据。

SpringMVC 参数注入的优点:
 简化参数接收形式(不需要调用任何方法。需要什么参数, 就在控制器方法中提供
什么参数)。
 参数类型不需要自己转换了。如果类型不符会抛出 400 异常。
 可将参数自动封装为对象。
 如果没有该参数对应的数据,可为该参数指定默认值。

3.3:通过 HttpServletRequest 对象获取请求数据

```java
```/**
* 通过 HttpServletRequest 对象获取请求参数
* @return
*/
@RequestMapping("/getData")
public ModelAndView getRequestParameter(HttpServletRequestrequest){
String username = request.getParameter("name");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("username",username);
return modelAndView;
}

3.4:通过参数注入获取请求参数

/**
* 通过 SpringMVC 参数注入方式获取请求参数-注入多参数
* @param username
* @param userage
* @return
*/
@RequestMapping("/addUsers")
public ModelAndView addUsers(String username,int userage){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
modelAndView.addObject("age",userage);
return modelAndView;

3.5@RequestParam 注解
@RequestParam:将请求参数绑定到控制器的方法参数上。
value:参数名
required:是否包含该参数,默认为 true,表示该请求路径中必须包含该参数,如果不
包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true 将失效,自动为 false,如果
没有传该参数,就使用默认值

/**
* @RequestParam 使用
* @param username
* @param userage
***加粗样式** @return
*/
@RequestMapping("/addUsers2")
public ModelAndView addUsers2(@RequestParam(value = "name",required
= true,defaultValue = "oldlu") String username,@RequestParam("age")
int userage){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
modelAndView.addObject("age",userage);
return modelAndView;
}

3.6:注入集合参数
在 SpringMVC 请求参数注入中,如果有多请求参数的 name 相同,那么可以使用 String[]或 List 集合来接收请求参数。如果使用的 List 类型需要在该参数前添加@RequestParam 注解,String[]则不需要。

@RequestMapping("/addUsers3")
public ModelAndView addUsers3(String username,@RequestParam
List<String> userlike){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",username);
String temp = "";
for(String str:userlike){
temp+= str+" ";
}
modelAndView.addObject("userlike",temp);
return modelAndView;
}

3.7:注入对象参数
在 SpringMVC 的请求参数注入中,可以使用注入 POJO 方式来接收请求参数。要求:请求参数的 name 必须与 POJO 的属性名相同
创建pojo:

public class Users {
private String username;
private List<String> userlike;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<String> getUserlike() {
return userlike;
}
public void setUserlike(List<String> userlike) {
this.userlike = userlike;
}
}
修改控制器:
@RequestMapping("/addUsers4")
public ModelAndView addUsers4(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("name",user.getUsername());
String temp = "";
for(String str:user.getUserlike()){
temp+= str+" ";
}
modelAndView.addObject("userlike",temp);
return modelAndView;
}

3.8:注入关联对象
SpringMVC 可以根据对象的关联关系实现请求参数的注入。
创建 POJO

public class Address {
private String phonenumber;
private String postcode;
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
@Override
public String toString() {
return "Address{" +
"phonenumber='" + phonenumber + '\'' +
", postcode='" + postcode + '\'' +
'}';
}
}





public class Users {
private String username;
private List<String> userlike;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<String> getUserlike() {
return userlike;
}
public void setUserlike(List<String> userlike) {
this.userlike = userlike;
}
@Override
public String toString() {
return "Users{" +
"username='" + username + '\'' +
", userlike=" + userlike +
'}';
}
}

创建页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="suibian/addUsers5">
用户姓名:<input type="text" name="username"/><br/>
爱好:<br/>
体育<input type="checkbox" value="Sport" name="userlike"/>
音乐<input type="checkbox" value="Music" name="userlike"/>
艺术<input type="checkbox" value="Art" name="userlike"/><br/>
地址:<br/>
电话号码:<input type="text" name="address.phonenumber"/>
邮编:<input type="text" name="address.postcode"/>
<input type="submit" value="OK"/>
</form>
</body>
</html>

修改控制器

@RequestMapping("/addUsers5")
public ModelAndView addUsers5(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
modelAndView.addObject("address",user.getAddress().toString());
return modelAndView;
}

向集合中注入对象
在 SpringMVC 中可以向一个集合属性中注入对象。
在这里插入图片描述

@RequestMapping("/addUsers6")
public ModelAndView addUsers6(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
modelAndView.addObject("address",user.getAddressList());
return modelAndView;
}

Map 集合
在这里插入图片描述
修改控制器

@RequestMapping("/addUsers7")
public ModelAndView addUsers7(Users user){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/index.jsp");
modelAndView.addObject("user",user.toString());
Set<Map.Entry<String,Address>> set =
user.getAddressMap().entrySet();
modelAndView.addObject("address",set);
return modelAndView;

4.1字符编码
在这里插入图片描述Post 请求含有中文乱码解决方案
在这里插入图片描述@RequestMapping
在@RequestMapping 注解中如果并未指定处理请求类型,那么含有该注解的方法既可以处理 GET 类型请求也可以处理 POST 类型的请求。如果需要指定只能处理某种类型的请求,可以通过 method 属性指定请求类型。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

四、SpringMVC 处理响应
4.1:配置视图解析器
在 SpringMVC 中提供了 13 个视图解析器,用于支持不同的视图技术。视图解析器最大
的特点是可以将控制器中处理请求的逻辑和视图中渲染实现解耦。
InternalResourceViewResolver 是 SpringMVC 中默认的视图解析器,用来解析 JSP 视图。能将视图名映射为 JSP 文件。
在这里插入图片描述SpringMVC 作用域传值
在这里插入图片描述
使用视图解析器实现请求转发
在 SpringMVC 的视图解析器中使用的是请求转发方式来实现页面跳转。可以在配置视图
解析器时指定视图的前置与后缀

配置视图解析器
在这里插入图片描述
请求转发
在这里插入图片描述
重定向
在 SpringMVC 需要使用 redirect 关键字实现重定向的跳转。在重定向跳转中是不经过视
图解析器的。
在这里插入图片描述
5.1:静态资源映射
当在 DispatcherServlet 的中配置拦截 “/” 时,除了*.jsp 不会拦截以外,其
他所有的请求都会经过前端控制器进行匹配,此时静态资源,例如*.css、.js、.jpg…… 就会被前端控制器拦截,导致不能访问,出现 404 问题。

1、 通过 DefaultServlet 处理静态资源
在这里插入图片描述
在这里插入图片描述2. 通过 SpringMVC 的静态资源映射器处理静态资源
在这里插入图片描述3.通过<mvc:default-servlet-handler />处理静态资源
在 SpringMVC 的配置文件中配置<mvc:default-servlet-handler />后,会在 Spring MVC 上下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,
它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由DispatcherServlet 继续处理。
在这里插入图片描述
6.SpringMVC 的异常处理
6.1:使用@ExceptionHandler 注解处理异常
在这里插入图片描述6.2使用@ControllerAdvice 和@ExceptionHandler 处理异常
在这里插入图片描述
在这里插入图片描述6.3:使用 SimpleMappingExceptionResolver 处理异常
在这里插入图片描述6.4:自定义 HandlerExceptionResolve 处理器处理异常
在这里插入图片描述
在这里插入图片描述
7.SpringMVC 拦截器
7.1什么是拦截器
Spring MVC 的拦截器(Interceptor)与 Servlet 的过滤器(Filter)类似,它主要用于拦
截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

7.2拦截器执行流程
在这里插入图片描述7.3拦截器和过滤器的区别
 拦截器 SpringMVC 组件,而过滤器是 Servlet 组件。
 拦截器不依赖容器,过滤器依赖容器。
 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用。
 拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不太方便。
7.4定义拦截器
在 Spring MVC 中定义一个拦截器需要对拦截器进行创建和配置。创建拦截器时需要实
现 HandlerInterceptor 接口。
7.5拦截器方法介绍
在 HandlerInterceptor 接口中包含了三个抽象方法,分别表示拦截的时间点。
7.5.1 preHandle 方法
该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true
表示继续向下执行,返回 false 表示中断后续操作。
7.5.2postHandle 方法
该方法在控制器的处理请求方法执行之后、视图解析之前执行,可以通过此方法对请求
域中的模型和视图做进一步的修改。
7.5.3 afterCompletion 方法
该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此
方法实现一些资源清理、记录日志信息等工作。

7.6:拦截器实例

public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("ProHandle: 在处理请求的目标方法执行之前");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView
modelAndView) throws Exception {
System.out.println("postHandle: 目标方法执行后,视图解析器处理视
图之前");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws
Exception {
System.out.println("afterCompletion: 为客户端产生响应之前。");
}
}

7.6.1:配置拦截器
需要在 SpringMVC 的配置文件中,通过 mvc:interceptors 标签配置拦截器。
在这里插入图片描述7.6.2:定义全局拦截器
全局拦截器是指可以拦截所有被控制器所处理 URL。作用等同于/**

public class GlobalInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("Global PreHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView
modelAndView) throws Exception {
System.out.println("Global PostHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws
Exception {
System.out.println("Global AfterCompletion");
}
}

7.6.3:配置全局拦截器
在这里插入图片描述在这里插入图片描述7.6.4:多拦截器执行顺序
如果一个 URL 能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置
文件中配置的上下顺序来决定执行顺序的。先配置谁, 谁就先执行。

7.7:SpringMVC 对 Restful 风格的支持
Restful 简介
REST:Representational State Transfer(表象层状态转变),是一种设计风格。它的主要作用是充分并正确利用 HTTP 协议的特性,规范资源获取的 URI 路径。通俗的讲,RESTful风格的设计允许将参数通过 URL 拼接传到服务端,目的是让 URL 看起来更简洁实用。
传统 URL:http://localhost:8888/user/addUsers?username=oldlu&userage=30
Restful 风格:http://localhost:8888/user/addUsers/oldlu/30
restful 的优点:
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
2 处理 Restful 风格的请求
占位符{}
用于绑定 uri 中的占位符。例如:浏览器请求 uri 是/delete/10 ,在 SpringMVC 处
理请求的方法中,在绑定 uri 时需要用占位符来表示需要获取 uri 中的哪个路径的值。 @RequestMapping("/delete/{id}"),这个{id}就是 uri 占位符。uri 支持占位符是
spring3.0 之后加入的。是 springmvc 支持 restful 风格的一个重要标志。
@PathVaribale
通过 @PathVariable 可以将 uri 中占位符参数绑定到控制器处理方法的入参中。
在这里插入图片描述SpringMVC 常用注解
1 @Controller
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。
2 @RequestMapping
@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有处理请求的方法都是以该地址作为父路径。
value:指定请求的实际地址;
method:指定请求的 method 类型, GET、POST、PUT、DELETE 等;
produces: 指定返回的内容类型;
3 @GetMapping
@GetMapping 是用来指定处理 Get 请求类型的注解。表示该方法只能处理 Get 类型的
请求。
value:指定请求的实际地址;
4 @PostMapping
@PostMapping 是用来指定处理 Post 请求类型的注解。表示该方法只能处理 Post 类型请求。
value:指定请求的实际地址;
5 @PathVariable
@PathVariable 用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri模板中的变量作为参数。
name:指定 uri 模板中的标识名称;
6 @RequestParam
@RequestParam 用于在控制器方法中获取请求参数;
defaultValue: 表示设置默认值;
required:设置是否是必须要传入的参数,类型为 boolean;
name:指定请求参数名称;
7 @RequestBody
@RequestBody 将请求中的 JSON 格式数据转换为 Java 对象;
8 @ResponseBody
@ResponseBody 将响应的对象转换为 JSON 格式数据;
9 @RequestHeader
@RequestHeader 将请求头的数据,映射到处理请求的方法参数上。
name:指定请求头 name;
10 @CookieValue
@CookieValue 注解主要是将请求的 Cookie 数据,映射到处理请求的方法参数上。
name:指定 CookieName;
11 @CrossOrigin
@CrossOrigin 注解用于处理跨域请求访问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值