Spring MVC简单入门

Spring MVC

导入依赖(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>org.example</groupId>
  <artifactId>untitled</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>untitled Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <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>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>untitled</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- context-param在所有的servlet中都能使用,init-param只能在当前的servlet中使用,如果不在当前的servlet中使用,取的值为null -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:bean.xml</param-value>
    </init-param>
    <!-- 加载顺序 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- /表示网站下的所有请求   springMVC不适用  /* -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!-- 设置编码集  防止中文乱码 -->
  <filter>
    <filter-name>characterfilter</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>characterfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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-4.3.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd ">

    <!-- 如果遇到图片,html等静态资源,使用默认的处理器来处理,springMVC框架不过问这些东西 -->
    <mvc:default-servlet-handler/>
    <!--  或  <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>-->
<!--    <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>-->
<!--    <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>-->
    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven/>
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="com.cyj"/>
    <!-- 如果使用短视图名字(命名空间) 需要以下配置 跳转jsp页面-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>
</beans>

请求

自定义类型转换器

自定义转换类
public class StringToDateConverter implements Converter<String, Date> { 
 
 /** 
  * 用于把 String 类型转成日期类型   */ 
 	@Override
    public Date convert(String source) {
         DateFormat format = null;
         try {
             if(StringUtils.isEmpty(source)) {
                 throw new NullPointerException("请输入要转换的日期");
             }
             format = new SimpleDateFormat("yyyy-MM-dd");
             Date date = format.parse(source);
             return date;
         }catch (Exception e) {
             throw new RuntimeException("输入日期有误");
         }
 	} 
}
在bean.xml中配置类型转换器
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
      class="org.springframework.context.support.ConversionServiceFactoryBean"> 
 <!-- 给工厂注入一个新的类型转换器 -->
    <property name="converters"> 
          <array> 
           <!-- 配置自定义类型转换器 -->
              <bean class="com.itheima.web.converter.StringToDateConverter"></bean> 
          </array>
    </property> 
</bean> 
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>

常用注解

@RequestParam

https://www.cnblogs.com/tomingto/p/11377138.html

作用: 把请求中指定名称的参数给控制器中的形参赋值。

属性:

value:请求参数中的名称。

required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
在这里插入图片描述

@RequestBody

作用:

用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。

get 请求方式不适用。

属性:

required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。

@PathVariable

https://blog.csdn.net/sswqzx/article/details/84194979

作用:

用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。

url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

属性:

value:用于指定 url 中占位符名称。

 required:是否必须提供占位符。 

在这里插入图片描述

@RequestHeader

作用: 用于获取请求消息头。

属性: value:提供消息头名称 required:是否必须有此消息头

注: 在实际开发中一般不怎么用。

@CookieValue

作用: 用于把指定 cookie 名称的值传入控制器方法参数。

属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。

@ModelAttribute

https://blog.csdn.net/qq_41357573/article/details/84339866

  • 该Controller类所有方法执行前,先调用此@ModelAttribute方法,可用于注解和方法参数中。
  • @ModelAttribute注解用于将请求参数绑定到Model对象

@SessionAttribute

https://blog.csdn.net/abc997995674/article/details/80462450

在多个请求之间共用数据

响应

返回值类型

String型

直接return “success”;即可跳转页面

Void 无返回值

用转发或者重定向跳转页面

ModelAndView类型

ModelAndView mv = new ModelAndView();

mv.addObject(“username”, “张三”); 可以添加值到ModelAndView对象中:

mv.setViewName(“success”); 跳转页面

获取值

在页面上上获取使用的是 ${requestScope.属性名} 取的

转发和重定向(特殊方式)

转发:return “forward:/WEB-INF/pages/success.jsp”;

重定向:return “**redirect:**index.jsp”;

文件上传

导入依赖

<!-- https://mvnrepository.com/artifact/commons-fileupload.wso2/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

index.jsp

<form action="/fileUpload" method="post" enctype="multipart/form-data">
    名称:<inputtype="text" name="picname"/><br/>
    图片:<inputtype="file" name="uploadFile"/><br/>
	<input type="submit"value="上传"/>
</form>

控制器(controller类)

