SSM框架整合

1.     Springmvc简介

1.1. 什么是springmvc

SpringMVC是一个Spring框架内置的对MVC模式的实现,就spring的一个子模块

 

1.2. 什么是mvc

 Model - view-controller(模型-视图-控制器),实现页面与业务代码分离

 

Model I: jsp+javabean

Model II: jsp+servlet+javabean

1.3. mvc的作用

SpringMVC就是MVC这种思想一个实现.所以作用就是实现页面代码和后台代码的分离.

 

1.4. Springmvc的配置流程

 

1.5. Springmvc的体系结构

 

2.     入门案例

2.1. 导入jar包

 

2.2. 配置核心控制器

  <!-- 配置核心控制器

    servlet加载的时候会默认会去WEB-INFO下找spring的配置文件

    默认的文件名为:<servlet名字>-servlet.xml

  -->

  <servlet>

    <servlet-name>spring</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 修改spring配置文件的路径 -->

   <init-param>

        <param-name>contextConfigLocation</param-name>

      <param-value>classpath:applicationContext-mvc.xml</param-value>

   </init-param>

     <!-- 配置tomcat启动时加载servlet-->

    <load-on-startup>1</load-on-startup>

  </servlet>

  <!-- 配置路径映射 -->

  <servlet-mapping>

      <servlet-name>spring</servlet-name>

      <!-- 映射的路径

        *.mvc  拦截 .mvc结尾的请求

        /      所有请求全部由springmvc解析 (resful风格)

        /*     如果配置了/* 返回jsp也由springmvc进行解析(不使用)

       -->

      <url-pattern>*.mvc</url-pattern>

  </servlet-mapping>

 

配置请求路径拦截的注意事项:

可以配/,此工程所有请求全部由springmvc解析

         可以配置*.mvc或者*.do,所有请求的url扩展名为*.mvc或者*.do由springmvc解析

         不可配置/* ,如果配置了/* 返回jsp也由springmvc进行解析了。

配置了

  <load-on-startup>1</load-on-startup>

  spring对象容器随项目启动

 

2.3. 配置处理器映射器和处理器适配器

 <!-- 配置处理器映射器 (HandlerMapping)

    BeanNameUrlHandlerMapping

     根据beanname属性去匹配对应的处理类 -->

  <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

 

  <!-- 配置处理器适配器(HandlerAdapter)   处理类是什么样的规则-->

  <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

 

 

 

2.4. 编写处理类

/**

     * ModelAndView 模型与视图

     */

    @Override

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        System.out.println("第一个springmvc的程序。。。。");

    /*  //请求转发

        request.setAttribute("username", "小明");

        request.getRequestDispatcher("/hellospringmvc.jsp").forward(request, response);*/

        ModelAndView modelAndView = new ModelAndView();

        //设置模型,等同于request.setAttribute

        modelAndView.addObject("username", "春哥");

        //设置响应的视图

        modelAndView.setViewName("hellospringmvc.jsp");

        returnmodelAndView;

    }

在配置文件中配置

<!-- spring管理TestController name为请求的路径 -->

  <beanid="testController"name="/hellospringmvc.mvc" class="com.ys.controller.TestController"></bean>

 

 

 

2.5. 编写测试代码

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>springmvc测试</title>

</head>

<body>

  <a href="${pageContext.request.contextPath}/hellospringmvc.mvc">测试springmvc</a>

</body>

</html>

 

3.     Springmvc核心介绍

3.1. DispathcerServlet核心控制器

DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各各组件,如果在applicationContext.xml中配置了组件则以applicationContext.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。

3.2. HandlerMapping处理器映射器

HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,

         将它们封装在HandlerExecutionChain对象中给前端控制器返回。    

3.2.1.  BeanNameUrlHandlerMapping

         BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例

3.2.2.  SimpleUrlHandlerMapping

          simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。

3.2.3.  RequestMappingHandlerMapping

         注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method

                    注解描述:

                            @RequestMapping:定义请求url到处理器功能方法的映射

3.3. HandlerAdapter处理器适配器

HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式

3.3.1.  SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。

3.3.2.  HttpRequestHandlerAdapter

HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。

3.3.3.  RequestMappingHandlerAdapter

                   注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

 

