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

SpringMVC环境搭建

2013-07-30 13:11 316 查看
随着Annotation的流行,一些主流框架都加入了对Annotation的支持。使用Annotation能够简化很多配置工作,能够很大程度上提高程序开发的效率。下面主要讲解Sping MVC 注解功能,介绍如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。

SpringMVC model类似于Struts。在多线程服务对象这点上,Spring的Controller类似于Struts Action,只有一个实例处理所有客户的请求。然而,我们相信Spring的MVC比起Struts有很多优点,例如: Spring在controllers,JavaBean,models和views提供了一个非常清晰的划分。

Spring 的MVC是非常灵活的。不像Struts,它强制你的Action和Form对象进入固化的层次之中(因而迫使你使用Java的实体承), Spring MVC完全是基于接口的。而且,通过插入你自己的接口几乎Spring MVC 框架的所有部分都是可配置的。

基于注解的Controller 是如何定义做到这一点的

[java]
view plaincopyprint?

package xxx.user.web;
…………………………
@Controller // <——①

@RequestMapping("/user.html") //<——②

public class UserController {
private String showListUserPage = "user/listUser";
………………………………………
@Resource // <——③

private UserManager userManger;

@"RequestMapping(“/work/staff/addStaff.do”) //<——④

public String listUser(ModelMap model) {
String roleMapJSON = UserConstants.getRoleMapJSON();
model.addAttribute("roleMapJSON", roleMapJSON);
return showListUserPage;
}
………………………
}

package xxx.user.web;
…………………………
@Controller // <——①
@RequestMapping("/user.html") //<——②
public class UserController {
private String showListUserPage = "user/listUser";
………………………………………
@Resource // <——③
private UserManager userManger;

@"RequestMapping(“/work/staff/addStaff.do”) //<——④
public String listUser(ModelMap model) {
String roleMapJSON = UserConstants.getRoleMapJSON();
model.addAttribute("roleMapJSON", roleMapJSON);
return showListUserPage;
}
………………………
}


①@Controller注解标明该类需要Spring容器自动加载,将一个类成为 Spring 容器的 Bean。

②: @RequestMapping 这个注解使得该类具有了Spring MVC Controller 的功能。

@RequestMapping注解标识UserController处理来自/user.html的请求。

@RequestMapping 可以标注在类定义处,将 Controller 和特定请求关联起来;还可以标注在方法签名处(注解4后面详细介绍)。所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的 Controller(如 SimpleFormController 等)。

③:注解方式注入 UserManager

④: 此处又用了一个@RequestMapping注解,这里的这个注解是为了细粒度区分各个Controller方法,也就是说 listUser 这个方法来处理 /work/staff/addStaff.do的请求

此外,我们注意到此处返回值是一个String类型,Spring MVC会认为这是你告诉他返回的视图名称,当然此处你也可以返回一个ModelAndView类型,假若你什么也不返回-void,那么Spring会试图查找和你的请求URL同名的视图进行匹配(与配置文件相关)。

启用Spring MVC 功能

web.xml

Xml代码

……………………….

<!-- Spring MVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的配置文件,以启动Spring MVC模块 -->

[html]
view plaincopyprint?

<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


启用Spring MVC 注解功能

web.xml 中定义了一个名为 spring的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/spring-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。

Spring MVC 会自动加载 spring-servlet.xml 配置文件,要使用注解功能,主要对其进行配置。

[html]
view plaincopyprint?

<?xml version="1.0" encoding= "UTF-8"?>
<beansxmlnsbeansxmlns="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/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd">

<mvc:annotation-driven/>
<context:component-scanbase-packagecontext:component-scanbase-package="com.tgb.SpringMVC1"/>
<beanclassbeanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertynamepropertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertynamepropertyname="prefix" value="/"></property>
<propertynamepropertyname="suffix" value=".jsp"></property>
</bean>
</beans>

<?xml version="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/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd">

<mvc:annotation-driven/>
<context:component-scanbase-package="com.tgb.SpringMVC1"/>
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertyname="prefix" value="/"></property>
<propertyname="suffix" value=".jsp"></property>
</bean>
</beans>


图解



HandlerMapping

DispatcherServlet要将一个请求交给哪个特定的Controller,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。

HandlerMapping是把一个URL指定到一个Controller上,(就像应用系统的web.xml文件使用<servlet-mapping>将URL映射到servlet)。

Spring带有三种HandlerMapping,(SpringMVC中的所有HandlerMapping都实现了接口org.springframework.web.servlet. HandlerMapping)。

ViewResolver

在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现。

<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">

<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>

<propertyname="prefix" value="/"></property>

<propertyname="suffix" value=".jsp"></property>

</bean>

Handleradapter

Spring MVC通过HandlerAdapter来实际调用处理函数。

以AnnotationMethodHandlerAdapter为例

DispatcherServlet中根据handlermapping找到对应的handler method后,首先检查当前工程中注册的所有可用的handlerAdapter,根据handlerAdapter中的supports方法找到可以使用的handlerAdapter。通过调用handlerAdapter中的handle方法来处理及准备handler method中的参数及annotation(这就是spring mvc如何将reqeust中的参数变成handle method中的输入参数的地方),最终调用实际的handle
method。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: