SpringMVC注解解析和项目配置


1:@RequestMapping注解 

作用:用于建立请求 URL 和处理请求方法之间的对应关系

位置:

  类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录

  方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径

属性:

  value:用于指定请求的URL。它和path属性的作用是一样的

  method:用于指定请求的方式

  params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样    

例如:

  params = {"accountName"},表示请求参数必须有accountName

  params = {"moeny!100"},表示请求参数中money不能是100

    @RequestMapping(value = "/quick",method = RequestMethod.GET,params = {"name"})  指定我们的url是/quick,请求是get请求,必须携带参数name

 @RequestMapping在设置url地址的时候,既可以使用value也可以使用path,但是通常也都是省略不写

 

 

@RequestMapping()也可以做用在类上和方法搭配使用,搭配使用时候访问的url就要加上做用在类上的路径,并且返回的页面信息是要绝对路径的地址不能是相对路径

@Controller
@RequestMapping("user")// 指定这个类下的所有的方法都是的访问路径前都是/user下的
public class QuickController {

    @RequestMapping("/quick")  //  localhost:8080/user/quick
    public String save(){
        return "/success.jsp";
    }  // 因为是找到相对路径,我们是在quick的相对路径就是/user下的success.jsp ,所以要使用绝对路径就要在success.jsp前加上/
}

以上面为例我们在类上也制定了@RequestMapping之后访问的url必须是:http://localhost:8080/user/quick 然后返回的jsp的界面必须前面加上 / 是绝对路径,不然就是404

 上面的报错就是未在返回的界面时候声明绝对路径的路径,所以当是地址嵌套时要使用绝对路径返回的

配置视图解析器可以杜绝这个错误

mvc命名空间的引入:

命名空间:xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
约束地址:http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd

SpringMvc的组件扫描

SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中,如果使用@Controller注解标注的话,
就需要使用package=“com.itheima.controller"/>进行组件扫描。

    <context:component-scan base-package="com.springMvc">
        <context:include-filter type="annotation" expression="com.springMvc.Controller"/>

    context:component-scan>

springMvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
">


    <context:component-scan base-package="com.springMvc">
        <context:include-filter type="annotation" expression="com.springMvc.Controller"/>

    context:component-scan>

SpringMVC的XML配置解析

SpringMVC有默认组件配置,默认组件都是DispatcherServlet.properties配置文件中配置的,该配置文件地址org/springframework/web/servlet/DispatcherServlet.properties,该文件中配置了默认的视图解析器,如下:

 org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver 

翻看该解析器源码,可以看到该解析器的默认设置,如下:

REDIRECT_URL_PREFIX = "redirect:"  --重定向前缀
FORWARD_URL_PREFIX = "forward:"    --转发前缀(默认值)
prefix = "";     --视图名称前缀
suffix = "";     --视图名称后缀

我们不仅仅可以在@requestMapping中限定请求的参数,我们也就可以在@RequestParam注解中限定请求的参数

@RequestParam 

作用: 仅仅只在方法上使用作用在方法的参数框内

@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

语法:

语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
 
value:参数名
 
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
 
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

比如我们想要接受一个参数并且限制这个参数不为空,就可以在对应的方法框内进行此注解的使用

必须传递参数

    @RequestMapping(path = "/quickTen")
    @ResponseBody
    public void quick9(@RequestParam(required = true) String name){  //指定请求必须有参数name,这个参数不可以为空
        System.out.println(name);
    }

上面访问不传递参数就会报错:

required = false可以不用传递此参数
    @RequestMapping(path = "quickEleven")
    @ResponseBody
    public void quick10(@RequestParam(required = false) String name){  //指定参数可以为空,不传name这个参数也不报错
        System.out.println(name); //null
    }
defaultValue和required = true 一起使用required = true 会失效,自动改为false
    @RequestMapping(path = "/quickTwelve")
    @ResponseBody
    public void quick11(@RequestParam(required = true,defaultValue = "老王") String name){//前面限定不能为空,但是后面加了默认值,限定的required = true就失效了,改为false
        System.out.println(name);
    }

视图解析器:

prefix :前缀 
suffix: 后缀
  你的java代码的返回值会和前缀和后缀的内容进行拼接返回
 

我们可以通过属性注入的方式修改视图的的前后缀

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views"/> 
        <property name="suffix" value=".jsp"/>  
    bean>

界面返回设置:

   我们在类中进行界面的返回的时候一般都是返回这个前端界面的全称例如:"xxx.jsp"或者"xxx.html" ,我们可以在xml中设置:InternalResourceViewResolver 类的参数来设置

  如果我们想只想写返回界面的名称不指定路径和界面后缀名 可以这样设置

springMvc.xml

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/> 
        <property name="suffix" value=".jsp"/>  
    bean>

java代码

@Controller
@RequestMapping("user")// 指定这个类下的所有的方法都是的访问路径前都是/user下的
public class QuickController {

    @RequestMapping("/quick")  //  localhost:8080/user/quick
    public String save(){
        return "success";
    }  // 因为我们的配置文件中设置了 
}

SpringMVC的相关组件

前端控制器:DispatcherServlet

处理器映射器:HandlerMapping

处理器适配器:HandlerAdapter

处理器:Handler

视图解析器:View Resolver

视图:View

SpringMVC的注解和配置

请求映射注解:@RequestMapping

视图解析器配置:

REDIRECT_URL_PREFIX = "redirect:"  

FORWARD_URL_PREFIX = "forward:"    

prefix = "";     

suffix = "";