3.4. ViewResolver视图解析器

         InternalResourceViewResolver:支持JSP视图解析viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;prefix 和suffix:查找视图页面的前缀和后缀,最终视图的地址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!-- 响应的路径为前缀+viewName+后缀 -->

   <!-- 前缀 -->

   <property name="prefix" value="/"></property>

   <!-- 后缀 -->

   <property name="suffix" value=".jsp"></property>

</bean>

 

 

4.     注解开发springmvc

配置注解处理器映射器和处理器适配器

<!-- 配置包扫描 -->

<context:component-scan base-package="com.ys.controller"></context:component-scan>

 

<!-- 配置注解的处理器映射器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

 

<!-- 配置注解的处理器适配器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

 

可用如下代码代替处理器映射器和处理器适配器

<!-- 配置处理器映射器和处理器适配器

  功能更加强大:支持json等东西

 -->

<mvc:annotation-driven></mvc:annotation-driven>

 

 

在处理类中加上@RequestMapping注解

@Controller//spring扫描到该类

@RequestMapping("hello")//给该类加命名空间

publicclass HelloController{

   

    /**

     * @RequestMapping中的路径可以写成如下三种方式:

     * /sayHello.do

     * sayHello.do

     * sayHello

     */

    @RequestMapping("sayHello")

    public ModelAndView sayHello(){

        System.out.println("springmvc注解开发");

        ModelAndView modelAndView = new ModelAndView();

        modelAndView.addObject("name", "张三");

        modelAndView.setViewName("hello");

        returnmodelAndView;

    }

}

 

 

5.     @RequestMapping详解

5.1. 请求路径的设置

@RequestMapping 中的路径可以写成如下三种方式:

           /sayHello.do

          sayHello.do

          sayHello

5.2. 作为命名空间

@RequestMapping定义在类上作为命名空间

 

访问时,相应的路径必须带上命名空间

 

5.3. 两种限制

5.3.1.  method限制(请求方式的限制)

根据请求的method的值,来确定请求是否有权限方法执行方法.

 

如果不设置method限制,允许任何method的值的请求请求执行方法.

如果设置GET请求的限制,那么只能接收GET请求

    /**

     * 限制GET请求方式

     *

     * @return

     */

    @RequestMapping(value="requestmethodget",method=RequestMethod.GET)

    public String requestmethodget(){

       

        return"test.jsp";

    }

 

 

如果设置POST请求的限制,那么只能接收POST请求

/**

     * 限制POST请求方式

     *

     * @return

     */

    @RequestMapping(value="requestmethodpost",method=RequestMethod.POST)

    public String requestmethodpost(){

       

        return"test.jsp";

    }

 

同时支持两种请求方式

    /**

     * @RequestMapping参数讲解

     *   value :  请求的路径 

     *      注意事项,在注解中,如果属性为value时可以省略不写

     *   method: 请求方式的限制 get/post

     *        method=RequestMethod.POST

     *        

     * @return

     */

    @RequestMapping(value="requestmethod",method={RequestMethod.GET,RequestMethod.POST})

    public String requestmethod(){

       

        return"test.jsp";

    }

 

5.3.2.  参数限制

参数限制就是指,请求中必须包括哪些参数,或者不包括哪些参数.参数对的值的限定

 

/**

     * 请求参数的限制

     * param

     *   username     参数必须要有username

     *   !userpwd     参数中不能出现userpwd

     *   userSex=man  参数中userSex必须要有,且userSex的值为man

     *   userAge!=12  参数中userAge必须要有,且userAge的值不能为12

     * @return

     */

    @RequestMapping(value="requestparam",params={"username","!userpwd","userSex=man","userAge!=12"})

    public String requestparam(){

       

       

        return"test.jsp";

    }

 

 

6.     数据绑定

6.1. springmvc的内置对象

springMVC直接内置支持ServletAPI的方式获得和设置数据将ServletAPI中HttpServletRequest,HttpServletResponse,HttpSession这三个接口放在执行方法的参数上,

SpringMVC会自动的将请求参数与这个三个对象关联

 

6.2. SpringMVC数据的自动绑定

6.2.1.  字段的自动绑定

 SpringMVC只要将与表单name属性的字段一一对应的参数写在方法的参数里,SpringMVC会自动绑定

 

6.2.2.  实体的自动绑定

 

 

6.2.3.  数组类型自动绑定

6.3. 强制绑定数据

6.3.1.  参数的强制绑定

参数不是可以通过name属性的对应关系一一对应,为什么还需要强制绑定?

如果请求表单的属性与执行方法参数的字段不一一对应呢?就要强制绑定了.

参数的强制绑定使用注解@RequestParam

 

6.3.2.  Map的强制绑定

SpringMVC默认不支持自动将数据绑定到Map.需要使用@RequestParam强制绑定

也是使用@RequestParam注解.

6.3.3.  获取到地址栏的参数

resuful

@PathVariable

获取到路径的参数

/**

     * 如果{name}与String name1不一样,要在注解使用value绑定@PathVariable(value="name")

     * 如果{name}与String name一样就不用,直接使用@PathVariable就可以

     * @param name1

     * @return

     */

    @RequestMapping(value="{name}/find")

    public String find(@PathVariable String name){

        System.out.println("查询名字为:"+name);

        return"/hello.jsp";

    }

 

package com.ys.controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

 

/**

 * 获取到地址栏的参数

 *  地址栏中不出现问号

 *  getPathParam?id=12 ----->   getPathParam/12

 * 

 *  1.核心控制器拦截的路径必须改成   /

 *  2.@RequestMapping请求路径中定义为

 *           getPathParam/{id}

 *     {id}相当于一个名字为id的一个占位符

 *      在实际请求路径中,需要把占位符代替成具体的内容

 *  3.在对应的请求方法中如何获取到该占位符的内容呢?

 *    答:使用@PathVariable

 *   

 * @author Administrator

 *   只在方法中定义路径请求参数

 */

@Controller

public class PathParamController {

        

         @RequestMapping("getPathParam/{id}")

         public void getPathParam(@PathVariable String id){

                   System.out.println("id为:"+id);

         }

        

         @RequestMapping("getPathParamTwo/{id}/{name}")

         public void getPathParamTwo(@PathVariable String id,@PathVariable String name){

                   System.out.println("id为:"+id);

                   System.out.println("name为:"+name);

         }

 

}

 

 

6.3.4.  JSON数据强制绑定

@RequestBody

 

7.     Json支持

7.1. Json支持的两个前提条件

   1.在配置文件中配置如下代码

<mvc:annotation-driven></mvc:annotation-driven>

  2.导入jasksonjson支持包

 

7.2. 支持JSON对象的传入

@RequestBody:支持传入JSON字符串自动绑定到Java对象里面

 

7.3. Struts2对json支持

导入包

在struts.xml中配置package extends=”json-default”

对应result类型为json

public class HelloAction{

   //数据

private Useruser;

//setter/getter

 

getJson(){

  //填充User内容

}

}

7.4. 支持JSON数据返回

就是将Java对象自动转成JSON对象返回.

使用注解:@ResponseBody

7.4.1.  返回实体自动转JSON

 

7.4.2.  返回Map自动转JSON

 

 

7.4.3.  返回集合自动转JSON

 

Google格式化工具

 

8.     文件上传与下载

8.1. Servlet文件上传

fileupload

8.2. Struts2的文件上传

8.3. Springmvc放行静态资源

    <!--  放行静态资源

       location: 资源文件的位置

       mapping:访问地址映射

    -->

    <mvc:resources location="/upload/" mapping="/upload/**"></mvc:resources>

 

8.4. Springmvc文件上传

导入jar包

文件上传异常处理:

改变form表单的属性:method="post" enctype="multipart/form-data"

   <form action="${pageContext.request.contextPath}/singleFileUpload" method="post" enctype="multipart/form-data">

      <input type="file" name="uploadFile"/>

      <input type="submit" name="上传"/>

   </form>

 

需要在applicationContext.xml中配置文件上传解析器(CommonsMultipartResolver)

特别注意:给该bean配置上Id为multipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

</bean>

 

 

8.4.1.  单文件上传

导入文件上传的两个jar包

 

编写上传的form表单

 <form action="${pageContext.request.contextPath}/singleFileUpload" method="post" enctype="multipart/form-data">

      <input type="file" name="uploadFile"/>

      <input type="submit" name="上传"/>

   </form>

 

