今天内容安排
1:springmvc
2:整体架构介绍
3、hello world
4、注解
5、如何配置springmvc的访问路径
6、如何接受用户传递过滤的参数
7、json的处理
8、spring的拦截器
9、文件上传。
接收请求,接收参数,返回结果
-
springMVC简介
高内聚,低耦合
可扩展性太差
反复迭代
-
mvc回顾
-
springmvc 整体架构
1、用户发起请求到控制器 DispatcherServlet(前端控制器)
2、前端控制器去handlerMapper查找Handler对象
3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)
4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象
5、Handler处理具体的业务逻辑
6、Handler处理完业务逻辑之后,返回ModelAndView 其中的View是视图名称
7、将ModelAndView返回前端控制器
8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图
9、返回真正的View 视图对象
10、渲染视图
11、返回用户响应
-
第一个springmvc的案例
-
创建一个maven工程
-
-
引入主pom
注意:如果引入之后项目中出现红叉,使用maven-updateProject
-
导入依赖
<!-- mvc的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<!-- Jackson Json处理工具包 springmvc 处理json数据的 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- jsp相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
-
配置maven的tomcat插件
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin </artifactId>
<configuration>
<!-- 项目运行后使用的端口号 -->
<port>8080</port>
<!-- 项目访问路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
-
编写配置文件
-
web.xml
-
1、创建web.xml
2、配置web.xml中的内容
3、添加dispatcherServlet
-
spring-mvc的配置
1、添加springmvc-servlet.xml
spring-mvc 会默认去WEB-INF的目录下。寻找${serlvet-name}-serlvet.xml的文件。
所以我们把serlvetmvc的配置文件添加到web-inf的目录下。并且名字与web.xml 中的servlet-name 相同
2、添加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:p="http://www.springframework.org/schema/p"
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.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
3、配置HandlerMapping
4、配置handlerAdapter
5、自定义Handler(controller)
在springmvc-servlet.xml 总配置Handler
6、配置视图解析器
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
7、定义视图:
hello.jsp中的内容:
-
配置启动
-
测试
-
分析第一个案例的执行过程
-
精简之后的配置
-
SpringMVC的默认配置是什么样的
默认配置:org.springframework.web.servlet路径下的/org/springframework/web/servlet/DispatcherServlet.properties文件
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
-
第一个注解程序
入门案例中的思考:
1、每个类需要继承Controller,麻烦
2、每个类只能处理一个业务逻辑,不能是controller处理多个业务逻辑。
使用注解:解决上述两个问题;
-
创建一个hello2Controller类,加上注解
-
配置扫描器springmvc-servlet.xml里
<!-- 配置扫描包,使用 @Controller注解生效 -->
<context:component-scan base-package="cn.itcast.springmvc.controller"/>
-
测试
http://localhost:8080/show1.do
-
使用推荐使用个的HandlerMapping和HandlerAdapter
<!-- 推荐使用的RequestMappingHandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 推荐使用的RequestMappingHandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
-
使用注解驱动替换推荐的配置
<!-- 配置注解驱动,会默认加载: RequestMappingHandlerAdapter RequestMappingHandlerMapping -->
<mvc:annotation-driven/>
-
测试
package cn.itcast.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value="/user")
public class MVCTestController {
@RequestMapping(value="show1")
public ModelAndView test1(){
ModelAndView mv = new ModelAndView();
mv.setViewName("hello");
mv.addObject("msg", "MVCTestController =============test1");
return mv;
}
}
-
使用RequestMapping映射请求
在SpringMVC中的众多Controller以及每个Controller的众多方法,请求是如何映射到具体的处理方法上?这个就是靠@RequestMapping完成的。
@RequestMapping既可以定义在类上也可以定义在方法上,
请求映射的规则是:
类上面的@RequestMapping.value + 方法上面的@RequestMapping.value。
-
五种映射
1、标准URL映射
2、Ant风格的URL映射
3、占位符映射
4、限制请求方法映射
5、限制参数映射
-
标准映射
测试:
-
Ant风格的URL映射
通配符
说明
?
匹配任何单字符
*
匹配0或者任意数量的字符
**
匹配0或者更多的目录
举例:
@RequestMapping("/test/*/show")
匹配:
/hello/test/a/show.do
/hello/test/b/show.do
都是有效的。
hello/test/a/b/c/show.do
代码:
测试:
配置一个 /* 在地址栏中分别输入
http://localhost:8080/demo/show1/a/test.do
http://localhost:8080/demo/show1/b/test.do
配置 /** 在地址栏输入
http://localhost:8080/demo/show2/b/a/d/test.do
http://localhost:8080/demo/show2/b/d/test.do
-
占位符映射
Url中可以通过一个或多个{xxxx}占位符映射。
通过@PathVariable("xxx")绑定到方法的入参中。
例如:
@RequestMapping("/user/{userId}/query")
请求URL:
-
限制请求方法映射
限制请求方法:
-
限定请求参数
Params里的参数编码不能有空格
-
处理方法与数据绑定(被动接受)
-
绑定servlet内置对象
-
-
@PathVariable获取占位符中的参数
-
@RequestParam
注意:当defaultValue有值的时候,required自动修改成false
未设置 defaultValue时,访问时必须带上绑定的参数,否则会报400错误
设置defaultValue后,required属性失效,会自动给出默认值( defaultValue内设置的值)
-
@CookieValue
本地存储
-
POJO对象绑定参数
SpringMVC会将请求过来的参数名和POJO实体中的属性名进行匹配,如果名称一致,将把值填充到对象中。
表单代码:
<form action="/demos/demo1.action" method="post">
<div>姓名:</div>
<div><input name="name" value="张三"/></div>
<div class="clear"></div>
<div>年龄:</div>
<div><input name="age" value="20"/></div>
<div class="clear"></div>
<div>收入:</div>
<div><input name="income" value="100000"/></div>
<div class="clear"></div>
<div>结婚:</div>
<div>
<input type="radio" name="isMarried" value="true" checked="checked"/>是
<input type="radio" name="isMarried" value="false"/>否</div>
<div class="clear"></div>
<div>兴趣:</div>
<div>
<input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
<input type="checkbox" name="interests" value="书法" checked="checked"/>书法
<input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>
-
集合List绑定
解决方案2:参考json处理。
如果方法需要接受的list集合,不能够直接在方法中书写List
List的绑定,需要将List对象包装到一个类中才能绑定
要求:表单中的name的值
要求表单name的值, 和封装的对象中的结合的属性名一致。
如下:
类:
-
springmvc 和struts2的区别
-
jsp 和jstl视图解析器
-
导入jstl的依赖
-
jsp页面
-
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>JSTL Demo</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>名称</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.userName}</td>
<td>${user.name}</td>
<td>${user.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
-
controller代码
/**
* return 集合数据到jsp页面
* @return
*/
@RequestMapping("test9")
public ModelAndView test9(){
ModelAndView mv = new ModelAndView();
List<User> userList = new ArrayList<User>();
for(Long i = 1L;i < 6L;i++){
User u = new User();
u.setId(i);
u.setuserName("楚留香"+i+"号");
u.setName("盗帅"+i+"号");
u.setAge(700);
userList.add(u);
}
mv.setViewName("users");
mv.addObject("users", userList);
return mv;
}
-
使用ResponseBody输出JSON
-
10.1 ajax请求通常返回json数据,异步方法要使用@ResponseBody注解标明返回json
-
单个对象的输出:
@RequestMapping("getUser")
@ResponseBody
public User getUser(){
User user = new User();
user.setuserName("西门吹牛");
user.setName("西门吹雪");
user.setAge(1);
return user;
}
集合的输出:
@RequestMapping("getUsers")
@ResponseBody
public List<User> getUsers(){
List<User> users = new ArrayList<User>();
for(int i =0;i<8;i++){
User user = new User();
user.setuserName("西门吹"+i+"牛");
user.setName("西门吹雪"+i);
user.setAge(i+1);
users.add(user);
}
return users;
}
-
RequestBody
代码:
测试:
-
文件上传
-
添加依赖
-
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
-
定义文件上传解析器
定义在springmvc-servlet.xml里面
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
-
代码:
package cn.itcast.springmvc.controller;
import java.io.File;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@RequestMapping("/file")
@Controller
public class FileUploadController {
/**
* 文件上传
*/
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile multipartFile)
throws Exception {
if (multipartFile != null) {
// multipartFile.getOriginalFilename() 获取文件的原始名称
multipartFile.transferTo(new File("d:\tmp\" + multipartFile.getOriginalFilename()));
}
return "success";
}
}
-
测试
-
转发和重定向
-
重定向
使用视图名字前加:redirect:/success.html
访问路径:
实际响应后路径:
-
转发:
在视图名称前加上: forward:
-
拦截器
-
拦截器执行过程
-
编写自定义拦截器
-
配置拦截器
<mvc:interceptor>
<!-- path: 拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- class:指定拦截器 -->
<bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
-
配置多个拦截器
多个拦截器执行顺序遵循 先入后出 的原则,先执行的拦截器后执行完成
<mvc:interceptors>
<mvc:interceptor>
<!-- path: 拦截请求 -->
<mvc:mapping path="/user/**"/>
<!-- class:指定拦截器 -->
<bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
-
练习重点:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 服务器启动时加载上面的DispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 尽量不要配置/*,/*会拦截静态资源
拦截以.do结尾的请求,拦截后交给DispatcherServlet处理 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
-
视图解析器配置
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
-
Springmvc注解的使用(重点)
@Controller : 注解一个控制器类,要配置注解扫描 <!-- 注解扫描 -->
<context:component-scan base-package="cn.itcast.springmvc.controller"/>
@RequestMapping(value="/**/{userid}/请求名称",method,param={}) :可以放在控制器类头,然后每个请求响应方法都应该有一个对应的mapping注解, 绝大多数时候,要求注解里的请求名称和方法名称保持一致,限定请求方式(method属性),限定请求参数(param属性),必须带某个参数或者必须不带某个参数,限定参数的值
@RequestParam(value="参数名称") :绑定请求参数,要求请求中设定的参数必须带,如果没带可以设置默认值
@RequestBody :将请求参数中的json数据转换成java对象
@ResponseBody :将返回结果java对象转换成json数据的格式返回到视图 ,通常在异步请求中使用
@PathVariable :获取请求路径占位符中的参数
-
笔记第7大项是练习的重点
-
文件上传和拦截器的定义,要求定义成功即可
-