1,spring MVC的优点
1.spring mvc使用简单,学习成本低。
2.spring mvc灵活方便。
3.spring mvc能够写出很好的程序。
2,spring 的核心类与接口
DispatcherServlet -- 前置控制器
HandlerMapping接口 -- 处理请求的映射
HandlerMapping接口的实现类:
SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller
DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上
HandlerAdapter接口--处理请求映射
AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上
Controller接口 -- 控制器
实现了该接口的类是:AbstractController这个类
HandlerInterceptor 接口--拦截器
无图,我们自己实现这个接口,来完成拦截的器的工作。
ViewResolver接口的实现类
UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理
InternalResourceViewResolver类,比上面的类,加入了JSTL的支持
View接口
JstlView类
LocalResolver接口
HandlerExceptionResolver接口 --异常处理
SimpleMappingExceptionResolver实现类
ModelAndView类
3 核心流程图
4 DispatcherServlet说明
使用spring MVC 配置dispatcherServlet是第一步
可以配置多个dispatcherServlet前置控制器,在web.xml中配置,
拦截匹配的请求,Servlet拦截匹配规则要自已定义。
把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理(这些都可以通过配置文件配置Controller(Action))。以flex为例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> -->
<!-- </listener> -->
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/remoting-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/upload-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
下边是upload-config.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:flex="http://www.springframework.org/schema/flex"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/export">export</prop>
<prop key="/exportView">exportView</prop>
</props>
</property>
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>104857600</value>
</property>
<property name="maxInMemorySize">
<value>104857600</value>
</property>
</bean>
<bean name="export" class="com.dhcc.emergency.common.web.ExportController" autowire="byName"></bean>
<bean name="exportView" class="com.dhcc.emergency.common.web.ExportViewController" autowire="byName"></bean>
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.Random;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.FileOutputStream;
/**
* <p>类注释</p>
* <p>Copyright (c) 2004 Drian. All rights reserved</p>
* <p>@(#) 创建日期 二 7月 06 15:56:41</p>
* <p>@author </p>
* <p>@version 0.1 </p>
*/
public class FileUploadReturnFileNameController extends AbstractController{
private Log log = LogFactory.getLog(this.getClass());
protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception{
MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest)request;
MultipartFile file = mulRequest.getFile("Filedata");
//获取存放路径
String dir = null;
String realPath = request.getSession().getServletContext().getRealPath("/");
if(realPath.charAt(realPath.length()-1) == '/')
dir = realPath + GlobalKeys.UPLOAD_FOLD;
else
dir = realPath + File.separatorChar + GlobalKeys.UPLOAD_FOLD;
File d = new File(dir);
//如果文件夹不存在则创建
if(!d.exists()){
d.mkdir();
}
//获取系统文件名,系统文件名由当前时间的值加上3位随机生成吗构成
String systemFileName = new Long(System.currentTimeMillis()).toString()+new Random().nextInt()%1000;
String[] s = file.getOriginalFilename().split("\\.");
String suffix = "";
if(s.length>1)
suffix = s[s.length-1];
FileOutputStream io = null;
try{
io = new FileOutputStream(dir+File.separatorChar+systemFileName+"."+suffix);
io.write(file.getBytes());
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().print(systemFileName+"."+suffix+","+file.getOriginalFilename());
if(log.isDebugEnabled()){
log.debug("文件保存为"+systemFileName+"."+suffix+"上传文件名为:"+file.getOriginalFilename());
}
io.close();
}catch(Exception e){
e.printStackTrace();
response.getWriter().print("error");
}
return null;
}
}