SpringMVC

一、SpringMVC介绍

MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:

  • Model(模型):指数据模型。用于存储数据以及处理用户请求 的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属 于Model
  • View(视图):用于展示模型中的数据的,一般为jsp或html文 件
  • Controller(控制器):是应用程序中处理用户交互的部分。接 受视图提出的请求,将数据交给模型处理,并将处理后的结果交 给视图显示

1.1 前端控制器

<!--  前端控制器  -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

1.2 编码过滤器

<!--  编码过滤器  -->
<filter>
	<filter-name>encFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<filter-mapping>
    <filter-name>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1.3 SpringMVC的组件

  • DispatcherServlet:前端控制器,接受所有请求,调用其他组件
  • HandlerMapping:处理器映射器,根据配置找到方法的执行链
  • HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器
  • ViewResolver:视图解析器,找到指定视图

1.4 组件的工作流程

  • 客户端将请求发送给前端控制器
  • 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控 制器
  • 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器
  • 处理器执行方法,将结果返回给前端控制器
  • 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置
  • 视图渲染数据并将结果显示到客户端。

二、SpringMVC参数获取

  • **封装为简单数据类型:**请求参数名和方法参数名相同,即可完成自动封装

  • **封装为对象类型:**请求参数名和方法参数的属性名相同,即可完成自动封装

  • **封装关联对象:**请求参数名和方法参数的属性名相同,即可完成自动封装

    http://localhost:8080/c1/param3?id=1&name=zb&sex=femal
    e&address.info=haerbin&address.postcode=164800
    
  • 封装为集合类型:

    // 绑定简单数据类型List参数,参数前必须添加
    @RequestParam注解
    @RequestMapping("/c1/param4")
    public void listParam(@RequestParam
    List<String> users){
        System.out.println(users);
    }
    
    @RequestMapping("/c1/param5")
    public void listParam2(@RequestParam
    String[] users){
        System.out.println(users[0]);
        System.out.println(users[1]);
    }
    //http://localhost:8080/c1/param4?users=bj&users=sxt
    
    //SpringMVC不支持将参数封装为对象类型的List集合,但可以封装到有List属性的对象中
    //http://localhost:8080/c1/param6?id=1&name=zb&sex=female&address[0].info=bj&
    //     address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011
    
  • **封装为Map集合:**SpringMVC要封装Map集合,需要封装到有Map属性的对象中

    //http://localhost:8080/c1/param7?id=1&name=zb&sex=female&
    //    address[‘one’].info=bj&address[‘one’].postcode=100010&address[‘two’].info=sh&
    //    address[‘two’].postcode=100011
    
  • **使用Servlet原生对象获取参数:**HttpServletRequest 、 HttpServletResponse 、 HttpSession 等类型的参数即可直接在方法中使用

2.1 自定义参数类型转换器

  • 定义类型转换器类,实现Converter接口

    // 类型转换器必须实现Converter接口,两个泛型代表
    转换前的类型,转换后的类型
    public class DateConverter implements Converter<String, Date> {
        /**
         * 转换方法
         * @param source 转换前的数据
         * @return 转换后的数据
         */
        @Override
        public Date convert(String source) {
            SimpleDateFormat sdf = new
    SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = sdf.parse(source);
           } catch (ParseException e) {
                e.printStackTrace();
           }
            return date;
       }
    }
    
  • 注册类型转换器对象:

    <!-- 配置转换器工厂 -->
    <bean id="dateConverter"
    class="org.springframework.context.support
    .ConversionServiceFactoryBean">
        <!-- 转换器集合 -->
        <property name="converters">
            <set>
                <!-- 自定义转换器 -->
                <bean class="com.zbzzs.converter.DateConverter"></bean>
            </set>
        </property>
    </bean
        
    <!-- 使用转换器工厂 -->
    <mvc:annotation-driven conversionservice="converterFactory"></mvc:annotation-driven>
    

2.2 编码过滤器

在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处 理post请求的中文乱码

SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过 滤器即可解决中文乱码问题:

<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
<filter>
    <filter-name>encFilter</filter-name>
    <filterclass>org.springframework.web.filter.Charact
erEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

三、SpringMVC处理响应

3.1 配置视图解析器

<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.I nternalResourceViewResolver">
    <!-- 视图前缀 -->
    <property name="prefix" value="/" />
    <!-- 视图后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

3.2 控制器方法的返回值

  • 返回值为void
  • 返回值为String
  • 返回值为ModelAndView

3.3 jsp页面默认支持el表达式

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/webapp_3_1.xsd"
        version="3.1">
        
</web-app>

3.4 request域设置数据

  • 使用原生的HttpServletRequest

    @RequestMapping("/c2/hello3")
    public String
    setRequestModel(HttpServletRequest request){
        request.setAttribute("username","暴龙战神");
        return "baizhan";
    }
    
    
  • 使用Model、ModelMap

    @RequestMapping("/c2/hello4")
    public String setRequestModel2(Model model,ModelMap modelMap){
        // 使用Model将数据存入request域
        // model.addAttribute("username","暴龙战神");
        // 使用ModelMap将数据存入request域
        modelMap.addAttribute("username","暴龙战神");
        return "baizhan";
    }
    
  • 使用Map集合

    @RequestMapping("/c2/hello5")
    public String setRequestModel3(Map map){
        map.put("username","暴龙战神");
        return "baizhan";
    }
    

3.5 session域设置数据

只能使用HttpSession对象来实现

@RequestMapping("/c2/hello6")
public String setSeesionModel(HttpSession session){
    session.setAttribute("address","北京");
    return "baizhan";
}

3.6context域设置数据

需要通过HttpSession对象获取

@RequestMapping("/c2/hello7")
public String setContextModel(HttpSession session){
    ServletContext servletContext = session.getServletContext();
    servletContext.setAttribute("age",10);
    return "baizhan";
}

3.7请求转发&重定向

@RequestMapping("/c2/hello10")
public String myForward3(Model model){
    model.setAttribute("name","暴龙战神");
    // 请求转发
    return "forward:/c2/hello9";
    // 重定向
    // return "redirect:/c2/hello9";
}