在配置文件中配置文件上传解析器

<!-- 配置文件上传解析器 -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

</bean>

 

编写文件上传的处理方法

//单文件上传

/**

     * 上传文件到本地磁盘

     * @param file

     * @return

     */

    @RequestMapping(value="singleFileUpload")

    public String singleFileUpload(MultipartFile uploadFile){

        //获取到文件上传表单域的name属性

        String name2 = uploadFile.getName();

        System.out.println(name2);

         //获取到上传的文件名

        String name = uploadFile.getOriginalFilename();

        System.out.println("上传文件的名字:"+name);

        //保存文件到本地目录

        File destDir = new File("D:/uploaddir");

        if(!destDir.exists()){//如果目录不存在则创建

            destDir.mkdirs();

        }

        //保存到目标文件

        File destFile = new File(destDir,name);

        try {

            uploadFile.transferTo(destFile);

        } catch (IllegalStateException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

      return"success";

    }

 

 

 

/**

     * 上传文件到tomcat

     * @param file

     * @return

     */

    @RequestMapping(value="fileupload2Tomcat")

    public String fileupload2Tomcat(@RequestParam("uploadFile") MultipartFile file,HttpServletRequest request){

       //获取到表单中的name属性

       String name = file.getName();

       //获取到文件名

       String filename = file.getOriginalFilename();

       //获取文件的后缀名

       String extension = FilenameUtils.getExtension(filename);

       //处理文件名

       String filenameUUID = UUID.randomUUID().toString();

       //保存的文件到项目部署路径的upload文件夹下

       String realPath = request.getServletContext().getRealPath("/");

       System.out.println(realPath);

         //判断upload文件夹是否存在,不存在则创建

       File  dirFile = new File(realPath+"upload");//目录

       if(!dirFile.exists()){

           dirFile.mkdirs();

       }

       File destFilenew File(dirFile, filenameUUID+"."+extension);

       try {

           file.transferTo(destFile);

       } catch (IllegalStateException e) {

          

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return"success";

    }

 

 

8.4.2.  多文件上传

编写上传的form表单

 <form action="${pageContext.request.contextPath}/multipartFileUpload" method="post" enctype="multipart/form-data">

        <input type="file" name="uploadFiles"/><br/>

        <input type="file" name="uploadFiles"/><br/>

        <input type="file" name="uploadFiles"/><br/>

        <input type="file" name="uploadFiles"/><br/>

        <input type="submit" name="上传"/>

   </form>

 

编写文件上传的处理方法

//多文件上传

    @RequestMapping(value="multipartFileUpload")

    public String multipartFileUpload(@RequestParam MultipartFile[] uploadFiles){

            //创建保存目录

            File destDir = new File("D:/uploaddir");

            if(!destDir.exists()){//如果目录不存在则创建

                destDir.mkdirs();

            }

            if(uploadFiles!=null){

            for(MultipartFile partFile:uploadFiles){

                 try {

                 //获取单个文件名

                 String filename = partFile.getOriginalFilename();

                 //处理重复文件的命名是UUID命名

                 //需求:以UUID作为文件名,但是后缀保留

                   //1.获取到文件的后缀名

                

                    String houzhuifilename.substring(filename.lastIndexOf("."));

                    //重新构建文件名

                    filename = UUID.randomUUID()+houzhui;

                 //构建保存的文件

                 File destFile = new File(destDir,filename);

                        partFile.transferTo(destFile);

                    } catch (IllegalStateException e) {

                        e.printStackTrace();

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

            }

            }

          return"success";

    }

 

8.5. 文件下载

1.  /** 

2.   * 文档下载 

3.   * @param fileName 

4.   * @param file 

5.   * @return 

6.   * @throws IOException 

7.   */  

8.  public ResponseEntity<byte[]> download(String fileName, File file) throws IOException{  

9.      String dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1");   

10.     HttpHeaders headers = new HttpHeaders();   

11.     headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);   

12.     headers.setContentDispositionFormData("attachment", dfileName);   

13.     return new ResponseEntity<byte[]>(org.apache.commons.io.FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);   

14. }  

进行调用:

[java] view plain copy

1.  @RequestMapping("/download")  

2.      public ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName) throws IOException {  

3.          if (fileName != null) {  

4.              //String realPath = request.getServletContext().getRealPath("resources/files/");  

5.              String realPath = "E:\\work";  

6.              File file = new File(realPath, fileName);  

7.              if (file.exists()) {  

8.                  return download(fileName, file);  

9.              }  

10.             System.out.println("====文件路径不存在");  

11.         }  

12.         return null;  

13.     }  

 

 

9.     拦截器

HandlerInterceptor  拦截器必须实现的接口

preHandle

         方法执行之前拦截

          * Object handler:拦截方法所在的Controller

          * 如果返回false,不执行接下来的方法

postHandle

         方法执行后:如果方法执行异常,这个方法就不算执行完成,出了异常这个方法就不执行。

afterCompletion

方法完成:不管报不报异常,方法总要结束的,这个结束我们称方法完成,所以异常也会执行

 

9.1. 拦截器编写

package com.ys.intercept;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

public class MyInterceptor implements HandlerInterceptor{

 

         //方法完成后调用(无论是否出现异常都会调用)

         @Override

         public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

                            throws Exception {

                   System.out.println("方法完成后调用(无论如何都会调用)");

         }

   //方法执行后:(正常结束)

         @Override

         public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

                            throws Exception {

        

                   System.out.println("方法执行后:(正常结束)");

         }

 

         //方法执行前调用,

         //如果返回值为false,将不会调用postHandle,afterCompletion。且不会执行对应的处理方法

         @Override

         public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

                   System.out.println("方法执行前调用");

                   return true;

         }

 

}

 

 

