1. springmvc都做了什么
1.Controller为中心完成对系统流程的控制管理
2.从请求中搜集数据
3.对传入的参数进行验证
4.将结果返回给视图
5.针对不同的视图提供不同的解决方案
6.针对jsp视图技术提供标签库
7.拦截器
8.上传文件
2. spring -mvc的结构
- DispatcherServlet:中央控制器,把请求给转发到具体的控制类。
- Controller:具体处理请求的控制器(配置文件方式需要配置,注解方式不用配置)
- handlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略。
- ModelAndView:服务层返回的数据和视图层的封装类(无论是配置文件还是注解都不需要配置)。
- ViewResolver & View:视图解析器,解析具体的视
- Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作(无论是配置文件方式还是注解都需要先创建再配置)。
3.mvc模式图
4. mvc流程
5. SpringMVC相关配置
在web.xml中配置中央控制器:
<!--
中央控制器
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
springmvc的核心配置文件
文件的命名规则:中央控制器(servlet的名称)的名称+“-servlet.xml”。
其默认位置是在:WEB-INF下。如需要修改其位置,需要对其web.xml中的位置进行init初始化。
6. 三种handlerMapping映射策略
- BeanNameUrlHandlerMapping (默认)
<!-- 按着controller的name来映射寻找controller,默认存在 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
- SimpleUrlHandlerMapping
<!-- 使用简单url来映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello1.do">myController</prop>
</props>
</property>
</bean>
- ControllerClassNameHandlerMapping
<!-- 控制类的类名控制器,访问时类名首字母需要小写 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
7. 视图解析器
视图解析器时来帮助视图对Controller返回的字符串进行字符串解析,跳转到相应的页面。
8. 控制器的类别
1.ParameterizableViewController(参数控制器)
<bean name="/toIndex.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<!-- 配置你所要跳转到视图的名称 -->
<property name="viewName" value="index"></property>
</bean>
- AbstractCommandController(命令控制器)
3. FormController(表单控制器)
1.只支持post请求方式
2.表单控制器有简单的验证功能
3.如果提交失败返回表单页面,如果提交成功就跳转到成功页面
4.有收集表单数据的功能
5.日期类型转换
需要重写initBinder方法
9 拦截器
拦截器时在客户端发送请求之后,还未到到controller之前的拦截,可用于用户的登录拦截等等。
10 文件上传
上传文件配置:
<!-- bean的id是multipartResolver,不能随便定义 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 以字节为单位 -->
<property name="maxUploadSize" value="1024000"></property>
</bean>
上传前台页面编写:
其中enctype一定为multipart/form-data 复杂类型,不然后台无法接收到数据
<form action="upload/uploadPic.do" method="post" enctype="multipart/form-data">
<input type="file" name="pic">
<input type="submit" value="提交">
</form>
上传逻辑编写:
@RequestMapping("/uploadPic.do")
public String uploadPic(HttpServletRequest request) throws IOException{
//转换request,将其转成MultipartHttpServletRequest
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
//获得文件
MultipartFile file = mr.getFile("pic");
//获得文件的字节数组
byte[] fbyte = file.getBytes();
//获得当前时间的最小精度,精确到三位毫秒
String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//再加三位随机数
Random random = new Random();
for(int i = 0; i < 3; i++){
fileName = fileName + random.nextInt(10);
}
//获得文件的原始文件名
String oriFileName = file.getOriginalFilename();
//后缀
String suffix = oriFileName.substring(oriFileName.lastIndexOf("."));
//获得项目的部署路径
String realPath = request.getSession().getServletContext().getRealPath("/");
//组装图片的全路径
String picPath = realPath + "\\upload\\"+fileName+suffix;
//定义输出流
OutputStream out = new FileOutputStream(new File(picPath));
out.write(fbyte);
out.flush();
out.close();
return "success";
11 注解开发
一般情况下,项目开发中大部分都是用的注解开发,因为快捷方便。
注解配置:
<mvc:annotation-drivern/>
<context:component-scan base-package="扫描包的位置"/>
@controller:标识当前类是控制层的一个具体的实现
@requestMapping:放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的requestmapping来访问。