四、SpringMVC注解

  • **@Controller:**将控制器交给Spring容器管理

  • **@RequestMapping:**给控制器方法设置请求路径

  • **@RequestParam:**在控制器方法中获取请求参数,名字不一样转换

    /*
        定义请求的参数名为username,默认值为sxt,不是必须的参数
    */
    @RequestMapping("/annotation2")
    public String annotation2(@RequestParam(name = "username",defaultValue = "sxt",required = false) String name){
        System.out.println(name);
        return "baizhan";
    }
    
  • **@RequestHeader:**在控制器方法中获取请求头数据

    (@RequestHeader("User-Agent") String userAgent
    
  • @CookieValue:

    @CookieValue("JSESSIONID") String jSessionId
    
  • **@SessionAttributes:**将Model模型中的数据存到session域中,类上方

  • **@ModelAttribute:**设置指定方法在控制器其他方法前执行,从Model模型中获取数据给参数赋值

    @Controller
    @RequestMapping("/c6")
    public class MyController6 {
        // 前置方法向Model中设置数据
        @ModelAttribute
        public void before(Model model){
            model.addAttribute("name","暴龙战神");
       }
        // 该参数不是从请求中获取,而是从Model中获取
        @RequestMapping("/t1")
        public String t1(@ModelAttribute("name") String name){
            System.out.println(name);
            return "baizhan";
       }
    }
    
  • **RESTful风格支持:**GET请求查询操作,POST请求新增操作,DELETE请求删除操作,PUT请求:修改操作

  • **@PathVariable:**在RESTful风格的URL中获取占位符的值

    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public void deleteStudent(@PathVariable("id") int id){
        System.out.println("删除id为"+id+"的学生");
    }
    
  • @PostMapping、@GetMapping、@PutMapping、 @DeleteMapping

  • **HiddentHttpMethodFilter:**修改post请求至uodate、delete

     <form action="/c7/put" method="post">
          <input type="hidden" name="_method" value="PUT">
          <input type="submit" value="修改">
     </form>
    
    <!-- 请求方式过滤器web.xml -->
    <filter>
        <filter-name>httpMethodFilter</filtername>
        <filterclass>org.springframework.web.filter.Hidde
    nHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>httpMethodFilter</filtername>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    
    
  • **@ResponseBody:**方法返回的对象转换为JSON格式

    <script>
       $(function () {
       $("#btn").click(function() {
           var name = $("#name").val();
           var sex = $("#sex").val();
           $.get("/c8/addStudent",{"name":name,"sex":sex},function (data){
                  console.log(data);
              });
           });
        });
     </script>
    
    <!-- 放行静态资源 SpringMVC核心配置文件-->
    <mvc:default-servlet-handler />
    
    @PostMapping("/addStudent")
    @ResponseBody
    public Result addStudent(String name, String sex) {
        // 输出接受到的参数,模拟添加学生
        System.out.println(name+":"+sex);
        // 返回添加结果
        Result result = new Result(true, "添加学生成功!");
        return result;
    }
    
    <!-- jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.0</version>
    </dependency>
    
    <dependency>  
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jacksondatabind</artifactId>
        <version>2.9.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jacksonannotations</artifactId>
        <version>2.9.0</version>
    </dependency>
    
  • **@RestController:**类下的所有控制器方法都返回JSON格式数据且不进 行跳转

  • 静态资源映射:

     <mvc:default-servlet-handler/>
    
  • **@RequestBody:**将请求中JSON格式的参数转为JAVA对象

    <script>
       $(function (){
          $("#btn").click(function(){
              varname=$("#name").val();
              varsex=$("#sex").val();
               var param = JSON.stringify({"name":name,"sex":sex});
               $.ajax({
                   url:"/c8/addStudent2",
                   contentType:"application/json",
                   type:"post",
                   data:param,
                   success:function(data){
                      console.log(data);
                   }
                })
             })
        })
     </script>
    
    

五、SpringMVC文件上传

5.1 依赖

<!-- 文件上传 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commonsfileupload</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<!-- 文件解析器对象,id名称必须是
multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 支持一次上传文件的总容量。单位:字节100M = 100*1024*1024-->
    <property name="maxUploadSize" value="104857600"/>
    <!-- 文件名的编码方式-->
    <property name="defaultEncoding" value="utf-8"/>
</bean>
<form action="/fileUpload2" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上传"/>
</form>
// MultipartFile参数名必须和JSP文件空间的name
属性一致
@RequestMapping("/fileUpload2")
public String upload2(MultipartFile file,HttpServletRequest request) throws
IOException {
    // 创建文件夹,存放上传文件
    String realPath = request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if(!dir.exists()){
        dir.mkdirs();
   }
    // 将上传的数据写到文件夹的文件中
    // 1.拿到上传的文件名
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    // 2.创建空文件
    File newFile = new File(dir,filename);
    // 3.将数据写入空文件中
    file.transferTo(newFile);
    return "index";
}

5.2多文件

<form action="/fileUpload3" method="post" enctype="multipart/form-data">
   用户名:<input name="username"/>
   文件1:<input type="file" name="files"/>
   文件2:<input type="file" name="files"/>
   <input type="submit" value="上传"/>
</form>
// 处理多文件上传,参数类型为MultipartFile数组,
参数名和JSP文件控件的name属性一致
@RequestMapping("/fileUpload3")
public String upload3(MultipartFile files[],String username,HttpServletRequest request) throws Exception {
    System.out.println(username);
    //1.设置上传文件保存的文件夹
    String realPath = request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if (!dir.exists()){
        dir.mkdirs();
    }
    //2.遍历数组,将上传文件保存到文件夹
    for(MultipartFile file:files){
        String filename = file.getOriginalFilename();
        filename = UUID.randomUUID()+"_"+filename;
        File newFile = new File(dir, filename);
        file.transferTo(newFile);
   }
    return "index";
}

5.3 异步上传

<script>
    $(function () {
        $("#btn").click(function () {
            // 异步提交表单
            $("#ajaxForm").ajaxSubmit({
                url:"/fileUpload4",
                type:"post",
                success:function (data) {
                $("#img").attr("src",data);
               }
           })
       })
   })
</script>
@RequestMapping("/fileUpload4")
//不进行页面跳转
@ResponseBody
public String upload3(HttpServletRequest request, MultipartFile file) throws
Exception {
    // 创建文件夹,存放上传文件。
    String realPath =request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if (!dir.exists()){
        dir.mkdirs();
    }
    // 拿到上传文件名
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    // 创建空文件
    File newFile = new File(dir, filename);
    // 将上传的文件写到空文件中
    file.transferTo(newFile);
    // 返回文件的路径
    return "/upload/"+filename;
}

六、SpringMVC异常处理

6.1单个Controller的异常

@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandle1(Exception ex, Model model){
        // 向模型中添加异常对象
        model.addAttribute("msg",ex);
        // 跳转到异常页面
        return "error";
}

6.2 全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
    * 异常处理方法
     *
     * @param ex   异常对象
     * @param model 模型对象
     * @return
     */
    // 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
  @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    public String exceptionHandle1(Exception ex, Model model) {
        // 向模型中添加异常对象
        model.addAttribute("msg", ex);
        // 跳转到异常页面
        return "error";
   }
    // 方法一不能处理的异常交给方法二处理
    @ExceptionHandler(java.lang.Exception.class)
    public String exceptionHandle2(Exception ex, Model model) {
        model.addAttribute("msg", ex);
        return "error2";
   }
}

