SpringMVC入门原理

2023-05-16

1.     Springmvc原理

1.1. 什么是springmvc

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

 

1.2. 什么是mvc

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

 

 

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.   获取到地址栏的参数

@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.导入jaskson json支持包

 

7.2. 支持JSON对象的传入

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

7.3. 支持JSON数据返回

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

使用注解:@ResponseBody

7.3.1.   返回实体自动转JSON

 

7.3.2.   返回Map自动转JSON

 

 

7.3.3.   返回集合自动转JSON

 

Google格式化工具

 

8.     文件上传与下载

8.1. Servlet文件上传

 

 

8.2. 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.2.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>

 

编写文件上传的处理方法

//单文件上传

    @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";

    }

 

 

8.2.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.3. 文件下载

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)

 

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

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

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

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实现

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";

    }

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC入门原理 的相关文章

  • 按键消抖的三种方案

    首先 xff0c 做两个假定 xff0c 以方便后面的描述 xff1a 假定按键的默认状态为0 xff0c 被按下后为1假定按键抖动时长小于20ms xff0c 也即使用20ms的消抖时间 方案1 xff1a 在按键电平稳定的情况下 xff
  • D1_1-10的阶乘求和:1!+2!+3!+......+9!+10!

    首先我们要清楚10 xff01 是什么 阶乘 xff0c 符号为n 是指从1开始依次相乘直到n eg xff1a 10 xff01 61 1 2 3 4 5 6 7 8 9 10 话不多说 xff0c 先放代码为敬 xff1a span c
  • ASK、FSK、PSK信号及其频谱

    代码 xff1a https github com LHesperus signal processing tree master Modulated 20signal 2ASK信号及其频谱 4ASK信号及其频谱 FSK信号及其频谱 4FS
  • 2022-9-20----Android----User版 打开串口抓开机日志

    分析设备无法开机或开机出现异常 xff0c 得用串口抓取开机log xff0c 但是user版默认是关闭串口的 xff0c 所以你得去 lk 把串口打开 Android 5 6的修改方法 xff1a diff span class toke
  • C# RabbitMQ(一)介绍

    什么是消息队列 顾名思义 xff0c 这是一个消息按顺序排列的集合 xff0c 遵循的是先进先出原则 xff0c 队列中存放的是Message 消息队列中间件是分布式系统中重要的组件 xff0c 主要解决应用耦合 异步消息 流量削锋等问题
  • IDEI打开主动引入功能,并排除一些包的自动引入

    欧尅了
  • dubbo

    dubbo通过官网学习 http dubbo apache org en us 一 陌生的名词解释 xff1a SPI xff1a service provider interface 服务提供机制 Hessian 是一个轻量级的RPC框架
  • 2020-09-04

    构造器 private SystemStatus try this sysStatus 61 0 transManager 61 new TransactionManager try DBTableSQL dbTable 61 new DB
  • 人脸匹配(face matching)

    以下是人脸匹配 xff08 face matching xff09 的实验报告 xff0c 实验中采用ldlib xff0c facenet xff0c arcface三种算法 xff0c 简单对比了三种算法的效果 xff0c 源代码见文章
  • 登录功能逻辑分析及部分代码实现

    1 代码书写顺序 xff1a login jsp LoginServlet LoginService LoginDao login jsp 2 loginservlet 1首先获取页面传的值 username password 2 调用us
  • mysql中可以查询英文却查不了中文或数字

    啊啊啊啊真的是阔怕 想用js 43 ajax写一个智能搜索 遇到了很多问题哦 不过这次让我很熟练的用debug了 哈哈哈哈开心 刚开始连接数据库一直没有返回值觉得好奇怪 xff01 后来大神就说是因为数据库和Java文件编码格式不一样 我试
  • springboot+JPA- - - -项目基本结构(包含ResultVOUtil自定义错误信息)

    springboot项目的整体结构 1 entity package com lz palmscore entity import javax persistence Entity import javax persistence Gene
  • TCP四次挥手

    挥手是为了终止连接 过程解释 xff1a
  • Idea上传项目到Git分支--解决Git pull failed问题

    就是上面这张图上的字 xff0c 困扰的我好苦好苦 今天我终于战败它了啊啊啊啊啊啊啊啊啊啊啊啊啊 xff01 xff01 上面这个呢 xff0c 大概就是说本地的文件和远程Git上的代码有冲突了 xff0c 可能会把你的替换掉 xff0c
  • Arch linux系统安装及顺手安装deepin桌面

    现在arch系统很多人都学着安装 xff0c 虽然手动性强但还是很好安装的 安装方式有两种 xff0c 一种是使用archinstall xff0c 可以说是个半自动 安装方法 xff0c 只要能上网 xff0c 前期设置好了 xff0c
  • 【C++服务器入门基础------4.IPC进程间通信--管道】

    大学生寒假在家过于无聊 xff0c 整理一下以前学过的知识 xff0c 顺便复习一下 xff0c 水平较低 xff0c 专业性差 xff0c 仅供参考 xff0c 不喜勿喷 xff08 反正也没人看 xff09 连续一周多出去泡妞了 xff
  • 浅谈Binder

    参考文章 xff1a https blog csdn net ly0724ok article details 117566381 ps xff1a 强烈推荐这篇文章 xff0c 写得很仔细 xff0c 图文结合 xff0c 一看就懂 xf
  • git或svn查看远程源地址

    git查看 xff1a git remote v svn 查看 svn info 转载 git或svn查看远程源地址 https www cnblogs com jiwd p 12504815 html
  • Linux登录一直报login incorrect问题及我的解决方案

    Linux登录一直报login incorrect问题及我的解决方案 打开VMware xff0c 启动虚拟机 xff0c Linux登录 xff0c 输入用户名和密码 xff0c 报Login incorrect 难道我输错了 xff1f
  • Spring-依赖注入(IOC)

    SPRING 一 依赖注入 xff08 IOC xff09 1 什么是依赖注入 xff08 1 xff09 我们经常说的控制反转 xff08 Inversion of Control IOC xff09 和依赖注入 xff08 Depend