9.2. 拦截器配置

在spring的配置文件中配置:

 <!-- 配置拦截器 -->

    <mvc:interceptors>

        <mvc:interceptor>

           <!-- 配置拦截的路径 -->

            <mvc:mapping path="/interceptorTest"/>

            <!-- 配置拦截器的bean -->

            <bean class="com.ys.intercept.MyInterceptor"></bean>

        </mvc:interceptor>

    </mvc:interceptors>

 

10.SSM整合

10.1.  导入jar包

 

10.2.  先配置spring和mybatis的整合

 applicationContext.xml中的配置

    <!-- 扫描包 -->

    <context:component-scan base-package="com.ys"></context:component-scan>

    <!-- 配置注解的处理器映射器和处理器适配器

     @RequestMapping 修饰的方法当做请求的处理方法

                         注解对应的value参数作为请求的路径

    -->

    <!-- 整合mybaits(注解) -->

    <!-- 加载外部属性文件 -->

    <context:property-placeholder location="classpath:database.properties"/>

   

    <!-- 配置池c3p0数据源 -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

       <!-- 配置连接数据库的四要素 -->

       <property name="driverClass" value="${jdbc.driver}"></property>

       <property name="jdbcUrl" value="${jdbc.url}"></property>

       <property name="user" value="${jdbc.username}"></property>

       <property name="password" value="${jdbc.password}"></property>

    </bean>

   

    <!-- 配置SqlSessionFactoryBean -->

    <bean class="org.mybatis.spring.SqlSessionFactoryBean">

       <!-- 注入数据源 -->

       <property name="dataSource" ref="dataSource"></property>

       <!-- 配置mybatis的映射文件路径 -->

       <property name="mapperLocations" value="classpath:com/ys/mapper/xml/UserMapper.xml"></property>

       <!-- 配置别名(扫描包) -->

       <property name="typeAliasesPackage" value="com.ys.entity"></property>

    </bean>

   

    <!-- 配置扫描Mapper -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

         <!-- 扫描的包 -->

         <property name="basePackage" value="com.ys.mapper"></property>

    </bean>

 

10.3.   配置springmvc

applicationContext.xml中的配置

 <!-- 配置springmvc -->

    <!-- 配置处理器适配器和处理器映射器 -->

    <mvc:annotation-driven></mvc:annotation-driven>

 

