携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解* @RequestMapping注解*,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan
@RequestMapping注解
@RequestMapping注解出现的位置
@RequestMapping注解注解定义了处理器对于请求的映射规则。该注解可以定义在【类上】,也可以定义在【方法上】,但是含义不同
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
一个Controller所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的URL是不同的。这些不同的URL被指定在注解于方法之上的@RequestMapping的value的属性中。但若这些请求具有相同的URL部分,则这些相同的URL,可以被抽取到注解在类上的RequestMapping的value属性中。此时的这个URL表示模块的名称。URL的请求是相对于Web的根目录。在类的级别上的注解会将一个特定的请求或者请求模式映射到一个控制器上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。
示例:
package com.jinhuan.controller;
import com.jinhuan.service.TeamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
/**
* @Author jinhuan
* @Date 2022/7/14 8:08
* Description:
*/
@Controller
@RequestMapping("team")
public class TeamController {
@Autowired
private TeamService teamService;
@RequestMapping(value = "add.do")
public ModelAndView addTeam(){
System.out.println("TeamController---addTeam()-----");
ModelAndView mv = new ModelAndView();
mv.setViewName("team/add");
return mv;
}
@RequestMapping(value = "update.do")
public ModelAndView updateTeam(){
System.out.println("TeamController---updateTeam()-----");
ModelAndView mv = new ModelAndView();
mv.setViewName("team/update");
return mv;
}
@RequestMapping("/hello.do")
public ModelAndView add(){
System.out.println("TeamController---add()-----");
teamService.add();
ModelAndView modelAndView = new ModelAndView();
//相当于request.setAttribute(key,value);
modelAndView.addObject("teamName","森林狼");
//未来经过SpringMVC的视图解析器处理然后转换成物理资源路径,相当于 request.getResuestDispatcher("index.jsp").forward();
modelAndView.setViewName("index");
//经过InternalResourceViewResolver这个对象的处理之后,加上了前后缀就变成了 /jsp/index.jsp
return modelAndView;
}
}
指定请求递交方式
@RequestMapping的method属性,用来对被注解方法所处理的请求的提交方式进行限制,即只有满足method属性指定的提交请求方式,才会执行该被注解方法。 method属性的取值为RequestMapping枚举常量。常用的为RequestMethod.GET与RequestMethod.POST,分别表示提交的匹配规则为GET与POST提交。
URL-pattren
URL-pattren解析
在web.xml配置SpringMVC的前端控制器时有这个节点。这个节点中的值一般有两种写法:
1、 .do 在没有特殊要求的情况下,springmvc的前端控制器DispatcherServlet常使用后缀匹配的方式进行拦截,可以写为.do 、 *.action、 *.mvc等,表示对以此为结尾的请求进行拦截 2、 / 写为/表示拦截所有的请求,但是这样的话DispatcherServlet会将静态资源也进行拦截,比如css、js、图片等资源的获取请求时,也会被当做一个普通的Controller进行拦截。前端控制器会调用处理器的映射器为其查找相应的处理器【无处理器!!】,所以这样的话所有的静态资源均会报404错误
栗子
在index.jsp页面添加一张图片,如果节点中的值为*.do,图片可以正常访问,但是如果为 / 就不能访问。 1、项目中添加图片,同时修改index.jsp页面
2、修改web.xml
3、此时访问就会只显示中文“女仆”
4、正常显示为:
5、静态资源访问
那么按照上面的方式进行拦截后如何获取静态资源的访问呢?
1、使用 mvc:default-servlet-handler/
在springmvc的配置文件中添加如下内容
<mvc:default-servlet-handler/>
<!--声 明 了 <mvc:default-servlet-handler /> 后 ,springmvc框架会在容器中创建DefaultServletHttpRequestHandler处理器对象。该对象会对所有进入 DispatcherServlet的URL进行检查。如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet 处理。一般的服务器都有默认的 Servlet。例如咱们使用的Tomcat服务器中,有一个专门用于处理静态资源访问的 Servlet 名叫 DefaultServlet。其<servlet-name/>为default。可以处理各种静态资源访问请求。该Servlet注册在 Tomcat 服务器的 web.xml 中。在 Tomcat安装目录/conf/web.xml。-->
2 使用 < mvc:resources/ >
在springmvc的配置文件中添加如下内容
<mvc:resources location="/images/" mapping="/images/**" />
<!-- location: 表示静态资源所在目录。
当然,目录不要使用/WEB-INF/及其子目录。
mapping: 表示对该资源的请求。注意,后面是两个星号**。-->
在 Spring3.0 版本后,Spring 定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了< mvc:resources/ >标签,专门用于解决静态资源无法访问问题。