`
十三哥
  • 浏览: 17797 次
文章分类
社区版块
存档分类
最新评论

SpringMVC入门教程

    博客分类:
  • SSH
阅读更多
【Spring-MVC快速开始】
前言
准备筹划一个自己的个人网站,初步的架构设计采用SSH(Spring-MVC,Spring,Hibernate),在这里顺便记录一下设计和开发过程,以备参考。后续会陆续更新文档,如有任何问题,欢迎各位不吝指出,共同学习。
环境
  • 开发环境 版本
  • eclipse 4.3.2
  • maven 3.2.1
  • Spring-MVC 3.2.3.RELEASE
  • Spring Spring
  • Hibernate 3.2.5

【Spring-MVC环境搭建】
pom.xml添加spring-mvc的依赖
   
<!--  Spring-MVC begin-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.3.RELEASE</version>
    </dependency>
    <!--  Spring-MVC end-->

WEB-INF目录下的文件web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.xbs.ready.ssh</param-value>
    </context-param>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

WEB-INF目录下的文件springMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!-- 使Spring支持自动检测组件,如注解的Controller -->
    <context:component-scan base-package="com.xbs.ready.ssh"/>
    <!--Spring3.1开始的注解 HandlerMapping -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
    <!--Spring3.1开始的注解 HandlerAdapter -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    <!--这个配置很关键,用以访问静态资源文件 -->
    <mvc:default-servlet-handler/>
    <!--视图解析器r -->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/views/"
          p:suffix=".html" />
</beans>

【Controller代码】

package com.xbs.ready.ssh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *
 * @author xbs
 */
//路径当中的“/”可以省略
@Controller
@RequestMapping("/abc")
public class IndexController {

    //路径当中的“/”可以省略
    @RequestMapping("/index")
    public String index() {
            System.out.println("aaaaaa");
            return "index";
    }
}

html文件路径:.../webapp/views/index.html
访问
访问路径:http://localhost:8080/sshdemo/abc/index
根据访问路径,会访问IndexController内的index方法,该方法返回字符串“index”
根据字符串index,通过配置文件springMVC-servlet.xml中配置的视图解析器,找到视图的前缀(/views/)和后缀(.html), 那么最终的视图路径为:http://localhost:8080/sshdemo/views/index.html
至此,Http请求结束返回页面。
【问题说明】
搭建Spring-MVC的环境非常简单,网上教程也很多,不过有些教程可能本身并没有经过验证,直接使用,会发现出现各种问题。因此十三哥在此列出一些问题和解决方案,以供参考。

问题1 把页面存放在/WEB-INF目录下

网上有些帖子中,配置视图解析器时的配置如下:
<!-- ViewResolver -->  
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
    <property name="prefix" value="/WEB-INF/jsp/"/>  
    <property name="suffix" value=".jsp"/>  
</bean>

可以发现,这个配置把jsp页面放在了/WEB-INF/jsp目录下,这种配置编译时是发现不了的,直到服务启动,访问页面时才会发现出现404。这时,即使直接访问绝对路径,也会报404。究其原因,是因为WEB2.0把/WEB-INF/作为私有目录(也称安全目录),只有服务端可以访问,客户端不可访问,所以报404就很正常了。这个问题尤其容易被忽视,又不容易发现。

问题2 javax.servlet.ServletException: No adapter for handler

HTTP Status 500 - No adapter for handler [com.xbs.ready.ssh.controller.IndexController@1d70a5cb]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

--------------------------------------------------------------------------------

type Exception report

message No adapter for handler [com.xbs.ready.ssh.controller.IndexController@1d70a5cb]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

description The server encountered an internal error that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: No adapter for handler [com.xbs.ready.ssh.controller.IndexController@1d70a5cb]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
    org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

这个错误与所用的Spring-MVC的版本和配置有关,以后大家会经常发现由于版本所带来的各种问题。
在Spring-MVC 3.1之前的版本中,springMVC-servlet.xml应该使用以下的配置:
<!-- HandlerMapping -->  
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>  

<!-- HandlerAdapter --> 

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
在Spring-MVC 3.1之后的版本中,springMVC-servlet.xml应该使用以下的配置:
<!--Spring3.1开始的注解 HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
<!--Spring3.1开始的注解 HandlerAdapter -->  
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

如果这个配置与版本不匹配的话,那么就会出现上述的错误。

问题3 对静态资源的访问出现404 (该问题解释转自:http://bbs.9ria.com/thread-242209-1-1.html)

Spring-MVC访问静态资源可能会存在找不到资源的问题。
1、如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,如下:
<!-- SpringMVC核心分发器 -->
<servlet> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath*:config/dispatcher-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<!-- 映射*.do的请求 -->
<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 

2、如果配置拦截了所有的请求,如下:
<!-- SpringMVC核心分发器 -->
<servlet> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath*:config/dispatcher-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet>
<!-- 映射所有的请求 -->
<servlet-mapping> 
    <servlet-name>dispatcherServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

通过上面url-pattern的配置,所有URL请求都将被Spring MVC的DispatcherServlet截获。这样的配置,会造成html,js文件、css文件、图片文件等静态资源无法访问。因为对这些文件的请求,又将会被Spring MVC的DispatcherServlet截获,相当于一个循环请求。但是又因为没有对应的Controller(即使有也不行,会被截获,然后再循环请求),所以会报404。
解决方法: 1.采用<mvc:default-servlet-handler />
在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
<!-- default-servlet-name可以删掉 -->
<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
2.采用<mvc:resources />
<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。
首先,<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。
其次,<mvc:resources />依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,一般可将该时间设置为一年,以充分利用浏览器端的缓存。在输出静态资源时,会根据配置设置好响应报文头的Expires 和 Cache-Control值。
在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。
在springMVC-servlet中添加如下配置:
<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>
以上配置将Web根路径"/"及类路径下 /META-INF/publicResources/ 的目录映射为/resources路径。假设Web根路径下拥有images、js这两个资源目录,在images下面有bg.gif图片,在js下面有test.js文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源。
假设WebRoot还拥有images/bg1.gif 及 js/test1.js,则也可以在网页中通过 /resources/images/bg1.gif 及 /resources/js/test1.js 进行引用。
也可以简单配置WEB-INF/springMVC-servlet.xml如下:
<!-- spring mvc对静态资源的访问 -->
<resources location="/image/" mapping="/image/**"/>       
<resources location="/js/" mapping="/js/**"/>       
<resources location="/style/" mapping="/style/**"/>
分享到:
评论

相关推荐

    SpringMVC 入门教程.pdf

    江南一点雨原创 SpringMVC 入门教程,更多 SpringMVC教程请关注我的 CSDN 博客:https://blog.csdn.net/u012702547

    springMVC入门教程

    springMVC入门教程 非常适合初学者的学习,一份教程 共享给大家

    springmvc入门教程.docx

    SpringMVC作为基础性的MVC框架,是业界非常流行且广泛得到各大企业和个人开发者的认可的,其应用领域非常广泛。 对于新手,应该怎么去学习这门框架技术呢,应广大技术朋友的反应,我编写了此套教程,帮助新手朋友们...

    springmvc视频教程

    springmvc视频教程,非常详细,一步一步调试进入源码讲解,非常不错的教程

    springMVC入门教程,集成了缓存、安全框架

    springMVC做的小项目,springMVC+spring+hibernate+ehcache+shiro jar包全,代码也全,结构清晰明了,非常适合springMVC初学者、ehcache初学者、shiro初学者。shiro除了做认证以及授权外,还做了并发登录控制,多个...

    SpringMVC 基础教程 简单入门实例

    NULL 博文链接:https://junner.iteye.com/blog/2205730

    详解SpringMVC 基础教程 简单入门实例

    主要介绍了详解SpringMVC 基础教程 简单入门实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SpringMVC视频教程_初学者一头扎进 springmvc

    SpringMVC视频教程,web开发必学知识点,SSM框架必学知识点,一共1G,涵盖SpringMVC从头至尾教程,讲的很详细,适合新手入门

    springMVC入门_Java系列教程

    Spring MVC是结构最清晰的MVC Model 2实现。它的Action也不叫Action,而是称做Controller;Controller接收request, response参数,然后返回ModelAndView(其中的Model不是Object类型,而是Map类型)。...

    springMVC教学视频详解(包括spring和mybatis的整合)

    此视频包含:springmvc入门教程(原理分析、环境搭建、前端控制器配置、Handler编写调试、非注解映射器和适配器、注解映射器和适配器、前端控制器源代码分析、视图解析器配置前缀和后缀);springmvc和mybatis整合;...

    SpringMVC中文教程

    需要有一定的java基础和对Spring的了解

    SpringMVC快速入门教程-深入分析

    技术分享:SpringMVC快速入门教程-深入分析

    SpringMVC教程

    非常棒的SpringMVC教程, 简明 透彻 涵盖了基本工作中都会接触到的知识 每一章都是一个PDF,效果非常清楚 即有Spring2.5的 Controller接口的老版本 也包含新版Spring3.0,3.1 基于注解的MVC配置方法 总之绝对值得下载 ...

    SpringMVC入门简介.docx

    SpringMVC入门示例教程,简单基础。适和SpringMVC初级学习者

Global site tag (gtag.js) - Google Analytics