Web.xml中的配置

  <!-- 配置springmvc的核心控制器 -->

  <servlet>

     <servlet-name>dispatcherServlet</servlet-name>

     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

     <!-- 配置spring配置文件的路径 -->

     <init-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

     </init-param>

     <!-- 配置tomcat启动时,加载核心控制器 -->

     <load-on-startup>1</load-on-startup>

  </servlet>

 

  <!-- 核心控制器拦截的路径配置 -->

  <servlet-mapping>

     <servlet-name>dispatcherServlet</servlet-name>

     <url-pattern>/</url-pattern>

  </servlet-mapping>

 

 

10.4.  整合log4j

加入log4j的包

加入log4j.properites的配置文件

 

10.5.  处理post提交中文乱码的问题

在web.xml中配置编码格式的过滤器

 <!-- 处理post提交中,出现的中文乱码问题

              使用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>

 

 

解决静态资源无法加载的问题

在spring配置文件中配置如下代码:

第一种方式

<!-- spring配置文件中配置不拦截静态资源 -->

      <!-- 把静态资源不让springmvc去拦截 -->

        <!--

            1

        location: 资源路径

        mapping哪些资源不被拦截

              一个字符

            *  任意长度字符

            **  任意目录下的文件

        -->

       

  <!-- <mvc:resources location="/img/" mapping="/img/**"></mvc:resources> -->

 

 

