admin管理员组文章数量:1794759
使用Eclipse基于Maven的Spring MVC 调试心得(二)
接 使用Eclipse基于Maven的Spring MVC 调试心得(一)--- Maven配置 3.Spring项目的web.xml配置
在Dynamic Web Project中,web.xml可谓是最重要的文件之一,它的配置包括:1)请求地址(url-pattern)与处理类(servlet-class)之间通过servlet-name来进行的映射(servlet-mapping)。因此,此文件的配置也关乎到我们访问网站的请求能否正常的处理。
(1)在Spring MVC项目中通过配置web.xml来拦截所有的url请求,配置如下:
<span style="font-size:18px;"><servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <!-- mvc-dispatcher拦截所有的请求--> <url-pattern>/</url-pattern> </servlet-mapping></span>(2)DispatcherServlet是Spring MVC的核心,因此我们不需要通过web.xml来拦截并分配url请求,而是将所有请求都交给Spring中的DispatcherServlet,让DispatcherServlet来进行处理,配置如下:
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>(3)这里需要在“<servlet>…</servlet>”标签中添加DispatcherServlet配置文件的路径,否则默认为/WEB-INF/$servlet-name$-serlet.xml,这里配置路径为/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml配置如下:
<init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/configs/spring/mvc-dispatcher-servlet.xml </param-value> </init-param>因此 <servlet> 标签的完整配置如下:
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name><param-value> /WEB-INF/configs/spring/mvc-dispatcher-servlet.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>(4)web.xml的完整配置如下
<?xmlversion="1.0" encoding="UTF-8"?> <!DOCTYPEweb-app PUBLIC "-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN" "java.sun/dtd/web-app_2_3.dtd"> <web-appxmlns:xsi="www.w3/2001/XMLSchema-instance" xmlns="java.sun/xml/ns/javaee"xmlns:web="java.sun/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="java.sun/xml/ns/javaeejava.sun/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Archetype Created WebApplication</display-name> <!-- DispatcherServlet, Spring MVC的核心 --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- DispatcherServlet对应的上下文配置,默认为/WEB-INF/$servlet-name$-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/configs/spring/mvc-dispatcher-servlet.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <!-- mvc-dispatcher拦截所有的请求--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>4.DispatcherServlet的xml配置文件的配置
DispatcherServlet的配置文件MVC_Dispatcher_Servlet.xml(此名字可变,与上面web.xml配置文件中的<servlet> --><init-param> --> <param-value> 标签中的值相同即可)提供相关的Spring MVC 配置。可配置选项包括:启用的功能(如注释功能),DispatcherServlet上下文,静态资源处理,启用的ViewResolver等等。
(1)启用Spring基于注释(annotation )的依赖注入(dependencyinjection,DI,关于依赖注入的讲解见小知识点),配置如下:
<context:annotation-config/>(2)配置Dispatcher的上下文环境,包括控制器(Controller)所在的包名,配置如下:
<context:component-scanbase-package="com.study.mvc"> <context:include-filtertype="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>(3)HandlerMapping配置。这里无需配置,因为Spring MVC可以默认启动。
(4)注解驱动配置。此配置可扩充注解驱动,用于将请求参数绑定到控制器参数,即将请求的地址绑定到注解了控制器的某个类的某个方法上,详细请见控制器的编写部分。配置如下:
<mvc:annotation-driven/>(5)配置加载的静态资源的路径,静态资源包括 CSS,JavaScript, images 等资源文件,配置如下:
<mvc:resourcesmapping="/resources/**" location="/resources/" />(6)配置处理 ViewResolver 的类,可以用多个ViewResolver,使用order属性排序。配置如下:
<bean class=" org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order"value="1" /> <propertyname="mediaTypes"> <map> <entrykey="json" value="application/json" /> <entrykey="xml" value="application/xml" /> <entry key="htm" value="text/html" /> </map> </property> <propertyname="defaultViews"> <list> <!-- JSON View --> <bean class= "org.springframework.web.servlet.view.json.MappingJackson2JsonView"> </bean> </list> </property> <propertyname="ignoreAcceptHeader" value="true" /> </bean>
(7)配置Spring MVC 内部的ViewResolver。因为InternalResourceViewResolver是Spring 内部的ViewResolver,所以应将其放在最后,并应配置其前缀(prefix)和后缀(suffix)属性,以便控制器返回字符串时能找到对应的视图(View)。比如这里配置了prefix 为 /WEB-INF/jsps/,suffix为 .jsp,则若方法返回一个字符串home 时,ViewResolver 会自动拼接成 /WEB-INF/jsps/home.jsp。此配置如下:
<bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix"value="/WEB-INF/jsps/" /> <property name="suffix"value=".jsp" /> </bean>
(8)配置 ResolveLazily为200*1024*1024,即200M,用于捕获文件异常,此配置我还未弄懂??
<beanid="multipartResolver" class="org.springframework.web.multipartmons.CommonsMultipartResolver"> <property name="maxUploadSize"value="209715200" /> <property name="defaultEncoding"value="UTF-8" /> <propertyname="resolveLazily" value="true" /> </bean>
(9)完整配置如下:
<?xmlversion="1.0" encoding="UTF-8"?> <beansxmlns="www.springframework/schema/beans" xmlns:xsi="www.w3/2001/XMLSchema-instance" xmlns:context="www.springframework/schema/context" xmlns:mvc="www.springframework/schema/mvc" xsi:schemaLocation="www.springframework/schema/beans www.springframework/schema/beans/spring-beans-2.0.xsd www.springframework/schema/context www.springframework/schema/context/spring-context.xsd www.springframework/schema/mvc www.springframework/schema/mvc/spring-mvc.xsd"> <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用,提供其相关的Spring MVC配置 --> <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required @Autowired,JSR 250's @PostConstruct,@PreDestroy and @Resource 等标注 --> <context:annotation-config /> <!-- DispatcherServlet上下文,只管理@Controller类型的bean,忽略其他型的bean, 如@Service --> <context:component-scanbase-package="com.study.mvc"> <context:include-filtertype="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。DefaultAnnotationHandlerMapping annotation-driven HandlerMapping--> <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 --> <mvc:annotation-driven /> <!-- 静态资源处理, css, js, imgs --> <mvc:resourcesmapping="/resources/**" location="/resources/" /> <!-- 配置ViewResolver。 可以用多个ViewResolver。 使用order属性排序。 InternalResourceViewResolver放在最后。 --> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order"value="1" /> <propertyname="mediaTypes"> <map> <entrykey="json" value="application/json" /> <entrykey="xml" value="application/xml" /> <entrykey="htm" value="text/html" /> </map> </property> <propertyname="defaultViews"> <list> <!-- JSON View --> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> </bean> </list> </property> <propertyname="ignoreAcceptHeader" value="true" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsps/"/> <property name="suffix"value=".jsp" /> </bean> <!--200*1024*1024即200M resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常 --> <bean id="multipartResolver" class="org.springframework.web.multipartmons.CommonsMultipartResolver"> <propertyname="maxUploadSize" value="209715200" /> <propertyname="defaultEncoding" value="UTF-8" /> <propertyname="resolveLazily" value="true" /> </bean> </beans>5.控制器(Controller)类的编写
编写控制器类和控制器方法时,由于需要基于注解的控制器和扩充了注解驱动,因此需要导入org.springframework.stereotype 包和org.springframework.web.bind.annotation.RequestMapping 包。
(1)编写控制器类
因为在MVCDispatcherServlet.xml配置文件中启用了基于注解(annotation)依赖注入,因此控制器类前应加上注解 @Controller。又因为在MVCDispatcherServlet.xml配置文件中扩充了注解驱动,即可以将请求参数绑定到控制器参数,因此控制器类前应加上注解@RequestMapping ,如:@RequestMapping("/hello"),则访问 localhost:8080/项目名/hello ,就会访问本类
(2)编写控制器方法
在控制器类中编写控制器方法前,只需加上注解@RequestMapping()即可,如:@RequestMapping("/mvc"),则访问 localhost:8080/项目名/hello/mvc ,就会访问本方法。然后ViewResolver根据本方法返回的参数,依据4.(7),拼接视图地址,如:本方法返回字符串 home ,则依据4.(7),拼接出/WEB-INF/jsps/home.jsp的视图(View)地址。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("hello") public class HelloSpringMVC { @RequestMapping("mvc") public String hello() { return "home"; } }6.注意问题:
(1)需要在项目的Project Facets 添加 Dynamic Web Module ,否则项目将无法添加到Tomcat容器中。
右击项目 --> 属性 -->Project Facets --> 勾选 Dynamic WebModule
(2)需要在 Deployment Assembly 中添加 Maven Dependencies ,否则项目编译时会缺失通过Maven下载的依赖包。
右击项目 --> 属性 -->Deployment Assembly --> Add --> Java Build Path Entries --> MavenDependencies --> 完成。
(3)需要在Java 构建路径中添加Server Runtime库,否则会报错。
右击项目 --> 属性 --> JavaBuild Path--> --> Library -->Add Library --> Server Runtime -->Apache Tomcat v7.0 --> 完成。
7.小知识点:
(1)依赖注入:依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者因此也称为依赖注入。
版权声明:本文标题:使用Eclipse基于Maven的Spring MVC 调试心得(二) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686614407a86346.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论