spring mvc中url-pattern的写法

    1、设置url-pattern为*.do

    之前我们在web.xml文件中配置DispatcherServlet的时候,将url-pattern配置为*.do的方式,其实除了这种方式之外你还可以配置为其他任意方式:*.abc或*.action或*.123。

    只要你的请求url中包含配置的url-pattern,该url就可以到达DispatcherServlet。当然这里业内通常都将url-pattern配置为*.do的方式,所以你最好也这么去做。(不过现在这种.do的配置方式不如以前多了,是因为一种叫做restful风格的URL越来越流行了,这个咱们以后再介绍)。

      2、设置url-pattern为/*

    如果将url-pattern设置为/*之后,web项目中的jsp都不能访问了会报出404的错误,这是因为DispatcherServlet会将向JSP页面的跳转请求也当作是一个普通的 Controller 请求,会对其进行处理,而此时是找不到与其相应的controller。

    其实说的简单一点就是/*这种配置会被web服务器(这里是tomcat)匹配到.jsp上面。

    在实际开发中最好不要这样配置url-pattern。  

    3、设置url-pattern为/   

    如果将url-pattern设置为/之后,只要是在web.xml文件中找不到匹配的URL,它们的访问请求都将交给DispatcherServlet处理,静态资源:css文件,js文件,图片也会被拦截并交给DispatcherServlet处理。
    该配置方式不会拦截.jsp文件和.jspx文件,因为这个在tomcat中的conf目录里面的web.xml文件中已经添加的相应的处理方式了,他会交给org.apache.jasper.servlet.JspServlet来处理。即我们可以正常访问系统中的jsp文件。
    现在restful风格的URL越来越流行,这种/的配置方式使用的也越来越多了。

    解决静态资源不能访问的问题,解决方式有三种:

  •  使用defaultServlet

打开你的tomcat中conf/web.xml,在这个文件中有一个叫做DefaultServlet的配置,当系统找不到处理某次url请求该交由谁处理的时候,就会交给这个servlet处理。我们可以通过使用这个DefaultServlet来处理静态资源,在你的系统中的web.xml文件中添加下面配置,要添加在DispatcherServlet的前面,这样系统就会将带有下面后缀名的请求交给defaultservlet来处理:

    下边的代码放在web.xml文件中,且最好放在中央控制器配置的前边。

    <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>
  •  使用mvc:default-servlet-handler

在springmvc.xml文件中添加下面配置即可,该方式会对所有的请求进行处理,然后交由相应的servlet,这种方式其实最终也是由DefaultServlet来处理:

    该段代码放在springmvc.xml中。

  <mvc:default-servlet-handler/> 
  •  使用mvc:resources

在spring mvc中提供了mvc:resources标签用来解决静态资源无法访问的问题,只需要在springmvc.xml的配置文件中添加下面内容即可,这样会交给spring mvc的ResourceHttpRequestHandler类来处理:

  <mvc:resources mapping="/images/**" location="/images/" />
 <mvc:resources mapping="/css/**" location="/css/" />
 <mvc:resources mapping="/js/**" location="/js/" />
    • mapping 表示对该资源的请求,springmvc会扫描该包下的所有文件和资源。注意,后面是两个星号**。
    • location 表示静态资源所在目录,在我的项目中就在webapp下创建一个images文件夹,我会将所有的图片放到这个文件夹下。

   

     使用注解编写Spring MVC程序   

    第一个注解式Spring MVC程序 

    在实际开发中,我们会创建很多Controller来满足业务方面的需求,这样就会导致一个问题,需要在springmvc.xml配置文件中配置大量的bean导致该配置文件变的臃肿起来,为了解决这个问题,spring MVC提供了一系列的注解,通过设置注解,可以使springmvc.xml配置文件变的简洁。

使用注解编写spring MVC程序整体的步骤跟之前的差不多(不要忘记在web.xml文件中添加DispatherServlet),只不过有一些地方需要修改,在之前的spring MVC程序中添加下面内容。

    • 注册扫描器
      在配置文件中我们只需要注册一个组件扫描器即可,其中base-package写上你controller类所在的的包名即可,下面这种写法表示会扫描controller下的所有类,该组件扫描器是spring中的内容,具体咱在spring中再讲解。
    <!-- 注册组件扫描器 -->
<context:component-scan base-package="controller"/> <!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

    注意:如果在你的springmvc.xml文件中配置了静态资源即使用了mvc:resources,标签的话,那么需要在你的配置文件中配置注解驱动,添加下面内容:

    如果没有添加注解驱动的话,你访问controller的时候会出现404错误,如果没有使用mvc:resources标签就不需要添加注解驱动了。

<mvc:annotation-driven/>

    controller类


package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
public class HelloSpringMVC {
@RequestMapping("/test/test.do")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("hello", "Controller注解方式test1");
mv.setViewName("test");
return mv;
}
@RequestMapping({"/test/test2.do", "/test/hello.do"})
public ModelAndView test2(HttpServletRequest request, HttpServletResponse response) throws Exception{ ModelAndView mv = new ModelAndView();
mv.addObject("hello", "Controller注解方式test2");
mv.setViewName("test");
return mv;
}
}
 

    test.jsp   

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
${hello}
</body>
</html>    

    处理器中的注解 

    在上面的示例中,我们创建了一个Controller类,这类没有实现任何接口,只是在类名和方法上添加了两个注解:

    • @Controller:表示当前类为一个Controller
    • @RequestMapping:表示当前方法为Controller中的方法,该方法要对 value 属性所指定的 URL进行处理与响应,被注解的方法的名称是可以随意命名的。当有多个请求可以匹配该方法时,可以写上一个String类型的数组,如上示例中的test2方法。
      @RequestMapping注解还可以定义在类上面,在上面的示例中,test1方法和test2方法中的url路径中都包含了/test,此时我们把这些相同的url抽取出来,放到类上的注解@RequestMapping中,此时可以称之为命名空间。
package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Controller()
@RequestMapping("/test")//类名上的注解,命名空间namespace
public class TestController02 { @RequestMapping("/test1.do")
public ModelAndView test1(HttpServletRequest request, HttpServletResponse response) throws Exception{ ModelAndView mv = new ModelAndView();
mv.addObject("hello", "Controller注解方式test1");
mv.setViewName("test");
return mv;
} @RequestMapping({"/test2.do", "/hello.do"})
public ModelAndView test2(HttpServletRequest request, HttpServletResponse response) throws Exception{ ModelAndView mv = new ModelAndView();
mv.addObject("hello", "Controller注解方式test2");
mv.setViewName("test");
return mv;
} }

   

  RequestMapping中常用的属性    

     通配符

    在RequestMapping中我们可以使用*号表示通配符从而匹配一系列的请求:

    1、表示请求的url中只要是以test开头就可以被当前方法处理。  

@RequestMapping("/test*.do")

    2、表示请求的url中只要是以test结尾就可以被当前方法处理。

@RequestMapping("/*test.do")

    3、表示在test.do的前面,只能有两级路径,第一级必须是scm,而第二级随意,例如:scm/123/test.do。这种称为路径级数的精确匹配。

@RequestMapping("scm/*/test.do")

    4、表示在test.do的资源名称前面,必须以scm路径开头,而其它级的路径包含几级,各级又叫什么名称,均随意,例如:scm/1/0/2/4/test.do。 这种称为路径级数的可变匹配。