第二种方式

  <!-- 2

    把所有静态资源的管理权交回给web容器(tomcat

  -->

  <mvc:default-servlet-handler/>

 

实现用户登录和注册功能

 

10.6.  SSM整合步骤

Spring和mybatis整合

10.6.1.          导入spring和mybatis的基础jar包

 mybatis-3.3.0.jar

 mysql-connector-java-5.1.18-bin.jar

 commons-logging-1.1.3.jar

 

10.6.2.          新建空的spring配置文件

 

10.6.3.          创建实体类

10.6.4.          新建mapper.xml和mapper.java

   注意事项:mapper.xml的namespacemapper.java接口的全限定名(包名+类名)

10.6.5.          编写applicationContext.xml整合mybatis

   1.引入外部属性文件

      <context:property-placeholder location=""/>

      注意事项:在web工程中使用时,使用classpath指向类路径加载属性文件

   2.配置数据源

        导入c3p0的jar包

           c3p0-0.9.5.2.jar

mchange-commons-java-0.2.11.jar

         ComboPooledDataSource

   3.配置SqlSessionFactoryBean

         注意事项:

1.导入mybatis-spring-1.2.0.jar整合

2.mapper.java和mapper.xml文件不在同一包下:需要手动加载mapper.xml

   4.配置扫描mapper

MapperScannerConfigurer

注意事项:配置扫描包 (basePackage)

 

    <!-- 引入外部属性文件 -->

    <context:property-placeholder location="classpath:database.properties"/>

 

    <!-- 扫描注解包service -->

    <context:component-scan base-package="service"></context:component-scan>

 

    <!-- 配置c3p0数据源 -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <!-- 连接数据库的四大要素 -->

        <property name="driverClass" value="${jdbc.driver}"></property>

        <property name="jdbcUrl" value="${jdbc.url}"></property>

        <property name="user" value="${jdbc.username}"></property>

        <property name="password" value="${jdbc.password}"></property>

    </bean>

 

    <!-- .配置SqlSessionFactoryBean -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 配置数据源 -->

        <property name="dataSource" ref="dataSource"></property>

        <!-- 配置映射文件 -->

        <property name="mapperLocations" value="classpath:mapper/xml/UserMapper.xml"></property>

    </bean>

 

    <!-- 配置Mapper扫描 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

   

        <!-- 配置mapper所在的包 -->

        <property name="basePackage" value="mapper"></property>

    </bean>

 

 

10.6.6.          新建service类

     使用注解扫描的方式管理service,加载@Service注解,对应的依赖使用@Autowired注 解注入

    在配置文件中配置扫描包,扫描相应的注解

     <context:component-scan base-package=""></context:component-scan>

 

10.6.7.          测试spring整合mybatis

  导入spring-test-4.2.6.RELEASE.jar+junit4的包

   新建service测试类测试

         @RunWith(SpringJUnit4ClassRunner.class)

     @ContextConfiguration(locations="classpath:applicationContext.xml")

报错解决:


  缺失:spring-tx-4.2.6.RELEASE.jar


  缺失:spring-jdbc-4.2.6.RELEASE.jar

Springmvc整合

导入包springmvc的包

  spring-web-4.2.6.RELEASE.jar

  spring-webmvc-4.2.6.RELEASE.jar

10.6.8.          在web.xml下配置springmvc的核心控制器(DispatcherServlet

     注意事项:

1.       配置spring配置文件的路径contextConfigLocation

2.        <!-- The front controller of this Spring Web application, responsible for handling all application requests -->

3.          <servlet>

4.              <servlet-name>springDispatcherServlet</servlet-name>

5.              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

6.              <init-param>

7.                  <param-name>contextConfigLocation</param-name>

8.                  <param-value>classpath:springmvc.xml</param-value>

9.              </init-param>

10.           <load-on-startup>1</load-on-startup>

11.       </servlet>

12.      

13.       <!-- Map all requests to the DispatcherServlet for handling -->

14.       <servlet-mapping>

15.           <servlet-name>springDispatcherServlet</servlet-name>

16.           <url-pattern>/</url-pattern>

17.       </servlet-mapping>

18.      

19.      

20.       <!-- 加载spring容器 -->

21.       <!-- needed for ContextLoaderListener -->

22.       <context-param>

23.           <param-name>contextConfigLocation</param-name>

24.           <param-value>classpath:applicationContext.xml</param-value>

25.       </context-param>

26.      

27.       <!-- Bootstraps the root web application context before servlet initialization -->

28.       <listener>

29.           <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

30.       </listener>

 

10.6.9.          在springMVC.xml中配置处理器映射器和处理器适配器

     <mvc:annotation-driven></mvc:annotation-driven>   

 

    <!-- 配置处理器映射器和处理器适配器 -->

    <mvc:annotation-driven />

   

    <!-- 配置扫描包  -->

    <context:component-scan base-package="controller"></context:component-scan>

   

    <!-- 配置视图解析器  -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/WEB-INF/jsp/"></property>

       <property name="suffix" value=".jsp"></property>

 

10.6.10.     配置包扫描controller包 

 

10.6.11.     编写Controller

注意事项:

   1.在类上用@Controller注解修饰

   2.在具体的处理方法上用@RequestMapping修饰并写上对应的请求路径

9.测试springmvc配置成功

10.applicationContext.xml配置视图解析器

     InternalResourceViewResolver

   注意事项:

        1.实际上的视图名为:前缀+逻辑视图名(处理方法返回的视图名字)+后缀

      2.redirect和forward的使用

         使用了redirect和forward时,需要跳转到具体的页面,需要把该视图的完整名  称写上。否则会跳转到controller相应的请求。

      3.有/ 和没/的区别

         有/  :访问项目根目录的资源

         没/  :  访问到具体命名空间的资源

增强配置:

  1.配置log4j

      导入log4j的包log4j-1.2.17.jar

      log4j的配置文件放在resources源代码目录下

  2.解决静态资源404的问题

      <mvc:default-servlet-handler/>            

 

11. 异常处理

处理程序在运行时出现的异常

11.1.  全局异常处理

  编写异常处理类实现HandlerExceptionResolver

package com.ys.handler;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.ModelAndView;

 

publicclass MyExceptionHandler implements HandlerExceptionResolver{

 

   /**

    * request

    * response

    * handler  出现异常的目标方法

    * ex       具体的异常

    */

    @Override

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,

            Exception ex) {

        System.out.println("出现异常的目标方法:"+handler+", 异常为:"+ex.getMessage());

        returnnull;

    }

 

 

在applicationContext.xml中配置全局异常处理

<!-- 配置全局异常处理 -->

<bean class="com.ys.handler.MyExceptionHandler"></bean>

把异常处理类交给spring管理

 

11.2.  局部异常处理 

在需要处理异常的Controller中定义异常处理方法,定义了局部异常处理后,全局异常将不会进行相应的处理

并用@ExceptionHandler注解修饰该方法

    @ExceptionHandler

    public String handlerException(Exception ex){

        System.out.println("异常信息为:"+ex.getMessage());

        return"error_local";

    }

 

12.Restful支持

RESTful软件开发理念,RESTful对http进行非常好的诠释。

RESTful即Representational State Transfer的缩写。

 

原则:

 

12.1.  Url的RESFUL实现

@PathVariable

13.晨考补充知识点

13.1.  Jsp model1和model2

13.1.1.          model1

1.传统的Jsp Model 1模型

      Jsp是独立的,自主完成所有的任务.

 

2.改进的Jsp Model 1模型

 Jsp页面与JavaBeans共同协作完成任务

 

Model 1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页面身兼ViewController两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。
早期有大量ASPJSP技术开发出来的Web应用,这些Web应用都采用了Model 1架构

 

13.1.2.          model2

1.Jsp Model2中使用了三种技术JSPServletJavaBeans

Jsp负责生成动态网页,只用做显示页面。

Servl et负责流程控制,用来处理各种请求的分派。

JavaBeans负责业务逻辑,数据库的操作。

MVC

2.使用Jsp Model2的交互过程:

 

       用户通过浏览器向Web应用中的Servlet发送请求,Servlet接受到请求后实例化JavaBeans对象,调用JavaBeans对象的方法,JavaBeans对象返回从数据库中读取的数据。Servlet选择合适JSP,并且把从数据库中读取的数据通过这个JSP进行显示,最后JSP页面把最终的结果返回给浏览器。

Model 2已经是MVC设计思想下的架构,由于引入了MVC模式,使Model 2具有组件化的特点,更适用于大规模应用的开发,但也增加了应用开发的复杂程度。

Jsp Model2优点

      1.消除了Jsp Model1的缺点:

     2.该模式适合多人合作开发大型的Web项目

     3.各司其职,互不干涉

       4.有利于开发中的分工

       5.有利于组件的重用

Jsp Model2缺点

       Web项目的开发难度加大,同时对开发人员的技术要求也提高了

13.2.  通配符映射路径

什么是通配符

通配符就是使用一个符号匹配多个字符。这个匹配多个字符的符号就是通配符。

符号

说明

匹配任何一个字符

*

匹配任何长度的字符

**

匹配多级目录的路径

案例

路径

描述

 

/app/*.x

匹配(Matches)所有在app路径下的.x文件

 

/app/p?ttern

匹配(Matches) /app/pattern /app/pXttern,但是不包括/app/pttern

 

/**/example

匹配(Matches) /app/example, /app/foo/example, /example

 

/app/**/dir/file.

匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf

 

/**/*.jsp

匹配(Matches)任何的.jsp 文件

 

 

13.3.  一些其他注解的使用

@CookieValue

 获取到cookie的值

@PathVariable

 用于绑定路径变量

    /**

     * 如果{name}与String name1不一样,要在注解使用value绑定@PathVariable(value="name")

     * 如果{name}与String name一样就不用,直接使用@PathVariable就可以

     * @param name1

     * @return

     */

    @RequestMapping(value="{name}/find")

    public String find(@PathVariable String name){

        System.out.println("查询名字为:"+name);

        return"/hello.jsp";

    }

 

14.SSM案例讲解

14.1.  搭建ssm的开发环境

14.2.  实现用户登录功能

前端判空校验

未登录进入首页拦截(拦截器)

14.3.  首页用户列表功能

  分页需要的数据

   1.每一页的内容(userList)       根据分页条件查询数据库 limitbegin,size 

    begin:从第几条开始

     size:多少条数据

   2.当前页(pageIndex)        页面传到后台

   3.总条数(totalCount)           通过查询数据库过去

   4.总页数(pageCount)           计算

   5.每页显示的数量(pageSize)  默认值为5

    

  pageIndex和pageSize ------>  begin

  pageIndex=1    1-5    begin=0

  pageIndex=2    6-10   begin=5

  pageIndex=3    11-15  beigin=10

  begin = (pageIndex-1)*pageSize;

 

Foreach的使用:

   遍历集合数据

   对数字进行遍历

<c:forEach></c:forEach>

 

翻页:

 

 

@ModelAttribute("username")

 数据回显表单域

 

14.4.  新增用户功能

   前端判断字段是否为空,并且判断该用户名是否已存在数据库中。

   

Jquery-validation  jquey校验框架

 

参考网址:http://www.runoob.com/jquery/jquery-plugin-validate.html

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值