随机推荐

  • 使用Vmware虚拟机无法ping通开发板

    文章同时发布于个人博客https www shui2000 top posts 76f723b3 html 问题详细描述 嵌入式课程中 xff0c 本人使用Vmware虚拟机运行Ubuntu22 04操作系统 xff0c 无法与开发版pin
  • 深入浅析MyBatis源码

    MyBatis 1 SqlSessionFactoryBuilder 通过build方法去解析xml配置文件 通过调用XMLConfigBuilder的parse方法将配置文件封装成一个Configuration对象 Xml节点解析 封装好
  • java 无需SSL验证的HTTP请求

    实例 如果有用请给我个赞好吗 public static Map lt String Object gt doPost String url Map lt String String gt paramaters HttpPost httpR
  • Kafta原理

    消息队列通信的模式 通过上面的例子我们引出了消息中间件 xff0c 并且介绍了消息队列出现后的好处 xff0c 这里就需要介绍消息队列通信的两种模式了 xff1a 一 点对点模式 如上图所示 xff0c 点对点模式通常是基于拉取或者轮询的消
  • MapStruct简介简单应用

    1 MapStruct 是什么 xff1f 1 1 JavaBean 的困扰 对于代码中 code JavaBean code 之间的转换 xff0c 一直是困扰我很久的事情 在开发的时候我看到业务代码之间有很多的 code JavaBea
  • SpringBoot入门案例

    基础项目该包含哪些东西 Swagger在线接口文档 CodeGenerator 代码生成器 统一返回 通用的分页对象 常用工具类 全局异常拦截 错误枚举 自定义异常 多环境配置文件 Maven多环境配置 日志配置 JenkinsFile S
  • Spring事务管理机制

    一 Spring事务管理的几种方式 xff1a Spring事务在具体使用方式上可分为两大类 xff1a 1 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 lt tx gt 和 lt aop g
  • SpringBoot 注解大全

    一 注解 annotations 列表 1 64 SpringBootApplication 包含了 64 ComponentScan 64 Configuration和 64 EnableAutoConfiguration注解 其中 64
  • Spring 中的bean 是否线程安全

    结论 xff1a 不是线程安全的 Spring容器中的Bean是否线程安全 xff0c 容器本身并没有提供Bean的线程安全策略 xff0c 因此可以说Spring容器中的Bean本身不具备线程安全的特性 xff0c 但是具体还是要结合具体
  • SpringBoot使用PageHelper分页

    一 开发准备 1 开发工具 IntelliJ IDEA 2020 2 3 2 开发环境 Red Hat Open JDK 8u256 Apache Maven 3 6 3 3 开发依赖 SpringBoot lt dependency gt
  • Windows Server 出现多个匿名登陆用户的问题解决

    1 起因 工作中需要在同一台 windows server的机器上多个用户同时使用 xff0c 遂建立多个账号 xff0c 供大家进行使用 2 问题 一段时间后发现系统特别卡顿并会死机 xff0c 查询原因后发现 xff0c 如图所示 xf
  • java锁 synchronized的使用及原理剖析

    synchronized用法有三个 修饰实例方法 修饰静态方法 修饰代码块 1 修饰实例方法 synchronized关键词作用在方法的前面 xff0c 用来锁定方法 xff0c 其实默认锁定的是this对象 public class Th
  • 面试HashMap的原理

    一般来说 xff0c java面试必不可少的菜品 xff0c 那就是 来 xff0c 讲一下HashMap的原理 那么今天就来讲一下HashMap的原理 先说一下JDK1 7跟JDK1 8对它的改变 JDK1 7之前使用的是数组加链表 xf
  • JAVA开发环境配置

    1 自己在网上下载JDK xff0c 本教程使用JDK1 6 下载好JDK后双击运行 xff0c 然后根据提示进行安装 安装好JDK后 bin xff1a 存放java可执行文件 如 xff1a javac exe java exe等等 d
  • MyEcplise_Maven搭建SSM框架

    Maven源码 链接 xff1a https pan baidu com s 1eTQMJQy 密码 xff1a 8j1q 博文中的MyEcplise 链接 xff1a https pan baidu com s 1dEdQYa 密码 xf
  • 怎么使用Linux常用命令大全

    系统信息 arch 显示机器的处理器架构 1 uname m 显示机器的处理器架构 2 uname r 显示正在使用的内核版本 dmidecode q 显示硬件系统部件 SMBIOS DMI hdparm i dev hda 罗列一个磁盘的
  • MySQL常用语句详解

    Winfrom连接网页 第一种方法 xff1a 调用本地浏览器System Diagnostics Process Start 34 https www microsoft com zh cn 34 第二种方法 xff1a 连接 strin
  • Maven搭建SSH连接Oracle数据库

    Maven工程搭建SSH连接Oracle数据库 首先在pom xml里引入jar lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmlns xsi 61 34 http
  • MyBatis简介与运用

    1 Mybatis简介 1 1 Mybatis是什么 Mybatis是一个java的持久层框架 xff0c 保存到数据库 持久化 xff1a 保存到本地文件 1 2 Mybatis的作用 操作数据库 1 3 为什么要学习mybatis 1
  • SpringMVC入门原理

    1 Springmvc原理 1 1 什么是springmvc SpringMVC是一个Spring框架内置的对MVC模式的实现 xff0c 就spring的一个子模块 1 2 什么是mvc Model view controller 模型