Spring MVC入门

什么是springmvc

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。Spring Web MVC的正式名称来自其源模块(Spring -webmvc)的名称,但它更常见的名称是Spring MVC。

为什么要用Spring MVC

  1. 简化传统servlet处理请求代码
  2. 是spring的一部分,与spring无缝集成
  3. 提供大量API可以直接使用

执行流程分析

在这里插入图片描述

  1. 从浏览器发送请求到服务器,在servlet查找对应的servlet,映射把请求都交给核心控制器DispatcherServlet
  2. DispatcherServlet去springmvc.xml查找请求对应的Controller
  3. DispatcherServlet将请求转发到对应的Controller
  4. Controller中对应的方法区处理请求,并将结果返回给DispatcherServlet,DispatcherServlet再返回给浏览器

url-pattern的写法

url-pattern可以写成任意方法:*.action *.do *.abc
只要配置的url-pattern可以匹配请求就可以将请求转发给DispatcherServlet

一般情况下设置为*.do ,但是现在restful风格越来越流行可以设置url-pattern为/
这样设置之后所有的请求都会交给DispatcherServlet处理,静态资源也会交给DispatcherServlet处理,所以会出现静态资源无法访问的问题

解决方式:

  1. defaultServlet
    打开你的tomcat中conf/web.xml,在这个文件中有一个叫做DefaultServlet的配置,当系统找不到处理某次url请求该交由谁处理的时候,就会交给这个servlet处理。我们可以通过使用这个DefaultServlet来处理静态资源,在你的系统中的web.xml文件中添加下面配置,要添加在DispatcherServlet的前面,这样系统就会将带有下面后缀名的请求交给defaultservlet来处理
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
  1. mvc:default-servlet-handler
<mvc:default-servlet-handler/> 
  1. mvc:resources
  <mvc:resources mapping="/images/**" location="/images/" />
<mvc:annotation-driven/>
如果不加注解驱动会出现404错误

注解的使用

注册扫描器

     <!-- 注册组件扫描器 -->
        <context:component-scan base-package="com.monkey1024.*"/>

@Controller:表示当前类是个Controller
@RequestMapping:表示当前方法为Controller的方法,该方法对执行value的url进行处理和响应。
@RequestMapping(value="/test.do",method = RequestMethod.*):请求的提交方式,*可以是post,get等

params属性:@RequestMapping(value="/test.do" , params={“name” , “age”}) 请求中必须携带name age
@RequestMapping(value="/test.do" , params={"!name" , “age”})
要求请求中必须携带请求参数 age,但必须不能携带参数 name

@RequestMapping(value="/test.do" , params={“name=jack” , “age=23”})
要求请求中必须携带请求参数 name,且其值必须为jack;必须携带参数 age,其值必须为 23

接收表单中的数据

如果表单中传过来的名称和方法参数一致则会直接赋值
Controller方法中参数列表是否需要写request和response,写不写都没有影响,spring mvc会为5个参数自动赋值:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • 请求携带的参数
  • 用于承载数据的Mode

请求参数乱码问题:在web.xml中配置

<!--字符编码过滤器-->
<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>

    <!--强制指定字符编码,即如果在request中指定了字符编码,那么也会为其强制指定当前设置的字符编码-->
    <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>

参数名不一致:可以使用@RequestParam()注解来解决,这个注解的三个属性:

  • value:指定请求参数的名称,即表单中input的name值。
  • name:同value,两者只能使用一个
  • required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。
  • defaultValue:指定当前参数的默认值。如果请求中没有该参数,则当前方法参数将取该默认值。

路径变量:除了接收表单提交的数据还可以获取url中携带的信息,@PathVariable注解可以解决,包含以下几个属性:

  • value:指定请求参数的名称,即url中的值,当url中的名称和方法参数名称不一致时,可以使用该属性解决。
  • name:同value,两者只能使用一个
  • required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。

Controller方法返回值

返回值类型:

  • ModelAndView
    需要跳转到jsp或资源,又要传递数据
  • String
    跳转资源
  • void
    如果你不用spring mvc帮你完成资源的跳转,此时可以将controller中的方法返回值设置为void。一般情况下有下面两个应用场景:

通过原始的servlet来实现跳转 // 不走视图解析器
request.getRequestDispatcher("/jsp/welcome.jsp").forward(request,response);
ajax响应
out.write(jsonString);

  • 自定义类型
    方法上加@ResponseBody注解

转发和重定向

转发:Controller中返回ModelAndView默认使用转发,显式使用则在setViewName()指定视图前加forward;视图解析器会失效
重定向:在指定视图前加redirect
string类型返回值的转发和重定向则在字符串前加上forward/redirect:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值