• SpringMVC之注解RequestMapping


    一、@RequestMaapping的基本介绍

                @RequestMaapping的功能就是将请求和处理请求和处理请求的控制器关联起来,建立映射关系,当DispathcerServlet接收到请求,会从Controller中找对应的方法来处理该请求。

    eg:

    1. @Controller
    2. @RequestMapping("/test")
    3. public class TestRequestMappingController {
    4. @RequestMapping("/hello")
    5. public String hello(){
    6. return "success";
    7. }
    8. }

    当浏览器中的请求是url/test,此时服务器端通过dispatcherservlet处理之后从此项目的配置文件中寻找控制器中与之对应的路径。

    1、位置

    可以放在类上也可以放在方法上:

            放在类上声明就是请求路径的初始信息

            放在方法上声明就是请求路径的具体信息

    比如上面的例子,当想要实现hello页面的时候,具体的路径应为:url/test/hello,而不是url/hello。

      <a th:href="@{/test/hello}">测试RequestMappinga><br/>

    2、属性

            该注解中还有几个属性,这里只说说:value、method

            Value:

            其就是通过value属性的值匹配请求地址中的url。相当于

    1.  @RequestMapping(
    2.         value = {"/testRequestMapping", "/test"}
    3.         )

            method:

            与请求中的请求方式进行匹配,当满足时才可以调用对应的方法。

    1. @RequestMapping( value = {"/testRequestMapping", "/test"},
    2. method = {RequestMethod.GET, RequestMethod.POST} )

    3、占位符

            之后在SpringMVC中路径都是以RestFul的形式发送:
           
     原始方式:/deleteUser?id=1
     rest方式: /user/delete/1
            即就是不通过“?”来作为路径和属性了分割的标志了。所以对应的映射需要重新设置为如下格式:
            通过@PathVariable注解将请求中的数据赋给形参了。
    <a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testResta><br>
    1. @RequestMapping("/testRest/{id}/{username}")
    2. public String testRest(@PathVariable("id") String id,
    3. @PathVariable("username") String username)
    4. { System.out.println("id:"+id+",username:"+username); return "success"; }

    当我们想要从一个页面上直接访问到一个特定的信息中可以用此方法。

    比如QQ空间这类项目,在我们的空间中想要访问到指定好友的空间,就需要点击一些图片类的超链接,然而超链接中就有这些数据,我们只需要想办法接收即可。

    二、获取请求参数

    1、通过ServletAPI获取(老方法)

    1. <form th:action="@{/param/servletAPI}" method="get">
    2. 用户名:<input type="text" name="username"><br/>
    3. 密码:<input type="password" name="password"><br/>
    4. <input type="submit" value="登录"><br/>
    5. form>
    1. @RequestMapping("/param/servletAPI")
    2. public String getParamByServletAPI(HttpServletRequest request){
    3. String username = request.getParameter("username");
    4. String password = request.getParameter("password");
    5. System.out.println("username:"+username+",password:"+password);
    6. return "success";
    7. }

    2、通过控制器方法的形参直接获取        

    1. @RequestMapping("/param")
    2. public String getParam(@RequestParam(value = "userName",required = false,defaultValue = "hello") String username, String password){
    3. System.out.println("username:"+username+",password:"+password);
    4. return "success";
    5. }

            最简单的时候,我们都不需要设置@RequestParam这个注释来处理。只将控制器方法中的i形参和发送过来数据的name一致就能匹配上。

            @RequestParam是为了处理方法中的形参和name值不一致的时候,我们手动设置。

            value:请求中的name,具体指要将哪个值赋予方法中的形参。

            Required:指是否需要有值,当为true的时候,若没有值传过来就会报错。

            dafalueValue:是指当没有对应的值在请求中时我们赋予的默认参数,不管required的值时啥。只要没有值,就默认赋值。

    3、通过pojo类获取

            这个很简单,只需要请求中的参数和参数名一一匹配即可。

    1. @RequestMapping("/param/pojo")
    2. public String getParamByPojo(User user){
    3. System.out.println(user);
    4. return "success";
    5. }

    4、处理乱码的问题:

            需要有一个认知:最初只有serlvet的时候,我们都是通过Servlet的API:charactersetEncoding这段代码,放在代码的最初,来设置字符类型。但在SpringMVC下,我们的dispatcherServlet会处理所有的请求然后在通过配置文件扫描到我们对应的控制器中,然后匹配对应的方法。所以请求信息中有参数的时候,如果我们在方法里设置字符类型,已经不起作用了(因为已经接收到了,就差赋值给形参这一步了)。所以我们需要在web.xml配置文件中早早的设置这个字符类型。

            通过过滤器的方式来设置的:

    1. <filter>
    2. <filter-name>CharacterEncodingFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>UTF-8param-value>
    7. init-param>
    8. <init-param>
    9. <param-name>forceEncodingparam-name>
    10. <param-value>trueparam-value>
    11. init-param>
    12. filter>
    13. <filter-mapping>
    14. <filter-name>CharacterEncodingFilterfilter-name>
    15. <url-pattern>/url-pattern>
    16. filter-mapping>

    三、域对象共享数据

    现在只需要处理三个域类型即可,把page删了。

    1、请求域:

            方法一:通过ServletAPI

    1. @RequestMapping("/testServletAPI")
    2. public String testServletAPI(HttpServletRequest request)
    3. { request.setAttribute("testScope", "hello,servletAPI");
    4. return "success"; }

            方法二:使用ModelAndView(也是SpringMVC底层的代码)

    1. @RequestMapping("/test/mav")
    2. public ModelAndView testMAV(){
    3. /*
    4. * modelAndView 包含model和view功能
    5. * model:向请求域中共享数据
    6. * view:设置逻辑视图实现页面跳转
    7. * */
    8. ModelAndView mav = new ModelAndView();
    9. //向请求域中共享数据
    10. mav.addObject("testRequestScope","hello.modelandView");
    11. //设置逻辑视图
    12. mav.setViewName("success");
    13. return mav;
    14. }

            方法三:使用Model(其实也是方法二的子类(或者是实现类))

    1. @RequestMapping("/test/model")
    2. public String testModel(Model model){
    3. model.addAttribute("testRequestScope","hello,model");
    4. return "success";
    5. }

    2、Session和Application

            这两个一样,都是通过ServletAPI中的方法即可(老师讲说这个最简便)

    1. @RequestMapping("/testSession")
    2. public String testSession(HttpSession session)
    3. { session.setAttribute("testSessionScope", "hello,session");
    4. return "success"; }
    5. @RequestMapping("/testApplication")
    6. public String testApplication(HttpSession session)
    7. {
    8. ServletContext application = session.getServletContext(); application.setAttribute("testApplicationScope", "hello,application");
    9. return "success"; }

  • 相关阅读:
    Python 08学习之文件操作
    Intellij IDEA2021.1创建Java web项目(超详细)
    每天一道算法题(七)——求一个数组中最多能存储多少雨水(困难)
    一级缓存和二级缓存在Mybaits和操作系统中分别指什么
    Socks5代理、IP代理与网络安全:保护你的爬虫和隐私
    C++11之继承构造函数(using 声明)
    SqlBulkCopy与临时表、普通Sql操作配合使用
    卡尔曼滤波算法的五大核心公式含义
    WINDOWS与LINUX的文件文件共享
    浅谈阶与原根
  • 原文地址:https://blog.csdn.net/weixin_42196338/article/details/126333902