Spring全家桶之springMVC(二)

匿名 (未验证) 提交于 2019-12-02 23:54:01

   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越来越流行了,这个咱们以后再介绍)。

    如果将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;@Controllerpublic 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;     }  }

来源: https://www.cnblogs.com/scm2019/p/11343403.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!