七、SpringMVC拦截器

7.1 创建拦截器类

// 拦截器类
public class MyInterceptor implements
HandlerInterceptor {
    // 请求到达Controller前执行
    @Override
     public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) {
        System.out.println("请求到达 Controller前");
        // 如果return false则无法到达 Controller
        return true;
   }
    // 跳转到JSP前执行,此时可以向Request域添加数据
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("跳转到JSP前");
        request.setAttribute("name","无敌暴龙战士");
   }
    // 跳转到JSP后执行,此时已经不能向Request域 添加数据
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("跳转到JSP后");
        request.setAttribute("age",10);
     }
}

<!-- 配置拦截器-->
<mvc:interceptors>  
    <mvc:interceptor>        
        <!-- 配置拦截器的作用路径-->      
        <mvc:mapping path="/**"/>        
        <!-- 拦截器对象 -->      
        <bean class="com.zbzzs.interceptor.MyInterceptor"/>  
    </mvc:interceptor>
</mvc:interceptors>

7.2 全局拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>  
    <!-- 全局拦截器 -->    
    <bean class="com.zbzzs.interceptor.MyInterceptor"/>
</mvc:interceptors>

八、整合

8.1Spring-Mybatis整合

  1. 创建文件

  2. 引入依赖

  3. 持久层构建

  4. 映射文件SqlMapConfig.xml

  5. 业务层编写,注入持久层

  6. applicationContext.xml文件

    1. 包扫描对象
    2. 引入数据库配置文件
    3. 创建SqlSessionFactoryBean对象,其中包括:dataSource、SqlMapConfig.xml
    4. 创建自动代理对象
    
  7. 测试项目

