本节主要讲解SpringMVC. :) html
=============================== 前端
浏览器请求->DispatcherServlet->MVC控制器(数据交互,产生信息Model)+View名称 java
->DispatcherServlet->查询视图解析器->视图渲染。 web
SpringMVC的核心是DispatchServlet.它充当前端控制器。 spring
与其它servlet同样,DispatchServlet必须在web应用程序的web.xml文件中进行配置。 浏览器
因此在应用程序使用SpringMVC的第一件事就是将下面的<servlet>放入到web.xml中。 spring-mvc
<servlet>
<servlet-name>spitter</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> mvc
因为这里的名字是spitter,因此DispatcherServlet会尝试从一个WEB-INF/spitter-servlet.xml文件中加载上下文 app
========== 框架
接下来应该声明URL映射,好比
*.html代表响应是html格式的
/*将处理全部的请求
/app不解释。
推荐用这种模式
<servlet-mapping>
<servlet-name>spitter</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
下面是建立spitter-servlet.xml文件,内容
<mvc:resource>用于处理静态资源请求
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:annotaion-driven />
<context:component-scan base-package="com.habuma.spitter.mvc" />
</beans>
======================================================================
其它的, DispatcherServlet须要咨询一个或者多个处理器映射来明确的将请求分发给某个控制器。
Spring自带了多个处理器映射实现供咱们选择:
1 BeanNameUrlHandlerMapping:根据控制器bean的名字将控制器映射到URL
2 ControllerBeanNameHandlerMapping: 与BeanNameUrlHandlerMapping相似,根据控制器bean的名字将控制器映射到URL。
使用该处理器映射实现,bean的名字不须要遵循URL的约定。
3 ControllerClassNameHandlerMapping: 经过使用控制器的类名做为URL基础将控制器映射到URL
4 DefaultAnnotationHandlerMapping: 将请求映射给使用@Request-Mapping注解的控制器和控制器方法
5 SimpleUrlHandlerMapping: 使用定义在spring应用上下文的属性集合将控制器映射到URL.
使用如上这些处理器映射一般只须要在spring中配置一个bean,若是没有找处处理器映射bean
DispatcherServlet将建立使用BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping.
下面看一个例子
package com.habuma.spitter.mvc;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* @Controller是@Component注解的一种具体化,<context:component-scan>将查找使用@Component注解的类
* 并注册为Bean.因此须要在spitter-servlet.xml中配置
* <context:component-scan base-package="com.habuma.spitter.mvc" />
*/
@Controller
public class HomeController {
public static final int DEFAULT_SPITTLES_PER_PAGE = 25;
private SpitterService spitterService;
@Inject
public HomeController(SpitterService spitterService) {
this.spitterService = spitterService;
}
@RequestMapping({ "/", "/home" })
public String showHomePage(Map<String, Object> model) {
model.put("spittles",
spitterService.getRecentSpittles(DEFAULT_SPITTLES_PER_PAGE));
return "home";
}
}
剩下的任务是视图渲染jsp,Velocity或者FreeMarker.
DispatcherServlet会查找一个视图解析器将"home"转化成实际视图。
实际上,视图解析器的工做就是将名字与org.springframework.web.servlet.View的实现相匹配。
视图解析器 描述
BeanNameViewResolver 查找<bean>ID与逻辑视图名称相同View的实现。
ContentNegotiatingViewResolver 委托给一个或者多个视图解析器,而选择哪个取决于请求的内容类型
FreeMakerViewResolver 查找一个基于FreeMaker的模板,它的路径根据加完前缀和后缀的逻辑视图名称来肯定
InternalResourceViewResolver 在web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来肯定 ,好比/WEB-INF/views/home.jsp
JasperReportsViewResolver 根据加完前缀和后缀的逻辑视图名称来查找一个JasperReport报表文件
ResourceBundleViewResolver 根据属性文件来查找view实现
TilesViewResolver 查找经过Tiles模板定义的视图,模板的名字与逻辑视图名称相同
UrlBasedViewResolver 这是一些其余视图解析器的基类,能够单独使用,可是没有它的子类强大,例如:UrlBasedViewResolver不能基于当前的语言环境来解析视图。
VelocityLayoutViewResolver 它是 VelocityViewResolver的子类,它支持经过spring的VelocityLayoutView来进行页面的组合
VelocityViewResolver 解析基于Velocity的视图,Velocity模板的路径根据加完前缀和后缀的逻辑视图名来肯定。
XmlViewResolver 查找在XML文件(/WEB-INF/views.xml)中声明的view实现,这个视图解析器与BeanNameViewResolver很相似,可是在这里
视图<bean>的声明与应用程序spring上下文的其它<bean>是分开的。
XsltViewResolver 解析基于XSLT的视图,XSLT样式表的路径根据加完前缀和后缀的逻辑视图名称来肯定。
因此对于spitter-servlet.xml中能够这么配置
针对:InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--若是jsp使用了一些JSTL标签-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp" />
</bean>
==========================
在另一个地方也能够加载配置文件,在web.xml中
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
为了给ContextLoaderListener 指定一个或者多个spring配置文件,要在servlet上下文中配置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spitter-security.xml
classpath:service-context.xml
classpath:persistence-context.xml
classpath:dataSource-context.xml
</param-value>
</context-param>
一个例子:
package com.habuma.spitter.mvc;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* @Controller是@Component注解的一种具体化,<context:component-scan>将查找使用@Component注解的类
* 并注册为Bean.因此须要在spitter-servlet.xml中配置
* <context:component-scan base-package="com.habuma.spitter.mvc" />
*/
@Controller
public class HomeController {
public static final int DEFAULT_SPITTLES_PER_PAGE = 25;
private SpitterService spitterService;
@Inject
public HomeController(SpitterService spitterService) {
this.spitterService = spitterService;
}
@RequestMapping({ "/", "/home" })
public String showHomePage(Map<String, Object> model) {
model.put("spittles",
spitterService.getRecentSpittles(DEFAULT_SPITTLES_PER_PAGE));
return "home";
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>spitter</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spitter</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
===spitter-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"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<mvc:resources mapping="/resources/**" location="/resources/" />
<context:component-scan base-package="com.habuma.spitter.mvc" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp" />
</bean>
</beans>
package com.habuma.spitter.mvc;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/spitter")
/*
* 上面是根URL路径
*/
public class SpitterController {
private SpitterService spitterService=null;
@Inject
public SpitterController(SpitterService spitterService) {
this.spitterService = spitterService;
}
@RequestMapping(value="/spittles",method=RequestMethod.GET)
public String listSpittlesForSpitter(
@RequestParam("spitter") String username,Model model){
///获取数据
model.addAttribute(data);
return "xxxxxx";
}
}
----------------其它
@RequestMapping(method=RequestMethod.GET,params="new")
public String createSplitterProfile(Model model){
model.addAllAttributes(xxx);
return "viewOfYourName";
}对应着类级别的路径,包含new参数。
@RequestMapping(method=RequestMethod.POST)
public String addSpitterFromForm(@Valid Spitter spitter,BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "xxx";
}
//保存数据的逻辑
return "redirect:/spiiters/xxx";//重定向
}
@RequestMapping(value="/{username}",method=RequestMethod.GET)
public String showSpitterProfile(@PathVariable String username,Model model){
...
return "viewName";
} 好比/username/habuma.
其实仍是使用play框架更方便!
Spring这玩意还真是折腾啊!
---关于校验
@Size(min=3,max=20,message="Username must be between 3 and 20 characters long.")
@Pattern(regexp="^[a-zA-Z0-9]+$",message="username must be alphanumeric with no space")
private String username;