@Controller("fileUploadController")
publicclassFileUploadController {
    /*** 文件上传*/
    @RequestMapping("/fileUpload")
    public String testResponseJson(String picname,MultipartFile uploadFile,
                                   HttpServletRequest request) throwsException{
        //定义文件名
        String fileName= "";
        //1.获取原始文件名
        String uploadFileName=  uploadFile.getOriginalFilename();
        //2.截取文件扩展名
        String extendName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,
                                                   uploadFileName.length());
        //3.把文件加上随机数,防止文件重复
        String uuid= UUID.randomUUID().toString().replace("-", "").toUpperCase();
        //4.判断是否输入了文件名
        if(!StringUtils.isEmpty(picname)) {
            fileName= uuid+"_"+picname+"."+extendName;
        }else{
            fileName= uuid+"_"+uploadFileName;
        }
        System.out.println(fileName);
        //2.获取文件路径
		ServletContext context= request.getServletContext();
        String basePath= context.getRealPath("/uploads");
        //3.解决同一文件夹中文件过多问题
        String datePath= newSimpleDateFormat("yyyy-MM-dd").format(newDate());
        //4.判断路径是否存在
        File file= newFile(basePath+"/"+datePath);
        if(!file.exists()) {
            file.mkdirs();
        }
        //5.使用MulitpartFile接口中方法,把上传的文件写到指定位置
        uploadFile.transferTo(newFile(file,fileName));
        return"success";
    }
}

配置文件解析器

<!--配置文件上传解析器-->
<bean id="multipartResolver" <!--id的值是固定的-->
			class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--设置上传文件的最大尺寸为5MB -->
    <property name="maxUploadSize">
        <value>5242880</value>
    </property>
</bean>

异常处理(过滤器)

自定义异常类(SysException.java继承Exception)

package com.cyj.exception;
//千万要继承Exception类
public class SysException extends Exception{
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SysException(String message) {
        this.message = message;
    }
}

controller类

package com.cyj.controller;

import com.cyj.exception.SysException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/exception")
    public String exception() throws SysException {
        System.out.println("异常执行了");
        try {
            int i = 10/0;
        } catch (Exception e) {
            e.printStackTrace();
            //通过这里抛出指定异常
            throw new SysException(e.getMessage());
        }
        return "success";
    }
}

异常处理器(实现HandlerExceptionResolver类)

package com.cyj.exception;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截异常,并做处理
//实现HandlerExceptionResolver类,重写resolveException方法
public class CustomExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, java.lang.Exception ex) {
        ex.printStackTrace();
        SysException e = null;
        if (ex instanceof SysException){
            e = (SysException) ex;
        }else {
            e = new SysException("请联系管理员");
        }
        ModelAndView mv = new ModelAndView();
        //存入错误的提示信息
        mv.addObject("message",e.getMessage());
        //跳转页面
        mv.setViewName("error");
        return mv;
    }
}

获取异常信息(error.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${message}
</body>
</html>

配置异常处理器

<bean id="CustomExceptionResolver" class="com.cyj.exception.CustomExceptionResolver"></bean>

拦截器

拦截器原理

在这里插入图片描述

自定义拦截器类(实现HandlerInterceptor接口)

/**
* 自定义拦截器1
* @author rt
*/
public class MyInterceptor1 implements HandlerInterceptor{
    /**
    * controller方法执行前,进行拦截的方法
    * return true放行
    * return false拦截
    * 可以使用转发或者重定向直接跳转到指定的页面。
    */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler)throws Exception {
        System.out.println("拦截器执行了...");
        return true;
    }
}

配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 哪些方法进行拦截 -->
        <mvc:mapping path="/user/*"/>
        <!-- 哪些方法不进行拦截
        <mvc:exclude-mapping path=""/>
        -->
        <!-- 注册拦截器对象 -->
        <bean class="MyInterceptor1"/>
    </mvc:interceptor>
</mvc:interceptors>

HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
    1. 可以使用request或者response跳转到指定的页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    3. return false不放行,不会执行controller中的方法。
  2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
  3. 可以使用request或者response跳转到指定的页面
  4. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  5. postHandle方法是在JSP执行后执行
    1. request或者response不能再跳转页面了

配置多个拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6dlnZMN-1585744975666)(C:\Users\陈亚杰\Desktop\Spring MVC\拦截器.bmp)]

过滤器和拦截器的区别

过滤器是servlet规范中的一部分,任何java web工程都可以使用。

拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

jstl表达式循环遍历

<c:forEach items="${list}" var="account">
    ${account.toString()}
</c:forEach>

return false不放行,不会执行controller中的方法。
2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。

  1. 可以使用request或者response跳转到指定的页面
  2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  3. postHandle方法是在JSP执行后执行
    1. request或者response不能再跳转页面了

配置多个拦截器

[外链图片转存中…(img-L6dlnZMN-1585744975666)]

过滤器和拦截器的区别

过滤器是servlet规范中的一部分,任何java web工程都可以使用。

拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

jstl表达式循环遍历

<c:forEach items="${list}" var="account">
    ${account.toString()}
</c:forEach>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值