一、SpringMVC介绍
MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:
- Model(模型):指数据模型。用于存储数据以及处理用户请求 的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属 于Model
- View(视图):用于展示模型中的数据的,一般为jsp或html文 件
- Controller(控制器):是应用程序中处理用户交互的部分。接 受视图提出的请求,将数据交给模型处理,并将处理后的结果交 给视图显示
1.1 前端控制器
<!-- 前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1.2 编码过滤器
<!-- 编码过滤器 -->
<filter>
<filter-name>encFilter</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>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.3 SpringMVC的组件
- DispatcherServlet:前端控制器,接受所有请求,调用其他组件
- HandlerMapping:处理器映射器,根据配置找到方法的执行链
- HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器
- ViewResolver:视图解析器,找到指定视图
1.4 组件的工作流程
- 客户端将请求发送给前端控制器
- 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控 制器
- 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器
- 处理器执行方法,将结果返回给前端控制器
- 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置
- 视图渲染数据并将结果显示到客户端。
二、SpringMVC参数获取
-
**封装为简单数据类型:**请求参数名和方法参数名相同,即可完成自动封装
-
**封装为对象类型:**请求参数名和方法参数的属性名相同,即可完成自动封装
-
**封装关联对象:**请求参数名和方法参数的属性名相同,即可完成自动封装
http://localhost:8080/c1/param3?id=1&name=zb&sex=femal e&address.info=haerbin&address.postcode=164800
-
封装为集合类型:
// 绑定简单数据类型List参数,参数前必须添加 @RequestParam注解 @RequestMapping("/c1/param4") public void listParam(@RequestParam List<String> users){ System.out.println(users); } @RequestMapping("/c1/param5") public void listParam2(@RequestParam String[] users){ System.out.println(users[0]); System.out.println(users[1]); } //http://localhost:8080/c1/param4?users=bj&users=sxt //SpringMVC不支持将参数封装为对象类型的List集合,但可以封装到有List属性的对象中 //http://localhost:8080/c1/param6?id=1&name=zb&sex=female&address[0].info=bj& // address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011
-
**封装为Map集合:**SpringMVC要封装Map集合,需要封装到有Map属性的对象中
//http://localhost:8080/c1/param7?id=1&name=zb&sex=female& // address[‘one’].info=bj&address[‘one’].postcode=100010&address[‘two’].info=sh& // address[‘two’].postcode=100011
-
**使用Servlet原生对象获取参数:**HttpServletRequest 、 HttpServletResponse 、 HttpSession 等类型的参数即可直接在方法中使用
2.1 自定义参数类型转换器
-
定义类型转换器类,实现Converter接口
// 类型转换器必须实现Converter接口,两个泛型代表 转换前的类型,转换后的类型 public class DateConverter implements Converter<String, Date> { /** * 转换方法 * @param source 转换前的数据 * @return 转换后的数据 */ @Override public Date convert(String source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); } return date; } }
-
注册类型转换器对象:
<!-- 配置转换器工厂 --> <bean id="dateConverter" class="org.springframework.context.support .ConversionServiceFactoryBean"> <!-- 转换器集合 --> <property name="converters"> <set> <!-- 自定义转换器 --> <bean class="com.zbzzs.converter.DateConverter"></bean> </set> </property> </bean <!-- 使用转换器工厂 --> <mvc:annotation-driven conversionservice="converterFactory"></mvc:annotation-driven>
2.2 编码过滤器
在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处 理post请求的中文乱码
SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过 滤器即可解决中文乱码问题:
<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
<filter>
<filter-name>encFilter</filter-name>
<filterclass>org.springframework.web.filter.Charact
erEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、SpringMVC处理响应
3.1 配置视图解析器
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.I nternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/" />
<!-- 视图后缀 -->
<property name="suffix" value=".jsp" />
</bean>
3.2 控制器方法的返回值
- 返回值为void
- 返回值为String
- 返回值为ModelAndView
3.3 jsp页面默认支持el表达式
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/webapp_3_1.xsd"
version="3.1">
</web-app>
3.4 request域设置数据
-
使用原生的HttpServletRequest
@RequestMapping("/c2/hello3") public String setRequestModel(HttpServletRequest request){ request.setAttribute("username","暴龙战神"); return "baizhan"; }
-
使用Model、ModelMap
@RequestMapping("/c2/hello4") public String setRequestModel2(Model model,ModelMap modelMap){ // 使用Model将数据存入request域 // model.addAttribute("username","暴龙战神"); // 使用ModelMap将数据存入request域 modelMap.addAttribute("username","暴龙战神"); return "baizhan"; }
-
使用Map集合
@RequestMapping("/c2/hello5") public String setRequestModel3(Map map){ map.put("username","暴龙战神"); return "baizhan"; }
3.5 session域设置数据
只能使用HttpSession对象来实现
@RequestMapping("/c2/hello6")
public String setSeesionModel(HttpSession session){
session.setAttribute("address","北京");
return "baizhan";
}
3.6context域设置数据
需要通过HttpSession对象获取
@RequestMapping("/c2/hello7")
public String setContextModel(HttpSession session){
ServletContext servletContext = session.getServletContext();
servletContext.setAttribute("age",10);
return "baizhan";
}
3.7请求转发&重定向
@RequestMapping("/c2/hello10")
public String myForward3(Model model){
model.setAttribute("name","暴龙战神");
// 请求转发
return "forward:/c2/hello9";
// 重定向
// return "redirect:/c2/hello9";
}
四、SpringMVC注解
-
**@Controller:**将控制器交给Spring容器管理
-
**@RequestMapping:**给控制器方法设置请求路径
-
**@RequestParam:**在控制器方法中获取请求参数,名字不一样转换
/* 定义请求的参数名为username,默认值为sxt,不是必须的参数 */ @RequestMapping("/annotation2") public String annotation2(@RequestParam(name = "username",defaultValue = "sxt",required = false) String name){ System.out.println(name); return "baizhan"; }
-
**@RequestHeader:**在控制器方法中获取请求头数据
(@RequestHeader("User-Agent") String userAgent
-
@CookieValue:
@CookieValue("JSESSIONID") String jSessionId
-
**@SessionAttributes:**将Model模型中的数据存到session域中,类上方
-
**@ModelAttribute:**设置指定方法在控制器其他方法前执行,从Model模型中获取数据给参数赋值
@Controller @RequestMapping("/c6") public class MyController6 { // 前置方法向Model中设置数据 @ModelAttribute public void before(Model model){ model.addAttribute("name","暴龙战神"); } // 该参数不是从请求中获取,而是从Model中获取 @RequestMapping("/t1") public String t1(@ModelAttribute("name") String name){ System.out.println(name); return "baizhan"; } }
-
**RESTful风格支持:**GET请求查询操作,POST请求新增操作,DELETE请求删除操作,PUT请求:修改操作
-
**@PathVariable:**在RESTful风格的URL中获取占位符的值
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE) public void deleteStudent(@PathVariable("id") int id){ System.out.println("删除id为"+id+"的学生"); }
-
@PostMapping、@GetMapping、@PutMapping、 @DeleteMapping
-
**HiddentHttpMethodFilter:**修改post请求至uodate、delete
<form action="/c7/put" method="post"> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="修改"> </form>
<!-- 请求方式过滤器web.xml --> <filter> <filter-name>httpMethodFilter</filtername> <filterclass>org.springframework.web.filter.Hidde nHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>httpMethodFilter</filtername> <url-pattern>/*</url-pattern> </filter-mapping>
-
**@ResponseBody:**方法返回的对象转换为JSON格式
<script> $(function () { $("#btn").click(function() { var name = $("#name").val(); var sex = $("#sex").val(); $.get("/c8/addStudent",{"name":name,"sex":sex},function (data){ console.log(data); }); }); }); </script>
<!-- 放行静态资源 SpringMVC核心配置文件--> <mvc:default-servlet-handler />
@PostMapping("/addStudent") @ResponseBody public Result addStudent(String name, String sex) { // 输出接受到的参数,模拟添加学生 System.out.println(name+":"+sex); // 返回添加结果 Result result = new Result(true, "添加学生成功!"); return result; }
<!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jacksondatabind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jacksonannotations</artifactId> <version>2.9.0</version> </dependency>
-
**@RestController:**类下的所有控制器方法都返回JSON格式数据且不进 行跳转
-
静态资源映射:
<mvc:default-servlet-handler/>
-
**@RequestBody:**将请求中JSON格式的参数转为JAVA对象
<script> $(function (){ $("#btn").click(function(){ varname=$("#name").val(); varsex=$("#sex").val(); var param = JSON.stringify({"name":name,"sex":sex}); $.ajax({ url:"/c8/addStudent2", contentType:"application/json", type:"post", data:param, success:function(data){ console.log(data); } }) }) }) </script>
五、SpringMVC文件上传
5.1 依赖
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commonsfileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- 文件解析器对象,id名称必须是
multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 支持一次上传文件的总容量。单位:字节100M = 100*1024*1024-->
<property name="maxUploadSize" value="104857600"/>
<!-- 文件名的编码方式-->
<property name="defaultEncoding" value="utf-8"/>
</bean>
<form action="/fileUpload2" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
// MultipartFile参数名必须和JSP文件空间的name
属性一致
@RequestMapping("/fileUpload2")
public String upload2(MultipartFile file,HttpServletRequest request) throws
IOException {
// 创建文件夹,存放上传文件
String realPath = request.getSession().getServletContext().getRealPath("/upload");
File dir = new File(realPath);
if(!dir.exists()){
dir.mkdirs();
}
// 将上传的数据写到文件夹的文件中
// 1.拿到上传的文件名
String filename = file.getOriginalFilename();
filename = UUID.randomUUID()+"_"+filename;
// 2.创建空文件
File newFile = new File(dir,filename);
// 3.将数据写入空文件中
file.transferTo(newFile);
return "index";
}
5.2多文件
<form action="/fileUpload3" method="post" enctype="multipart/form-data">
用户名:<input name="username"/>
文件1:<input type="file" name="files"/>
文件2:<input type="file" name="files"/>
<input type="submit" value="上传"/>
</form>
// 处理多文件上传,参数类型为MultipartFile数组,
参数名和JSP文件控件的name属性一致
@RequestMapping("/fileUpload3")
public String upload3(MultipartFile files[],String username,HttpServletRequest request) throws Exception {
System.out.println(username);
//1.设置上传文件保存的文件夹
String realPath = request.getSession().getServletContext().getRealPath("/upload");
File dir = new File(realPath);
if (!dir.exists()){
dir.mkdirs();
}
//2.遍历数组,将上传文件保存到文件夹
for(MultipartFile file:files){
String filename = file.getOriginalFilename();
filename = UUID.randomUUID()+"_"+filename;
File newFile = new File(dir, filename);
file.transferTo(newFile);
}
return "index";
}
5.3 异步上传
<script>
$(function () {
$("#btn").click(function () {
// 异步提交表单
$("#ajaxForm").ajaxSubmit({
url:"/fileUpload4",
type:"post",
success:function (data) {
$("#img").attr("src",data);
}
})
})
})
</script>
@RequestMapping("/fileUpload4")
//不进行页面跳转
@ResponseBody
public String upload3(HttpServletRequest request, MultipartFile file) throws
Exception {
// 创建文件夹,存放上传文件。
String realPath =request.getSession().getServletContext().getRealPath("/upload");
File dir = new File(realPath);
if (!dir.exists()){
dir.mkdirs();
}
// 拿到上传文件名
String filename = file.getOriginalFilename();
filename = UUID.randomUUID()+"_"+filename;
// 创建空文件
File newFile = new File(dir, filename);
// 将上传的文件写到空文件中
file.transferTo(newFile);
// 返回文件的路径
return "/upload/"+filename;
}
六、SpringMVC异常处理
6.1单个Controller的异常
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandle1(Exception ex, Model model){
// 向模型中添加异常对象
model.addAttribute("msg",ex);
// 跳转到异常页面
return "error";
}
6.2 全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 异常处理方法
*
* @param ex 异常对象
* @param model 模型对象
* @return
*/
// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandle1(Exception ex, Model model) {
// 向模型中添加异常对象
model.addAttribute("msg", ex);
// 跳转到异常页面
return "error";
}
// 方法一不能处理的异常交给方法二处理
@ExceptionHandler(java.lang.Exception.class)
public String exceptionHandle2(Exception ex, Model model) {
model.addAttribute("msg", ex);
return "error2";
}
}
七、SpringMVC拦截器
7.1 创建拦截器类
// 拦截器类
public class MyInterceptor implements
HandlerInterceptor {
// 请求到达Controller前执行
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) {
System.out.println("请求到达 Controller前");
// 如果return false则无法到达 Controller
return true;
}
// 跳转到JSP前执行,此时可以向Request域添加数据
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("跳转到JSP前");
request.setAttribute("name","无敌暴龙战士");
}
// 跳转到JSP后执行,此时已经不能向Request域 添加数据
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("跳转到JSP后");
request.setAttribute("age",10);
}
}
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<!-- 拦截器对象 -->
<bean class="com.zbzzs.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
7.2 全局拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 全局拦截器 -->
<bean class="com.zbzzs.interceptor.MyInterceptor"/>
</mvc:interceptors>
八、整合
8.1Spring-Mybatis整合
-
创建文件
-
引入依赖
-
持久层构建
-
映射文件SqlMapConfig.xml
-
业务层编写,注入持久层
-
applicationContext.xml文件
1. 包扫描对象 2. 引入数据库配置文件 3. 创建SqlSessionFactoryBean对象,其中包括:dataSource、SqlMapConfig.xml 4. 创建自动代理对象
-
测试项目
8.2 SSM整合
-
创建父级项目,引入依赖
<!-- 1. mybatis、druid、mysql驱动包 --> <!-- 2. Spring核心、jdbc、tx、text,springweb、mvcweb,aspectJ --> <!-- 3. mybatis-Spring --> <!-- 4. junit,log4j --> <!-- 5. taglibspec、impl --> <!-- 6. servlet-api、jsp-api --> <!-- 7. tomcat插件 --> <properties> <!--Spring版本--> <spring.version>5.2.12.RELEASE</spring.version> </properties> <dependencies> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- druid连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!-- MyBatis与Spring的整合包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- springmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 事务 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <!-- jstl --> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!-- jsp --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies> <build> <plugins> <!-- tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8888</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> <server>tomcat7</server> <systemProperties> <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n </java.util.logging.SimpleFormatter.format> </systemProperties> </configuration> </plugin> </plugins> </build>
-
编写持久层、创建实体类
-
编写资源文件:数据库配置文件
jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql:///student jdbc.username=root jdbc.password=root
-
编写资源文件:log4j配置文件,log4j.properties
log4j.rootCategory=debug, CONSOLE, LOGFILE log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MM/dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m\n
-
编写资源文件:SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
-
编写资源文件:applicationContext-dao.xml
<!-- 1. 包扫描对象 --> <!-- 2. 配置文件 --> <!-- 3. SqlSession工厂 --> <!-- 4. 自动代理对象 --> <?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取数据库配置文件 --> <context:property-placeholder location="classpath:druid.properties"></context:property-placeholder> <!-- 配置数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!-- SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:SqlMapConfig.xml"></property> </bean> <!-- 配置扫描包对象,为包下的接口创建代理对象 --> <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zzbzs.dao"></property> </bean> </beans>
-
持久层测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext-dao.xml") public class StudentDaoTest { @Autowired private StudentDao studentDao; @Test public void testFindAll(){ List<Student> all = studentDao.findAll(); all.forEach(System.out::println); } @Test public void testAdd(){ Student student = new Student(0, "SXT", "女", "上海"); studentDao.add(student); } }
-
编写业务层
-
引入持久层依赖
-
编写Service方法,自动注入Dao
-
配置applicationContext-service.xml
<!--1. 包扫描--> <!--2. 创建事务管理器--> <!--3. 编写通知,切面--> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.zzbzs.service.*.*(..))"></aop:advisor> </aop:config>
-
编写控制层,web模板
-
引入父级,service依赖
-
编写控制器
-
编写springmvc.xml
<!-- 1. 包扫描 --> <!-- 2. 视图解析器 --> <!-- 3. 开启mvc注解支持 --> <!-- 4. 放行静态资源 --> <!-- 扫描Controller包 --> <context:component-scan base-package="com.zzbzs.control"/> <!-- 配置视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 开启SpringMVC注解的支持 --> <mvc:annotation-driven/> <!-- 放行静态资源 --> <mvc:default-servlet-handler />
-
整合引入配置文件applicatonContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="applicationContext-dao.xml"></import> <import resource="applicationContext-service.xml"></import> </beans>
-
配置web.xml
<!-- 1. 前端控制器 --> <!-- 2. 编码过滤器 --> <!-- 3. 创建spring监听器,不必在自己创建 --> <!-- 4. 请求方式过滤器 --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 创建spring容器的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 请求方式过滤器 --> <filter> <filter-name>httpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>httpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--前端控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--编码过滤器--> <filter> <filter-name>encFilter</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>encFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <display-name>Archetype Created Web Application</display-name> </web-app>
-
编写jsp页面
-
maven运行父项目