SpringMVC学习笔记(三)

5. RESTful

5.1 RESTful的实现

HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。

  • GET 用来获取资源
  • POST 用来新建资源
  • PUT 用来更新资源
  • DELETE用来删除资源

REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。
在这里插入图片描述

5.2 HiddenHttpMethodFilter

由于浏览器只支持发送get和post方式的请求,那么该如何发送put和delete请求呢?
SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求
HiddenHttpMethodFilter 处理put和delete请求的条件:

  • 当前请求的请求方式必须为post
  • 当前请求必须传输请求参数_method

在web.xml中注册HiddenHttpMethodFilter

<filter>
  <filter-name>HiddenHttpMethodFilter</filter-name>
  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>HiddenHttpMethodFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

目前为止,SpringMVC中提供了两个过滤器:CharacterEncodingFilter和HiddenHttpMethodFilter。

在web.xml中注册时,必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter。

<!--设置Spring的编码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--设置处理请求方式的过滤器-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

6. SpringMVC处理ajax请求

6.1 @RequestBody

将请求体中的内容和控制器方法的形参进行绑定

6.2@RequestBody获取json格式的请求参数

使用@RequestBody注解将json格式的请求参数转换为java对象

  • a>导入jackson的依赖
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.1</version>
</dependency>
  • b>在SpringMVC的配置文件中设置<mvc:annotation-driven />
  • c>在处理请求的控制器方法的形参位置,直接设置json格式的请求参数要转换的java类型的形参,使用@RequestBody注解标识即可
//将json格式的数据转换为map集合
@RequestMapping("/test/RequestBody/json")
public void testRequestBody(@RequestBody Map<String, Object> map,
HttpServletResponse response) throws IOException {
  System.out.println(map);
  //{username=admin, password=123456}
  response.getWriter().print("hello,axios");
}

6.3 @ResponseBody

将所标识的控制器方法的返回值作为响应报文的响应体响应到浏览器

RequestMapping("/testResponseBody")
public String testResponseBody(){
  //此时会跳转到逻辑视图success所对应的页面
  return "success";
}

@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
  //此时响应浏览器数据success
  return "success";
}

6.4 @ResponseBody响应浏览器json数据

使用@ResponseBody注解响应浏览器json格式的数据

  • a>导入jackson的依赖
  • b>在SpringMVC的配置文件中设置<mvc:annotation-driven />
  • c>将需要转换为json字符串的java对象直接作为控制器方法的返回值,使用@ResponseBody注解标识控制器方法
  • 就可以将java对象直接转换为json字符串,并响应到浏览器
//响应浏览器list集合
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public List<User> testResponseBody(){
  User user1 = new User(1001,"admin1","123456",23,"男");
  User user2 = new User(1002,"admin2","123456",23,"男");
  User user3 = new User(1003,"admin3","123456",23,"男");
  List<User> list = Arrays.asList(user1, user2, user3);
  return list;
}
//响应浏览器map集合
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public Map<String, Object> testResponseBody(){
  User user1 = new User(1001,"admin1","123456",23,"男");
  User user2 = new User(1002,"admin2","123456",23,"男");
  User user3 = new User(1003,"admin3","123456",23,"男");
  Map<String, Object> map = new HashMap<>();
  map.put("1001", user1);
  map.put("1002", user2);
  map.put("1003", user3);
  return map;
}

//响应浏览器实体类对象
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseBody(){
  return user;
}

7. 文件上传和下载

7.1 文件下载

ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。

使用ResponseEntity实现下载文件的功能

RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
IOException {
  //获取ServletContext对象
  ServletContext servletContext = session.getServletContext();
  //获取服务器中文件的真实路径
  String realPath = servletContext.getRealPath("/static/img/1.jpg");
  //创建输入流
  InputStream is = new FileInputStream(realPath);
  //创建字节数组
  byte[] bytes = new byte[is.available()];
  //将流读到字节数组中
  is.read(bytes);
  //创建HttpHeaders对象设置响应头信息
  MultiValueMap<String, String> headers = new HttpHeaders();
  //设置要下载方式以及下载文件的名字
  headers.add("Content-Disposition", "attachment;filename=1.jpg");
  //设置响应状态码
  HttpStatus statusCode = HttpStatus.OK;
  //创建ResponseEntity对象
  ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers,
statusCode);
  //关闭输入流
  is.close();
  return responseEntity;
}

