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

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 基础教程 简单入门实例

    **SpringMVC基础教程简单入门实例** SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据处理和用户界面分离,使得代码更加清晰和可维护...

    springmvc入门教程.docx

    SpringMVC 是一款基于 ...通过实践和理解这些基础概念,你将能够更好地掌握 SpringMVC,并在开发过程中更加游刃有余。本教程提供的源码、步骤和示例将有助于你深入理解每个部分,并帮助你在实际项目中应用所学知识。

    springmvc视频教程

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

    springMVC入门教程

    适合新手自学入门,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构, 可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。

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

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

    SpringMVC入门级教程,免费下载

    【SpringMVC 入门教程】 SpringMVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 Web 应用的表示层。这个框架以简单易学、高效和高度可配置而受到开发者们的青睐。本文将...

    SpringMVC4教程-超权威--超详细

    ### SpringMVC4教程知识点详解 #### 一、SpringMVC概述 - **SpringMVC简介**:SpringMVC作为Spring框架的一部分,是基于MVC(Model-View-Controller)设计模式的一种轻量级Web框架。它利用了Spring的核心功能如IoC...

    SpringMVC中文教程

    ### SpringMVC中文教程知识点概览 #### 一、SpringMVC简介 SpringMVC是Spring框架的一个模块,专门用于简化Web应用程序的开发。它基于Model-View-Controller(MVC)架构模式,使得开发者能够更高效地创建复杂的Web...

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

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

    SpringMVC简易教程

    本教程将详细介绍SpringMVC的核心概念和实现Web应用程序的最佳实践。 Web开发中的请求-响应模型是Web应用程序运行的基础。在这一模型中,Web客户端(如浏览器)发起请求,Web服务器(如Tomcat)接收并处理这些请求...

    大型商场项目实战springmvc视频教程

    通过上述内容的学习,我们可以了解到大型商场项目实战SpringMVC视频教程不仅涵盖了SpringMVC框架的基础知识,还深入讲解了项目搭建、环境配置、前后端分离开发等高级主题。这对于初学者来说是一次非常宝贵的学习机会...

    springMVC快速入门基础代码

    **SpringMVC快速入门基础代码详解** SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,使得开发人员能够更高效地处理HTTP请求和响应,同时保持代码的清晰性和可...

    springMVC入门_Java系列教程

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

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

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

Global site tag (gtag.js) - Google Analytics