8.2 SSM整合

  1. 创建父级项目,引入依赖

    <!--  1. mybatis、druid、mysql驱动包   -->
    <!--  2. Spring核心、jdbc、tx、text,springweb、mvcweb,aspectJ   -->
    <!--  3. mybatis-Spring   -->
    <!--  4. junit,log4j   -->
    <!--  5. taglibspec、impl   -->
    <!--  6. servlet-api、jsp-api   -->
    <!--  7. tomcat插件   -->
    
    <properties>
            <!--Spring版本-->
            <spring.version>5.2.12.RELEASE</spring.version>
        </properties>
    
    
        <dependencies>
            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.26</version>
            </dependency>
            <!--  druid连接池  -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.8</version>
            </dependency>
            <!-- MyBatis与Spring的整合包-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.6</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- springmvc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- 事务 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.7</version>
            </dependency>
            <!-- jstl -->
            <dependency>
                <groupId>org.apache.taglibs</groupId>
                <artifactId>taglibs-standard-spec</artifactId>
                <version>1.2.5</version>
            </dependency>
            <dependency>
                <groupId>org.apache.taglibs</groupId>
                <artifactId>taglibs-standard-impl</artifactId>
                <version>1.2.5</version>
            </dependency>
            <!-- servlet -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <!-- jsp -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.0</version>
                <scope>provided</scope>
            </dependency>
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <!-- tomcat插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <port>8888</port>
                        <path>/</path>
                        <uriEncoding>UTF-8</uriEncoding>
                        <server>tomcat7</server>
                        <systemProperties>
                            <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n
                            </java.util.logging.SimpleFormatter.format>
                        </systemProperties>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    
    
  2. 编写持久层、创建实体类

  3. 编写资源文件:数据库配置文件

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql:///student
    jdbc.username=root
    jdbc.password=root
    
  4. 编写资源文件:log4j配置文件,log4j.properties

    log4j.rootCategory=debug, CONSOLE, LOGFILE
    
    log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
    
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=[%d{MM/dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m\n
    
  5. 编写资源文件:SqlMapConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    </configuration>
    
    
  6. 编写资源文件:applicationContext-dao.xml

    <!--  1. 包扫描对象  -->
    <!--  2. 配置文件  -->
    <!--  3. SqlSession工厂  -->
    <!--  4. 自动代理对象  -->
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context
                  http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 读取数据库配置文件  -->
        <context:property-placeholder location="classpath:druid.properties"></context:property-placeholder>
    
    
        <!--  配置数据源  -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}"></property>
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
    
    
        <!--  SqlSessionFactory  -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
        </bean>
    
    
        <!-- 配置扫描包对象,为包下的接口创建代理对象  -->
        <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.zzbzs.dao"></property>
        </bean>
    </beans>
    
    
  7. 持久层测试

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:applicationContext-dao.xml")
    public class StudentDaoTest {
    
        @Autowired
        private StudentDao studentDao;
        @Test
        public void testFindAll(){
            List<Student> all = studentDao.findAll();
            all.forEach(System.out::println);
        }
    
    
        @Test
        public void testAdd(){
            Student student = new Student(0, "SXT", "女", "上海");
            studentDao.add(student);
        }
    }
    
  8. 编写业务层

  9. 引入持久层依赖

  10. 编写Service方法,自动注入Dao

  11. 配置applicationContext-service.xml

     <!--1. 包扫描-->
     <!--2. 创建事务管理器-->
     <!--3. 编写通知,切面-->
     <!-- 事务管理器 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!-- 通知 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
        <!-- 切面 -->
        <aop:config>
            <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.zzbzs.service.*.*(..))"></aop:advisor>
        </aop:config>
    
  12. 编写控制层,web模板

  13. 引入父级,service依赖

  14. 编写控制器

  15. 编写springmvc.xml

    <!-- 1. 包扫描  -->
    <!-- 2. 视图解析器  -->
    <!-- 3. 开启mvc注解支持  -->
    <!-- 4. 放行静态资源  -->
    
    <!-- 扫描Controller包 -->
        <context:component-scan base-package="com.zzbzs.control"/>
    
    
        <!-- 配置视图解析器 -->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 开启SpringMVC注解的支持 -->
        <mvc:annotation-driven/>
        <!-- 放行静态资源 -->
        <mvc:default-servlet-handler />
    
  16. 整合引入配置文件applicatonContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        <import resource="applicationContext-dao.xml"></import>
        <import resource="applicationContext-service.xml"></import>
    
    </beans>
    
  17. 配置web.xml

     <!--   1. 前端控制器   -->
     <!--   2. 编码过滤器   -->
     <!--   3. 创建spring监听器,不必在自己创建   -->
     <!--   4. 请求方式过滤器   -->
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    
      <!-- 创建spring容器的监听器 -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
    
        <!--  请求方式过滤器  -->
        <filter>
            <filter-name>httpMethodFilter</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>httpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
      <!--前端控制器-->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    
      <!--编码过滤器-->
      <filter>
        <filter-name>encFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
      <display-name>Archetype Created Web Application</display-name>
    </web-app>
    
    
  18. 编写jsp页面

  19. maven运行父项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值