@RequestMapping("scm/**/test.do")    

    请求的提交方式

    在@RequestMapping中有一个method属性,改属性可以设置接收请求的提交方式:   

@RequestMapping(value="/test.do",method = RequestMethod.POST)
public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("hello", "POST test");
mv.setViewName("test");
return mv;
}    

    上面的注解表示,只有当/test.do的请求的方式是post的时候才会执行当前方法,对于其他请求方式不进行处理。如果不写method属性的话,无论你是使用get或者post或者其他方式,它都会进行处理。RequestMethod是一个枚举类型,里面包含了大部分的提交方式。
    

    示例,创建一个Controller,里面添加两个方法分别只处理get和post方式的请求:    

package controller;

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; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Controller//表示当前类是一个controller
@RequestMapping("/test")//表示是一个命名空间namespace
public class TestController03 { @RequestMapping(value="/requestGet.do",method = RequestMethod.GET)
public ModelAndView reqGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("method", "get请求");
mv.setViewName("get");
return mv;
} @RequestMapping(value="/requestPost.do",method = RequestMethod.POST)
public ModelAndView reqPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("hello", "post请求");
mv.setViewName("post");
return mv;
} }

    index.jsp   

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="/test/requestGet.do" method="get"> <input type="submit" value="get请求">
</form>
<br>
<form action="/test/requestPost.do" method="post"> <input type="submit" value="post请求">
</form>
</body>
</html>

    跳转的get.jsp和post.jsp只需要接收hello参数即可,这里就省略掉了。

    点击相应的按钮会执行相应请求方式的方法,如果请求方法没有匹配到,比如将上述的GET请求改为POST(index.jsp中按钮不变 依然是”get请求“),当我们点"get请求"的按钮时会发现报出405的错误。这时因为我们在index.jsp中设置的发送的是GET请求,但是在controller中只能处理POST请求,所以无法处理。    

    请求中携带的参数

    在RequestMapping中还有一个属性是params,通过这个属性我们可以指定请求中必须携带的参数。

    1、要求请求中必须携带请求参数 name 与 age