7.2 文件上传

上传步骤:
a>添加依赖

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.1</version>
</dependency>

b>在SpringMVC的配置文件中添加配置:

<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

c>控制器方法:

@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws
IOException {
  //获取上传的文件的文件名
  String fileName = photo.getOriginalFilename();
  //处理文件重名问题
  String hzName = fileName.substring(fileName.lastIndexOf("."));
  fileName = UUID.randomUUID().toString() + hzName;
  //获取服务器中photo目录的路径
  ServletContext servletContext = session.getServletContext();
  String photoPath = servletContext.getRealPath("photo");
  File file = new File(photoPath);
  if(!file.exists()){
    file.mkdir();
 }
  String finalPath = photoPath + File.separator + fileName;
  //实现上传功能
  photo.transferTo(new File(finalPath));
  return "success";
}

8. 基于注解配置SpringMVC

在这里插入图片描述

8.1 创建初始化类,代替web.xml

WebInit:

public class WebInit extends
AbstractAnnotationConfigDispatcherServletInitializer {
  /**
  * 指定spring的配置类
  * @return
  */
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[]{SpringConfig.class};
 }
  /**
  * 指定SpringMVC的配置类
  * @return
  */
  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[]{WebConfig.class};
 }
  /**
  * 指定DispatcherServlet的映射规则,即url-pattern
  * @return
  */
  @Override
  protected String[] getServletMappings() {
    return new String[]{"/"};
 }
  /**
  * 添加过滤器
  * @return
  */
  @Override
  protected Filter[] getServletFilters() {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceRequestEncoding(true);
    HiddenHttpMethodFilter hiddenHttpMethodFilter = new
HiddenHttpMethodFilter();
    return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
 }
}

8.2 创建SpringConfig配置类,代替spring的配置文件

SpringConfig:

@Configuration
public class SpringConfig {
//ssm整合之后,spring的配置信息写在此类中
}

8.3 创建WebConfig配置类,代替SpringMVC的配置文件

WebConfig:

@Configuration
//扫描组件
@ComponentScan("com.atguigu.mvc.controller")
//开启MVC注解驱动
@EnableWebMvc
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 firstInterceptor = new FirstInterceptor();
    registry.addInterceptor(firstInterceptor).addPathPatterns("/**");
 }
 
  //配置视图控制
 
  /*@Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }*/
 
  //配置异常映射
  /*@Override
  public void
configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    SimpleMappingExceptionResolver exceptionResolver = new
SimpleMappingExceptionResolver();
    Properties prop = new Properties();
    prop.setProperty("java.lang.ArithmeticException", "error");
    //设置异常映射
    exceptionResolver.setExceptionMappings(prop);
    //设置共享异常信息的键
    exceptionResolver.setExceptionAttribute("ex");
    resolvers.add(exceptionResolver);
    }*/


  //配置生成模板解析器
  @Bean
  public ITemplateResolver templateResolver() {
    WebApplicationContext webApplicationContext =
ContextLoader.getCurrentWebApplicationContext();
    // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过
WebApplicationContext 的方法获得
    ServletContextTemplateResolver templateResolver = new
ServletContextTemplateResolver(
        webApplicationContext.getServletContext());
    templateResolver.setPrefix("/WEB-INF/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    return templateResolver;
 }
  //生成模板引擎并为模板引擎注入模板解析器
  @Bean
  public SpringTemplateEngine templateEngine(ITemplateResolver
templateResolver) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    return templateEngine;
 }
  //生成视图解析器并未解析器注入模板引擎
  @Bean
  public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setCharacterEncoding("UTF-8");
    viewResolver.setTemplateEngine(templateEngine);
    return viewResolver;
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值