文章目录
- 1. MVC
- 2.入门
- 3.springMVC组件
- 4.配置文件
- 5.前端
- 6.controller
- 7.domain
- 8.exception
- 9.intercepors
- 10.配置文件
- 11.mapper
- 12.test
- 13.domian
- 14.service
- 15.control
- 16.前端
1. MVC
视图V不涉及业务代码编写,如jsp只利用jstl标签把转发的数据展示出来,如html哪怕发ajax请求,也是请求数据,拿到数据后各种dom操作显示在页面上。
如下DispatcherServlet类似BaseServlet(接受所有请求),以前Servlet接受请求要写request.getparameter,SpringMVC中直接在方法上声明一个参数就能接收到请求中参数。以前获取表单数据
最终封装成一user对象,要先获取所有请求参数再手动封装一下,SpringMVC中在方法上声明一个user类型参数就可以了,让C和V变的更加的简单了。
2.入门
如下不涉及dao层的开发,核心控制器要调具体处理器处理我们请求,所以自定义处理器。
2.1 配置文件:pom.xml,web.xml,SpringMVC.xml
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>springMVC_day01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!--web工程打war包-->
<dependencies>
<!--springmmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
<!--jsp相关-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="3.0">
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
//SpringMVC.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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.itheima.controller"></context:component-scan>
<!-- 注解驱动,采用注解方式的映射器和适配器,支持默认json的一些解析配置 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置springMVC的视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图地址的后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 配置视图地址的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
</bean>
</beans>
2.2 前端:hello.jsp
如下hello.jsp在WEB-INF里面,浏览器发请求访问不到,只能通过java代码访问。
//hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello springMVC!!!</h1>
${sessionScope.msg}
</body>
</html>
2.3 domain:User.java
package com.itheima.domain;
import java.util.Arrays;
public class User {
private String name;
private int age;
private boolean isMarry;
private double income;
private String[] interests;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarry() {
return isMarry;
}
public void setIsMarry(boolean marry) {
isMarry = marry;
}
public double getIncome() {
return income;
}
public void setIncome(double income) {
this.income = income;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", isMarry=" + isMarry +
", income=" + income +
", interests=" + Arrays.toString(interests) +
'}';
}
}
2.4 controller:MyController.java
package com.itheima.controller;
import com.itheima.domain.User;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
//springMVC为什么把Controller单独出来用一个servlet,和上一节spring监听器有关,
//servlet一些service不能以注解方式开发,并且属性的装配不能通过XML去配,
//因为servlet是tomcat创建,不是spring管理,这时有一个其他类处理请求,
//这个类就可以由我们spring创建和管理,里面的属性注入就可以xml或注解直接注入了。
@Controller
//@RequestMapping("/user") //如果写在类上,就是表示父级路径
public class MyController {
/**
* @RequestMapping : 用来声明请求的地址的。
* 如果写在类上,表示当前处理器里面的所有请求在访问时,都要加上父级路径。
*/
//这是一个用来处理请求的方法, .do可以省略。核心控制器只接受请求并分发给如下方法处理
@RequestMapping("demo1.do")// 定义如下方法处理哪个请求地址
public ModelAndView demo1(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","springMVC后台的消息");
//设置视图名 前缀+视图名+后缀在SpringMVC.xml中
modelAndView.setViewName("hello");
return modelAndView;
}
/**
* ant风格:
* ? : 匹配单个字符,必须要有一个字符。
* * : 匹配任意多个字符,包含了0个,
* ** : 匹配任意多级路径
*/
@RequestMapping("/**/demo2")
public ModelAndView demo2(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","ant风格的映射");
//设置视图名 前缀+视图名+后缀
modelAndView.setViewName("hello");
return modelAndView;
}
/**
* rest风格的映射:
* 步骤:1.请求的地址中通过{name} 了表示占位
* 2.在处理器方法中,通过@PathVariable(name) 接受地址中的内容作为参数。
* 优点:迷惑一些不懂springMVC的开发者,让他不理解传参方式。
*/
@RequestMapping("/user/{username}/{id}")
public ModelAndView demo3(@PathVariable("username") String username, @PathVariable("id") String id){
System.out.println("获取请求的地址中的参数:"+username+"::"+id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","rest风格的映射");
//设置视图名 前缀+视图名+后缀
modelAndView.setViewName("hello");
return modelAndView;
}
// method:值是一个数组,可以配置多个请求限定的方式。
@RequestMapping(value = "/demo4",method = {RequestMethod.GET,RequestMethod.POST})
public ModelAndView demo4(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","限定请求的方式");
//设置视图名 前缀+视图名+后缀
modelAndView.setViewName("hello");
//重定向到 updatePassword.jsp
//http://localhost:8080/updatePassword.jsp?username=zhang
return modelAndView;
}
/**
* params = "id" :必须携带id参数
* params = "!id" : 不允许携带id参数
* params = "id=2" : id值必须等于2
* params = "id!=2" : id值必须不等于2
* params= {"id","name=zhang"},同时限定多个请求的参数
*/
@RequestMapping(value = "/demo5",params = {"id","name=zhang"})
public ModelAndView demo5(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","限定请求中必须携带id参数");
//设置视图名 前缀+视图名+后缀
modelAndView.setViewName("hello");
//重定向到 updatePassword.jsp
// http://localhost:8080/updatePassword.jsp?username=zhang
return modelAndView;
}
/**
* @GetMapping : 用来限定发送get方式的请求
* @PostMapping: 用来限定post方式的请求
*/
@GetMapping("/demo6")
public ModelAndView demo6(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","限定请求的方式");
//设置视图名 前缀+视图名+后缀
modelAndView.setViewName("hello");
//重定向到 updatePassword.jsp
// http://localhost:8080/updatePassword.jsp?username=zhang
return modelAndView;
}
/**
* string类型的返回值,直接作为视图名来解析的
* 如果需要操作modelAndView,直接在方法中声明Model类型的变量即可。
* springMVC执行处理器时,自动帮我创建对象,并且传递进来。
*/
@RequestMapping("/demo7")
public String demo7(Model model){
model.addAttribute("msg","string类型的返回值"); //存放到request域对象中。
return "hello";
}
@ResponseStatus(HttpStatus.OK) //如果方法是void类型,必须添加这行注解
@RequestMapping("/demo8")
public void demo8(Model model){
//存放到request域对象中。
model.addAttribute("msg","void类型的返回值");
System.out.println("void类型的返回值");
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo9")
public void demo9(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
String aaa = request.getParameter("aaa");
System.out.println(aaa);
System.out.println(response);
System.out.println(session);
}
/**
* 获取请求中的参数:直接在方法中声明参数,在参数前添加注解
* @RequestParam(paramName) : 里面:
* value/name属性:参数名
* required: 参数是否是必须的。
* defaultValue:默认值,设置该参数的默认值。
* 如果填写了该属性,那么会覆盖required设置。
*
* 如果提交时,请求中的参数名和方法中声明的变量名保证一致即
* 浏览器:localhost:8080/demo10.do?username=zhangsan,
* 那么 @RequestParam 可以省略不写。
*/
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo10")
public void demo10( String username){
System.out.println("请求中的用户名:"+username);
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo11")
public void demo11(HttpServletRequest request){
Cookie[] cookies = request.getCookies(); //获取cookie的第一种方式:从request中获取
if(cookies!=null){
for(Cookie cookie:cookies){
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
}
/**
* 获取cookie中值的第二种方式:
* 方法中直接声明变量,通过在变量前添加@CookieVlalue(cookieName)注解,
*/
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo12")
public void demo12(@CookieValue("JSESSIONID") String sessionId){
System.out.println(sessionId);
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo13")
public void demo13(String name,int age,boolean isMarry,double income,String[] interests){
System.out.println("用户名:"+name);
System.out.println("年龄:"+age);
System.out.println("是否结婚:"+isMarry);
System.out.println("收入:"+income);
System.out.println("爱好:"+ Arrays.toString(interests));
}
/**
* 如果请求中的数据需要封装到user对象类型,只要保证user对象的属性名和提交时参数名一致即可。
* 注意:如果变量名开头是is,注意该属性的set方法手动改写一下。
*/
@ResponseStatus(HttpStatus.OK)
@RequestMapping("/demo14")
public void demo14(User user){
System.out.println(user);
}
}
//form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="demo14.do" method="post">
name:<input type="text" name="name"/><br/>
age:<input type="text" name="age"/><br/>
isMarry:<input type="radio" name="isMarry" value="1"/>Y
<input type="radio" name="isMarry" value="0"/>N<br>
income:<input type="text" name="income"/><br/>
interests:<input type="checkbox" name="interests" value="bb"/>basketball
<input type="checkbox" name="interests" value="fb"/>football
<input type="checkbox" name="interests" value="vb"/>vollyball<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
如下ideal控制台打印
3.springMVC组件
4.配置文件
//springMVC.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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.itheima.controller"></context:component-scan>
<!-- 默认也配置了jackson用于转换json -->
<mvc:annotation-driven>
<!-- <mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="utf-8"></property>
</bean>
</mvc:message-converters>-->
</mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置springMVC的文件解析器 -->
<!-- 配置文件上传解析器,注意,此处id必须为 multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置文件上传的最大值 -->
<property name="maxUploadSize" value="1000000"></property>
<!-- 配置上传文件的名字编码格式 -->
<property name="defaultEncoding" value="utf-8"></property>
</bean>
<bean class="com.itheima.exception.MyException"></bean>
<!-- 配置springMVC的拦截器
mvc:interceptors:声明开始配置拦截器
-->
<mvc:interceptors>
<!-- 配置一个具体的拦截器-->
<mvc:interceptor>
<!--配置拦截器需要拦截的路径
/ 表示根目录
/* 表示根目录下的任意目录。但是仅仅局限于根目录下的路径
/** **统配任意多级路径
-->
<mvc:mapping path="/demo14.do"/>
<!-- 将拦截器对象装配到spring容器中 -->
<bean class="com.itheima.intercepors.MyInterceptor1"></bean>
</mvc:interceptor>
<!-- 配置一个具体的拦截器-->
<mvc:interceptor>
<mvc:mapping path="/demo14.do"/>
<!-- 将拦截器对象装配到spring容器中 -->
<bean class="com.itheima.intercepors.MyInterceptor2"></bean>
</mvc:interceptor>
<!-- 配置一个具体的拦截器-->
<mvc:interceptor>
<mvc:mapping path="/demo14.do"/>
<!-- 将拦截器对象装配到spring容器中 -->
<bean class="com.itheima.intercepors.MyInterceptor3"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="3.0">
<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>*.do</url-pattern>
</servlet-mapping>
<!-- 配置spring提供的乱码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5.前端
//form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--<form action="/hello/show26.do" method="post">
name:<input type="text" name="userList[0].name"/><br/>
age:<input type="text" name="userList[0].age"/><br/>
isMarry:<input type="radio" name="userList[0].isMarry" value="1"/>Y
<input type="radio" name="userList[0].isMarry" value="0"/>N<br>
income:<input type="text" name="userList[0].income"/><br/>
interests:<input type="checkbox" name="userList[0].interests" value="bb"/>basketball
<input type="checkbox" name="userList[0].interests" value="fb"/>football
<input type="checkbox" name="userList[0].interests" value="vb"/>vollyball<br/>
<br>
<br>
name:<input type="text" name="userList[1].name"/><br/>
age:<input type="text" name="userList[1].age"/><br/>
isMarry:<input type="radio" name="userList[1].isMarry" value="1"/>Y
<input type="radio" name="userList[1].isMarry" value="0"/>N<br>
income:<input type="text" name="userList[1].income"/><br/>
interests:<input type="checkbox" name="userList[1].interests" value="bb"/>basketball
<input type="checkbox" name="userList[1].interests" value="fb"/>football
<input type="checkbox" name="userList[1].interests" value="vb"/>vollyball<br/>
<input type="submit" value="提交"/>
</form>-->
<form action="/demo10.do" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="text" name="password">
<input type="file" name="files" multiple="multiple">
<input type="submit">
</form>
<!--multiple多选,selected默认选中-->
<select multiple="multiple">
<option>aaaa</option>
<option selected>bbbb</option>
<option>ccc</option>
</select>
</body>
</html>
//demo.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: hxc
Date: 2019/11/26
Time: 15:03
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
this is demo jsp
<c:forEach items="${userList}" var="user">
${user.name}::::${user.age}<br/>
</c:forEach>
</body>
</html>
//error.jsp
<%--
Created by IntelliJ IDEA.
User: hxc
Date: 2019/11/26
Time: 16:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
6.controller
package com.itheima.controller;
import com.itheima.domain.User;
import com.itheima.domain.UserVo;
import com.itheima.exception.MyException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Controller
public class MyController {
@RequestMapping("demo1")
public String demo1(){
return "demo";
}
@RequestMapping("demo2")
public String demo2(@RequestParam("ids") List<String> ids){
for(String id:ids){
System.out.println(id);
}
return "demo";
}
@RequestMapping("/hello/show26.do")
public String demo3(UserVo userVo){
for(User user:userVo.getUserList()){
System.out.println(user);
}
return "demo";
}
@RequestMapping("demo4")
public String demo4(Model model){
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setName("zhangsan1");
user1.setAge(23);
User user2 = new User();
user2.setName("lisi");
user2.setAge(24);
userList.add(user1);
userList.add(user2);
model.addAttribute("userList",userList);
return "demo"; //这行就是jsp页面
}
/**
* springMVC中使用json
* 注意:1.方法上添加 @ResponseBody ,通知springMVC,返回值解析成json响应给前端
* 2.必须引入jackson依赖,因为springMVC底层默认使用的是jackson的工具转换json字符串
* 3.必须在springMVC.xml中配置注解驱动<mvc:annotation-driven></>
*/
@ResponseBody //通知springMVC,返回值解析成json响应给前端
@RequestMapping("demo5.do")
public User demo5(){
User user = new User();
user.setName("zhangsan1");
user.setAge(23);
return user;
}
@ResponseBody //通知springMVC,返回值解析成json响应给前端
@RequestMapping("demo6.do")
public List<User> demo6(){
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setName("zhangsan1");
user1.setAge(23);
User user2 = new User();
user2.setName("lisi");
user2.setAge(24);
userList.add(user1);
userList.add(user2);
return userList;
}
/**
* @RequestBody : 通知springMVC,使用默认的jackson转换工具,将请求中提交的json格式
* 的字符串参数,转换成java中的user对象。
*/
@ResponseStatus(HttpStatus.OK)//没有返回值
@RequestMapping("demo7")
public void demo7(@RequestBody User user){
System.out.println(user);
}
@ResponseStatus(HttpStatus.OK)//没有返回值
@RequestMapping("demo8")
public void demo8(@RequestBody String user){
System.out.println(user);
}
//上传通过http协议,文件通过字节方式上传,http中是字节,java代码中拿到字节,再把字节转换为对应文件,
//这些操作需要自己去做,操作麻烦,apache的commons-fileupload工具类对请求中的字节转化为文件,更方便。
/**
* 文件上传注意的细节:
* 1.请求的方式必须是post类型
* 2.上传时,文件的参数必须和@RequestParam("key")中的key一致
* 3.上传文件时,数据提交的格式必须是 multipart/form-data类型
* 4.如果上传多个文件,<input type="file" name="file" multiple="multiple">
* multiple="multiple" 表示多选
*/
@RequestMapping("demo9")
@ResponseStatus(HttpStatus.OK)
public void demo9(@RequestParam("file") MultipartFile file){ //获取key=file
String fileName = file.getOriginalFilename(); //获取原文件名
try {
file.transferTo(new File("f://"+fileName));//保存到指定的位置
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("demo10")
@ResponseStatus(HttpStatus.OK)
public void demo10(@RequestParam("files") MultipartFile[] files) throws Exception{
for(MultipartFile file:files){ //多个文件上传
String fileName = file.getOriginalFilename();
file.transferTo(new File("g://"+fileName));//保存到指定的位置
}
}
@RequestMapping("demo11")
public String demo11(){
return "redirect:demo13.do?type=redirect"; //重定向
}
@RequestMapping("demo12")
public String demo12(HttpServletRequest request){
request.setAttribute("msg","转发");
return "forward:demo13.do?type=forward";
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping("demo13")
public void demo13(String type,HttpServletRequest request){
System.out.println("类型:"+type);
if(type.equals("forward")){
Object msg = request.getAttribute("msg");
System.out.println("request域中的数据:"+msg);
}
}
@RequestMapping("demo14")
public String demo14(){
System.out.println("执行controller的方法");
return "demo";
}
}
spring有2个与web相关的包:
spring-webmvc :这个里面存放的是springmvc的核心功能
spring-web:这里面存放的是web相关的功能,例如监听器,文件上传等,而文件上传依赖apache的commons-fileupload依赖。
步骤:1.引入apache的commons-fileupload依赖
2.创建自定义控制器,使用注解@RequestParam接受MultipartFile类型的参数
3.在spring-mvc的核心配置文件中,配置文件解析器,注意文件解析器的id为固定。
4.使用谷歌的插件,模拟表单上传文件。注意数据类型为multipart/form-data
package com.itheima.controller;
import com.itheima.domain.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController // 当前类中的所有的方法的返回值全部转换成json响应给前端
public class MyController2 {
@RequestMapping("demo51.do")
public User demo5(){
User user = new User();
user.setName("zhangsan1");
user.setAge(23);
return user;
}
//通知springMVC,返回值解析成json响应给前端
@RequestMapping("demo61.do")
public List<User> demo6(){
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setName("zhangsan1");
user1.setAge(23);
User user2 = new User();
user2.setName("lisi");
user2.setAge(24);
userList.add(user1);
userList.add(user2);
return userList;
}
}
7.domain
package com.itheima.domain;
import java.util.Arrays;
public class User {
private String name;
private int age;
//需要特別注意改属性的get和set方法,需要手动改一下
private boolean isMarry;
private double income;
private String[] interests;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarry() {
return isMarry;
}
public void setIsMarry(boolean marry) {
isMarry = marry;
}
public double getIncome() {
return income;
}
public void setIncome(double income) {
this.income = income;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", isMarry=" + isMarry +
", income=" + income +
", interests=" + Arrays.toString(interests) +
'}';
}
}
package com.itheima.domain;
import java.util.List;
public class UserVo {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
8.exception
1.自定义处理器异常类,实现HandlerExceptionResolver 接口
2.在springmvc核心配置文件中注册我们自定义的异常处理器。
3.再次上传大文件测试
package com.itheima.exception;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyException implements HandlerExceptionResolver {
/**
* @param httpServletRequest 请求对象
* @param httpServletResponse 响应对象
* @param o
* @param e 出现的异常
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
System.out.println("**************:"+o); //o:是处理器方法
ModelAndView modelAndView = new ModelAndView();
if(e instanceof MaxUploadSizeExceededException){ //只处理文件上传时超出大小的异常
modelAndView.setViewName("error");
modelAndView.addObject("msg","文件上传时,不能超出100kb");
}
return modelAndView;
}
}
9.intercepors
package com.itheima.intercepors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法,在执行controller之前执行1");
return true; //如果是false,那么就拦截了。不会继续
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法,在执行controller之后,并且在视图渲染之前执行1");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法,在视图渲染之后执行1");
}
}
package com.itheima.intercepors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法,在执行controller之前执行2");
return true;//如果是false,那么就拦截了。不会继续
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法,在执行controller之后,并且在视图渲染之前执行2");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法,在视图渲染之后执行2");
}
}
package com.itheima.intercepors;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor3 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle方法,在执行controller之前执行3");
return false;//如果是false,那么就拦截了。不会继续
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法,在执行controller之后,并且在视图渲染之前执行3");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion方法,在视图渲染之后执行3");
}
}
10.配置文件
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--spring的ioc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!--spring和mybatis整合工具包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 德鲁伊连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!--spring的jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!-- springMVC的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!--spring的web相关的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--spring的事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<!--spring的aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
//UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
<!--
动态代理的开发方式:
1.namespace必须是接口的全限定名
2.id必须是方法的名字
-->
<select id="findAllUsers" resultType="User">
select * from tb_user
</select>
<insert id="addUser">
insert into tb_user(user_name,password) values(#{userName},#{password})
</insert>
<delete id="deleteUserById">
delete from tb_user where id = #{id}
</delete>
</mapper>
//mybatis-config.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>
<!-- 引入外部配置。只有在spring中写resource路径时加class path -->
<!-- <properties resource="jdbc.properties"></properties>-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 别名映射 -->
<!-- 交给spring管理-->
<!-- <typeAliases>
<package name="com.itheima.domain"></package>
</typeAliases>
-->
<!-- 数据源交给spring管理 -->
<!--<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>-->
<!-- 交给spring管理-->
<!--<mappers>-->
<!--<mapper resource="UserMapper.xml"/>-->
<!--</mappers>-->
</configuration>
//applicationContext.xml (spring核心配置文件)
<?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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.itheima.service"></context:component-scan>
<!-- 加载配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 装配数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="password" value="${jdbc.password}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="driverClassName" value="${jdbc.driverClass}"></property>
<property name="url" value="${jdbc.url}"></property>
</bean>
<!-- 创建单个mapper对象。多个只要扫描mapper包下所有接口,为每一个接口创建mapper对象-->
<!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!– 配置sqlSessionFactory对象 –>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
<!– 配置接口的全路径–>
<property name="mapperInterface" value="com.itheima.mapper.UserMapper"></property>
</bean>-->
</beans>
//applicationContext-mybatis.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">
<!-- 创建sqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 --> <!--用的德鲁伊连接池-->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定mybatis配置-->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<!-- myabtis中mapper映射文件交给spring-->
<property name="mapperLocations" value="classpath:mappers/UserMapper.xml"></property>
<!--别名映射交给spring管理-->
<property name="typeAliasesPackage" value="com.itheima.domain"></property>
</bean>
<!-- 包扫描的方式创建多个对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置sqlSessionFactory的名字 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!-- 配置扫描的mapper包-->
<property name="basePackage" value="com.itheima.mapper"></property>
</bean>
</beans>
//applicationContext-tx.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--
1.装配事务管理器
2.配置事务的策略
3.配置aop
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启注解事务-->
<tx:annotation-driven></tx:annotation-driven>
<!-- <tx:advice id="tx1">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="tx1" pointcut-ref="pt1"></aop:advisor>
</aop:config>-->
</beans>
//springMVC.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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解扫描-->
<context:component-scan base-package="com.itheima.controller"></context:component-scan>
<!-- 注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 视图解析器 org.springframework.web.servlet.view.InternalResourceViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 让dispatcherServlet放行静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
//jdbc.properties文件
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="3.0">
<!--springmvc和spring整合的话,springmvc本来就属于spring,spring介入到web工程就可以了
即spring容器随着服务器启动创建一次就行。-->
<!--spring的监听器加入到web工程中-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 乱码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springMVC的前端控制器-->
<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/springMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--
当一个请求找不到对应的servlet的时,才会找缺省的servlet
user.jsp 满足 /* 也满足 *.jsp
servlet中urlpattern3种配置方式
全路径>* 通配符>*.jsp > /(缺省配置)
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
11.mapper
package com.itheima.mapper;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
public List<User> findAllUsers();
void addUser(User user);
void deleteUserById(@Param("id") String id);
}
12.test
package com.itheima.mapper;
import com.itheima.domain.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class UserMapperTest {
private UserMapper userMapper;
//userMapper接口类型的对象,以前自己创建,整合spring后userMapper这对象和@Before里涉及到对象由spring管理。
@Before
public void setUp() throws Exception {
// //1.获取mybatis配置文件的io流对象
// InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// //2.创建sqlSessionFactory对象
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建spring的工厂
ApplicationContext ac = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
//通过工厂来获取sqlSessionFactory对象,这样写,下面3,4不禁。
// SqlSessionFactory sqlSessionFactory =(SqlSessionFactory) ac.getBean("sqlSessionFactory");
// //3.创建SqlSession对象
// SqlSession sqlSession = sqlSessionFactory.openSession(true);
// //4.创建mapper对象
// userMapper = sqlSession.getMapper(UserMapper.class);
userMapper = (UserMapper) ac.getBean("userMapper");
}
@Test
public void findAllUsers() {
List<User> userList = userMapper.findAllUsers();
for(User user:userList){
System.out.println(user);
}
}
}
13.domian
package com.itheima.domain;
import java.util.Date;
public class User {
private Long id;
private String userName; // 用户名
private String password; // 密码
private String name; // 姓名
private Integer age; // 年龄
private Integer sex; // 性别,1男性,2女性
private Date birthday; // 出生日期
private Date created; // 创建时间
private Date updated; // 更新时间
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getUpdated() {
return updated;
}
public void setUpdated(Date updated) {
this.updated = updated;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", birthday=" + birthday +
", created=" + created +
", updated=" + updated +
'}';
}
}
14.service
package com.itheima.service;
import com.itheima.domain.User;
import java.util.List;
public interface UserService {
public List<User> findAllUsers();
void addTwoUsers();
void deleteUserById(String id);
}
package com.itheima.service.impl;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper; //userMapper在容器中,直接@Autowired注入
@Override
public List<User> findAllUsers() {
return userMapper.findAllUsers();
}
@Override
public void addTwoUsers() {
User user = new User();
user.setUserName("zzzxxx");
user.setPassword("zzzxxx");
User user2 = new User();
user2.setUserName("zzzxxx2");
user2.setPassword("zzzxxx2");
userMapper.addUser(user);
int i = 1/0; //模拟异常
userMapper.addUser(user2);
}
@Override
public void deleteUserById(String id) {
userMapper.deleteUserById(id);
}
}
15.control
单独springmvc:pom.xml导入springmvc依赖,control包下创建类并且添加@Controller注解,注解就要包扫描,方法上要添加@RequestMapping,resourse文件夹里要有springmvc配置文件(里面要配注解扫描,注解驱动,视图解析器前缀和后缀)
,web.xml配过滤器和核心/前端控制器DispatcherServlet。
package com.itheima.controller;
import com.itheima.domain.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("findAllUsers")
public String findAllUsers(Model model){
List<User> userList = userService.findAllUsers(); //userList要放到jsp页面展示
model.addAttribute("userList",userList); //放到request域中
return "users";
}
@ResponseStatus(HttpStatus.OK)
@RequestMapping("addTwoUsers")
public void addTwoUsers(){
userService.addTwoUsers();
}
@RequestMapping("deleteUserById")
public String deleteUserById(@RequestParam("id") String id){
userService.deleteUserById(id);
return "redirect:findAllUsers";
}
}
16.前端
整合后dao层不用写了,UserServiceImpl装配下直接能用了,直接声明下userMapper就可以调用userMapper这对象的方法,同理control层一样。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
Created by IntelliJ IDEA.
User: zhang
Date: 2018/7/25
Time: 20:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<link rel="stylesheet" rel="stylesheet" href="/js/user.css"/>
</head>
<!--11111111111111111111111111111111111111111111111111111111111111111111111111111-->
<body>
<table class="altrowstable" id="alternatecolor">
<tr>
<th>用户编号</th>
<th>用户名</th>
<th>真实姓名</th>
<th>年龄</th>
<th>性别</th>
<th>出生日期</th>
<th>创建日期</th>
<th>更新日期</th>
<th>删除操作</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.userName}</td>
<td>${user.age}</td>
<td>${user.sex==1?"男":"女"}</td>
<td><f:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"></f:formatDate></td>
<td><f:formatDate value="${user.created}" pattern="yyyy-MM-dd hh:mm:ss"></f:formatDate> </td>
<td><f:formatDate value="${user.updated}" pattern="yyyy-MM-dd hh:mm:ss"></f:formatDate></td>
<td><a href="deleteUserById?id=${user.id}">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>