@RequestMapping(value="/test.do" ,  params={"name" , "age"}) 

    2、要求请求中必须携带请求参数 age,但必须不能携带参数 name

@RequestMapping(value="/test.do" , params={"!name" , "age"}) 

    3、要求请求中必须携带请求参数 name,且其值必须为jack;必须携带参数 age,其值必须为 23

@RequestMapping(value="/test.do" , params={"name=jack" , "age=23"}) 

    4、要求请求中必须携带请求参数name,且其值必须不能为jack

@RequestMapping(value="/test.do" , params="name!=jack") 

Spring全家桶之springMVC(二)的更多相关文章

  1. Spring全家桶之springMVC(四)

      路径变量PathVariable PathVariable   Controller除了可以接收表单提交的数据之外,还可以获取url中携带的变量,即路径变量,此时需要使用@PathVariable ...

  2. Spring全家桶之SpringMVC(三)

    Spring MVC单个接收表单提交的数据   单个接收表单提交的参数 在实际开发中通过会在spring MVC的Controller里面接收表单提交过来的参数,这块代码该怎么去编写呢? 示例: 编写 ...

  3. Spring全家桶之springMVC(一)

    Spring MVC简介和第一个spring MVC程序 Spring MVC是目前企业中使用较多的一个MVC框架,被很多业内人士认为是一个教科书级别的MVC表现层框架,Spring MVC是大名鼎鼎 ...

  4. Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务

    前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...

  5. 10分钟详解Spring全家桶7大知识点

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  6. 一文解读Spring全家桶 (转)

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  7. Spring全家桶–SpringBoot Rest API

    Spring Boot通过提供开箱即用的默认依赖或者转换来补充Spring REST支持.在Spring Boot中编写RESTful服务与SpringMVC没有什么不同.总而言之,基于Spring ...

  8. Spring全家桶系列–SpringBoot之AOP详解

    //本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关 ...

  9. 【转】Spring全家桶

    Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶.它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflo ...

随机推荐

  1. 在php中如何实现cookie即时生效,不用刷新就可以使用

    参考:https://www.jianshu.com/p/0468ef5dbf4d 今天在用php设置cookie的时候,发现cookie如果只是赋值一次的话,要手动刷新一下浏览器才能把数据及时更新, ...

  2. PHP使用token防止表单重复提交的方法

    本文实例讲述了PHP使用token防止表单重复提交的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. SVN部署(Centos7,Ubuntu)

    SVN 简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Sub ...

  4. Docker 部署 halo 启动时,MySql 连接不上

    原因 halo 是部署在 docker 容器内部的,而 MySql 是部署在"宿主机"上的,docker默认的网络模式是bridge,容器内127.0.0.1访问不到的,把网络模式 ...

  5. C/C++ 程序执行时间

    C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock( void ); 这个函数返回从“开启这个程序进 ...

  6. http 之 CORS简介

    什么是CORS? CORS:跨域资源共享.是一种机制. 用处? 它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定 ...

  7. innobackupex 出现Unrecognized character \x01; marked by

    centos 7.2 mysql 5.7.16 innobackupex version 2.4.6 [root@Devops-mysql-150-115 sh]# innobackupex --de ...

  8. 电子书下载:C# Database Basics

    下载: http://download.csdn.net/detail/maxwoods/4089269

  9. 关于:Express会被Koa2取代吗?

    知会上看到有个问题<Express会被Koa2取代吗?>.刚好对Express.koa有点小研究,于是简单回答了一下. 1.先说结论 目前没有看到Express会被koa2取代的迹象. 目 ...

  10. System Call

    内容 设计系统调用,将系统的相关信息(CPU型号.操作系统的版本号.系统中的进程等类似于Windows的任务管理器的信息)以文本形式列表显示于屏幕,并编写用户程序予以验证. 思想 系统调用是应用程序和 ...