首页 > 其他分享 >SpringMVC - 进阶

SpringMVC - 进阶

时间:2024-08-17 21:55:35浏览次数:12  
标签:default RequestMapping name SpringMVC response String public 进阶

1. Controller & RequestMapping

@Controller用来标注在类上,表示这个类是一个控制器类,可以用来处理http请求,通常会和@RequestMapping一起使用。这个注解上面有@Component注解,说明被@Controller标注的类会被注册到spring容器中,value属性用来指定这个bean的名称

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

@RequestMapping表示请求映射,一般用在我们自定义的Controller类上或者Controller内部的方法上。

通过这个注解指定配置一些规则,满足这些规则的请求会被标注了@RequestMapping的方法处理。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    /**
     * 限制url
     */
    @AliasFor("path")
    String[] value() default {};

    /**
     * 限制url
     */
    @AliasFor("value")
    String[] path() default {};

    /**
     * 限制http请求的method
     */
    RequestMethod[] method() default {};

    /**
     * 限制请求的参数
     */
    String[] params() default {};

    /**
     * 限制请求头
     */
    String[] headers() default {};

    /**
     * 限制Content-Type的类型(客户端发送数据的类型)
     */
    String[] consumes() default {};

    /**
     * 限制Accept的类型(客户端可接受数据的类型)
     */
    String[] produces() default {};
}

可以简化@RequestMapping的注解如下:

注解

相当于

@PostMapping

@RequestMapping(method=RequestMethod.POST)

@GetMapping

@RequestMapping(method=RequestMethod.GET)

@DeleteMapping

@RequestMapping(method=RequestMethod.DELETE)

@PutMapping

@RequestMapping(method=RequestMethod.PUT)

 2. 接收请求中的参数

1. 通过注解获得参数值

@PathVariable可以接受url中的参数

@RequestParam接收url中get的参数或者form表单中的参数

还可以接收Servlet中的对象:HttpServletRequest、HttpServletResponse、HttpSession

看下面这个事例:

@RequestMapping("/test/{id}")
public void test2(@PathVariable("id") String id,
                    @RequestParam("name") String name,
                    HttpServletRequest request,
                    HttpServletResponse response,
                    HttpSession session) throws IOException {
    String message = String.format("id=%s, name=%s, age=%s"
            , id, name, request.getParameter("age"));
    response.getWriter().println(message);
}

 2. 通过对象接收参数

事例如下:

@Data
@ToString
public class User {
    private String name;
    private String age;
}

@RequestMapping("/test3")
public void test3(User user, HttpServletResponse response) throws IOException {
    response.getWriter().println(user);
}

3. 通过@RequestBoy接收请求的json数据

需求添加jackson包的依赖

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.15.2</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.15.2</version>
</dependency>

确保Spring配置文件包括如下配置

<mvc:annotation-driven />

示例代码:

@RequestMapping(value = "/test4", method = RequestMethod.POST)
public void test4(@RequestBody User user, HttpServletResponse response) throws IOException {
    response.getWriter().println(user);
}

通过fiddler测试如下:

4. 通过MutlipartFile接收上传的文件

增加maven依赖

<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.4</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

定义multipartResover

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSizePerFile" value="#{10*1024*1024}"/>
    <property name="maxUploadSize" value="#{100*1024*1024}"/>
</bean>

示例代码如下:

