您的位置:首页 > 编程语言 > Java开发

使用Eclipse基于Maven的Spring MVC 调试心得(二)--- Spring配置

2016-01-11 17:13 579 查看

接 使用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"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/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.multipart.commons.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="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/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.multipart.commons.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来完成,然后注入调用者因此也称为依赖注入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: