0
点赞
收藏
分享

微信扫一扫

【Java22】springMVC

舟海君 2022-04-04 阅读 41
spring

文章目录


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">
             &lt;!&ndash; 配置sqlSessionFactory对象 &ndash;&gt;
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
             &lt;!&ndash; 配置接口的全路径&ndash;&gt;
        <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>

在这里插入图片描述

举报

相关推荐

0 条评论