@RequestMapping(value = "/test5", method = RequestMethod.POST)
public void test5(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws IOException {
    InputStream inputStream = file.getInputStream();
    String s = IOUtils.toString(inputStream, "utf-8");
    response.getWriter().println(s);
}

通过fiddler测试如下:

 

4. 其它注解

接收Http Header的内容@RequestHeader

接收cookie的内容@CookieValue

@RequestAttribute以及@SessionAttribute

事例:

@GetMapping("/test7")
public String test7(HttpServletRequest request,
                    HttpSession session){
    request.setAttribute("age", "25");
    session.setAttribute("hobby", "reading");
    return "forward:/test6";
}

@RequestMapping("/test6")
public void test6(@RequestHeader("User-Agent") String userAgent,
                                 @CookieValue("name") String name,
                                 @RequestAttribute("age") String age,
                                 @SessionAttribute("hobby") String hobby,
                                HttpServletResponse response) throws IOException {
    String message = String.format("userAgent=%s, name=%s, age=%s, hobby=%s"
            , userAgent, name, age, hobby);
    response.getWriter().println(message);
}

fidder发起请求:

 3. 常见返回值

1. 返回ModelAndView

首先配置viewResolver,如下:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

代码如下:

@GetMapping("/test")
public ModelAndView test(){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("message", "hello");
    modelAndView.setViewName("hello");
    return modelAndView;
}

hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

示例请求:

 2. 返回视图名称

示例代码:

@GetMapping("/test2")
public String test2(Model model){
    model.addAttribute("message", "hello2");
    return "hello";
}

 3. redirect以及forward重定向

@GetMapping("/test3")
public String test3(){
    return "redirect:/example/test2";
}

@GetMapping("/test4")
public String test4(){
    return "forward:/example/test2";
}

4. 通过@ResponseBody返回Json字符串

前提也是引入jackson的maven依赖

@GetMapping("/test5")
@ResponseBody
public User test5(){
    User user = new User();
    user.setName("Mike");
    user.setAge("28");
    return user;
}

测试结果如下:

 @ResponseBody可以放到Controller上面,这样所有方法的返回就可以返回Json数据了,Spring还提供了简化的注解@RestController

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

5. 没有返回或者返回null

@GetMapping("/test1")
public void test(){
}
@GetMapping("/test2")
public Object test2(){
    return null;
}

springmvc调用这些方法之后,请求就结束了,springmvc会认为在控制器的方法中响应已经被处理过了,不需要springmvc去处理了。

应用场景:当响应结果比较复杂的时候,springmvc无法处理这些响应结果的时候,我们可以在控制器的方法中使用response来主动控制输出的结果。比如下载文件、断点下载文件等比较复杂的响应,此时我们可以在处理器的方法中使用HttpServletResponse来自己控制输出的内容

标签:default,RequestMapping,name,SpringMVC,response,String,public,进阶
From: https://blog.csdn.net/mjb709/article/details/141287323

相关文章

  • 二叉树进阶之二叉搜索树:一切的根源
    前言:在学完了简单的容器与C++面向对象的三大特性之后,我们首先接触的就是map与set两大容器,但是这两个容器底层实现的原理是什么呢?我们不而知,今天,主要来为学习map与set的底层原理而打好基础,而二叉搜索树,则是一切的开端......一、二叉搜索树的定义与性质1.1、什么是二叉搜索树:......
  • 【C++进阶学习】第十三弹——C++智能指针的深入解析
    前言:在C++编程中,内存管理是至关重要的一个环节。传统的手动内存管理方式容易导致内存泄漏、悬挂指针等问题。为了解决这些问题,C++引入了智能指针。本文将详细讲解C++中智能指针的概念、种类、使用方法以及注意事项。目录一、引言二、智能指针的原理及目的2.1智能指针......
  • Kettle PDI小白新手/进阶/必备 大数据基础之一数据清洗(ETL)基础进阶总结 1.6万字长文
    Kettle是一个开源的数据集成工具,主要用于ETL(抽取、转换、加载)过程。它的全名是PentahoDataIntegration(PDI),而Kettle是其早期的名字,Kettle在2006年被Pentaho收购后,正式更名为PentahoDataIntegration(PDI),因此现在更常被称为PDI。PDI仍然是Pentaho产品套件中的一个重要......
  • SpringMVC处理请求头、响应头、编码行为
    基本知识http协议中,请求行、请求头部分都是采用的ascii编码,是不支持中文的,若携带不支持的字符,需要使用进行编码,比如常见的urlEncode。而请求体是支持任意编码的,通过Content-Type请求头的charset部分来告知服务端请求体使用何种方式编码。响应行、响应头、响应体亦如是。Content......
  • SpringMVC 扩展
    SpringMVC扩展1.RESTFul风格RESTFul是一种基于HTTP和标准化设计原则的软件架构风格,用于设计和实现可靠、可扩展和易于集成的Web服务和应用程序。要求:每一个URI代表一种资源,是名词,也就是url中不要带动作客户端使用GET、POST、PUT、DELETE表示操作方式的动词对......
  • HBase学习的第五天--HBase进阶结尾和phoenix开头
    HBase进阶下一、HBase的读写流程1.1 HBase读流程Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeeper中获取一个hbase:meta表位置信息,被哪一个regionserver所管理着hbase:meta表:hbase的元数据表,在这个表中存储了自定义表相关的元......
  • Task3:进阶上分-实战优化
    part1:工具初探一ComfyUI应用场景探索初识ComfyUI什么是ComfyUIGUI是"GraphicalUserInterface"(图形用户界面)的缩写。简单来说,GUI就是你在电脑屏幕上看到的那种有图标、按钮和菜单的交互方式。 ComfyUI是GUI的一种,是基于节点工作的用户界面,主要用于操作图像的生......
  • HBase学习的第四天--HBase的进阶与API
    HBase进阶与API一、Hbaseshell1、Region信息观察创建表指定命名空间在创建表的时候可以选择创建到bigdata17这个namespace中,如何实现呢?使用这种格式即可:‘命名空间名称:表名’针对default这个命名空间,在使用的时候可以省略不写create'hbase01:t1','info'此时使用li......
  • PHP初级栈进阶篇
    小刘小刘,下雨不愁(收藏,关注不迷路)这里我会更新一些php进阶知识点,新手想再进一步可以有个方向,也有个知识图谱的普及当然本篇不止写技术 会涉及一些进阶路线我也是在这里积累,希望和同行者一起进步为后来者少走些弯路你说。。。咋就需要学这么多那前端go linux 分布......
  • Scrapy框架进阶攻略:代理设置、请求优化及链家网实战项目全解析
    scrapy框架加代理付费代理IP池middlewares.py#代理IP池classProxyMiddleware(object):proxypool_url='http://127.0.0.1:5555/random'logger=logging.getLogger('middlewares.proxy')asyncdefprocess_request(self,request,spider):......