- 浏览: 17910 次
最新评论
【Spring-MVC快速开始】
前言
准备筹划一个自己的个人网站,初步的架构设计采用SSH(Spring-MVC,Spring,Hibernate),在这里顺便记录一下设计和开发过程,以备参考。后续会陆续更新文档,如有任何问题,欢迎各位不吝指出,共同学习。
环境
【Spring-MVC环境搭建】
pom.xml添加spring-mvc的依赖
WEB-INF目录下的文件web.xml的配置
WEB-INF目录下的文件springMVC-servlet.xml的配置
【Controller代码】
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目录下
网上有些帖子中,配置视图解析器时的配置如下:
可以发现,这个配置把jsp页面放在了/WEB-INF/jsp目录下,这种配置编译时是发现不了的,直到服务启动,访问页面时才会发现出现404。这时,即使直接访问绝对路径,也会报404。究其原因,是因为WEB2.0把/WEB-INF/作为私有目录(也称安全目录),只有服务端可以访问,客户端不可访问,所以报404就很正常了。这个问题尤其容易被忽视,又不容易发现。
问题2 javax.servlet.ServletException: No adapter for handler
这个错误与所用的Spring-MVC的版本和配置有关,以后大家会经常发现由于版本所带来的各种问题。
在Spring-MVC 3.1之前的版本中,springMVC-servlet.xml应该使用以下的配置:
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
在Spring-MVC 3.1之后的版本中,springMVC-servlet.xml应该使用以下的配置:
如果这个配置与版本不匹配的话,那么就会出现上述的错误。
问题3 对静态资源的访问出现404 (该问题解释转自:http://bbs.9ria.com/thread-242209-1-1.html)
Spring-MVC访问静态资源可能会存在找不到资源的问题。
1、如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,如下:
2、如果配置拦截了所有的请求,如下:
通过上面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如下:
前言
准备筹划一个自己的个人网站,初步的架构设计采用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极简入门资料,帮助后台开发者快速入门,有详细目录
**SpringMVC基础教程简单入门实例** SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据处理和用户界面分离,使得代码更加清晰和可维护...
SpringMVC 是一款基于 ...通过实践和理解这些基础概念,你将能够更好地掌握 SpringMVC,并在开发过程中更加游刃有余。本教程提供的源码、步骤和示例将有助于你深入理解每个部分,并帮助你在实际项目中应用所学知识。
springmvc视频教程,非常详细,一步一步调试进入源码讲解,非常不错的教程
适合新手自学入门,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构, 可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。
springMVC做的小项目,springMVC+spring+hibernate+ehcache+shiro jar包全,代码也全,结构清晰明了,非常适合springMVC初学者、ehcache初学者、shiro初学者。shiro除了做认证以及授权外,还做了并发登录控制,多个...
【SpringMVC 入门教程】 SpringMVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的重要组成部分,主要用于构建 Web 应用的表示层。这个框架以简单易学、高效和高度可配置而受到开发者们的青睐。本文将...
### SpringMVC4教程知识点详解 #### 一、SpringMVC概述 - **SpringMVC简介**:SpringMVC作为Spring框架的一部分,是基于MVC(Model-View-Controller)设计模式的一种轻量级Web框架。它利用了Spring的核心功能如IoC...
### SpringMVC中文教程知识点概览 #### 一、SpringMVC简介 SpringMVC是Spring框架的一个模块,专门用于简化Web应用程序的开发。它基于Model-View-Controller(MVC)架构模式,使得开发者能够更高效地创建复杂的Web...
主要介绍了详解SpringMVC 基础教程 简单入门实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本教程将详细介绍SpringMVC的核心概念和实现Web应用程序的最佳实践。 Web开发中的请求-响应模型是Web应用程序运行的基础。在这一模型中,Web客户端(如浏览器)发起请求,Web服务器(如Tomcat)接收并处理这些请求...
通过上述内容的学习,我们可以了解到大型商场项目实战SpringMVC视频教程不仅涵盖了SpringMVC框架的基础知识,还深入讲解了项目搭建、环境配置、前后端分离开发等高级主题。这对于初学者来说是一次非常宝贵的学习机会...
**SpringMVC快速入门基础代码详解** SpringMVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,使得开发人员能够更高效地处理HTTP请求和响应,同时保持代码的清晰性和可...
Spring MVC是结构最清晰的MVC Model 2实现。它的Action也不叫Action,而是称做Controller;Controller接收request, response参数,然后返回ModelAndView(其中的Model不是Object类型,而是Map类型)。...
此视频包含:springmvc入门教程(原理分析、环境搭建、前端控制器配置、Handler编写调试、非注解映射器和适配器、注解映射器和适配器、前端控制器源代码分析、视图解析器配置前缀和后缀);springmvc和mybatis整合;...