springMVC学习笔记

一、springMVC框架的搭建

第一步:导入springMVC的jar包
第二步:书写主配置文件:springmvc.xml
第三步:启动tomcat进行测试

二、配置

1、配置web.xml文件,配置springmvc的核心控制器DispatcherServlet,/*表示拦截所有页面,可修改。

  <!-- 配置springmvc的核心控制器DispatcherServlet-->
 <!-- springmvc核心控制器 -->
  <servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 自定义servlet文件名、文件位置需要使用该参数配置 -->
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <!-- classpath: 固定写法,value填写springmvc的xml文件名 -->
   <!-- 分发器拦截的上下文-contextConfigLocation|指定servlet context配置文件的位置 -->
  <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  </servlet>
   <!--配置servlet与处理请求的映射模式,会对所有*.shtml的后缀请求处理-->
  <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/*.shtml</url-pattern>
  </servlet-mapping>

2、配置springmvc.xml 配置包扫描与注解驱动

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc  https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- bean definitions here -->
    <!-- 配置包扫描 -->
    <context:component-scan base-package="com.mpmanyu.controller"></context:component-scan>
    <!-- 加入springmvc特有的注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

三、springmvc常用注解

约定,使用springMVC框架控制器命名为 xxxController,就像之前使用servlet做控制器时,命名为xxxServlet一样 ,如果为xxxAction一般是使用structs框架。

1,@Controller 添加了这个注解就相当于这个方法是一个servlet了

@Controller  //将一个普通类通过controller注解,则普通类变为servlet
public class FrontServlet

例如:

@Controller
public class FrontController {

    @RequestMapping(value="/login.shtml")
    public String login() {
        System.out.println("你好,登录中。");
        return ("login/success.jsp");
    }
}

2,@RequestMapping :
value可同时配置多个值,逗号隔开。例如@RequestMapping( value={"dd.shtml","index.shtml"}

@RequestMapping(value = "/login.html")
    public void longin() {
        System.out.println("登陆成功!!");
    }

3、@Scope 对类进行注解,设置单例多例 singleton作用域,prototype作用域

@Controller
@Scope(value="prototype")
public class FrontController {

    @RequestMapping(value="/login.shtml")
    public String login() {
        System.out.println("你好,登录中。");
        return ("login/success.jsp");
    }
}

4、@Autowired :实现依赖注入
5、@RequestParam 处理传入参数名与定义参数名不相同的解决方案

    @RequestMapping(value = "test1.htm")
    public void test1(@RequestParam(name = "username1") String username,@RequestParam(name = "password1") String paw,@RequestParam(name ="age1") Integer aaa ) {
        System.out.println("username:"+username);
        System.out.println("password:"+paw);
        System.out.println("age:"+aaa);
    }

四、springMVC的重定向与转发

1、传统的转发,使用tomcat的jar包,与servlet中相同的方式转发与重定向

//转发
@Controller
@Scope(value = "prototype")
public class HomeController {
    @RequestMapping(value = "test1")
    public void login(String username,String password,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        if("admin".equals(username) && "123".equals(password)) {//成功
            request.getRequestDispatcher("/pages/front/success.jsp").forward(request, response);;
        }else {//失败
            request.getRequestDispatcher("/pages/index.jsp").forward(request, response);
        }
    }
    
}

2、方法二 使用return 可以方便的处理重定向与转发

@Controller
@Scope(value = "prototype")
public class HomeController {
    @RequestMapping(value = "test1")
    public String login(String username,String password)  {
        if("admin".equals(username) && "123".equals(password)) {//成功
            return "forward:/pages/front/success.jsp";
        }else {//失败
            return "redirect:/pages/index.jsp";
        }
    }
    
}

五Springmvc传递数据

1,使用request域

@Controller
@Scope(value="prototype")
public class FrontController {

    @RequestMapping(value="/login.shtml")
    public String login(String username,String password,HttpServletRequest request) {
        System.out.println("你好"+username+",登录中。密码是:"+password);
        request.setAttribute("username", username);
        return ("login/success.jsp");
    }
}

2、通过model带数据(数据默认也是存放在request域)

@Controller
@Scope(value="prototype")
public class FrontController {

    @RequestMapping(value="/login.shtml")
    public String login(String username,String password,Model model) {
        System.out.println("你好"+username+",登录中。密码是:"+password);
        //request.setAttribute("username", username);
        model.addAttribute("username",username);
        return ("login/success.jsp");
    }
}

3.通过map集合

    @RequestMapping(value="/login2.shtml")
    public String login2(String username,String password,Map<String, Object> map) {
        System.out.println("你好"+username+",登录中。密码是:"+password);
        map.put("username", username);
        return ("login/success.jsp");
    }

取值

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
%>
</head>
<body>
使用 request域,model接收数据
登录成功,欢迎你${username} 
<br>
使用map接收数据:
${requestScope.username }
</body>
</html>

六统一处理异常

@ControllerAdvice  //不管是contrler service 还是dao,出错都会统一处理
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String exceptHandler(Exception exp) {
        exp.printStackTrace();
        System.out.println("text6print");
        return "/pages/front/fail.jsp";
    }
}

七 springmvc 处理json
1,注解
@ResponseBody
作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。
2,导包jackson处理json数据
jackson-core-2.12.3.jar
jackson-core-asl-1.9.13.jar
jackson-annotations-2.12.3.jar
jackson-databind-2.12.3.jar
jackson-mapper-asl-1.9.13.jar

3事例

    @RequestMapping("beantojson.shtml")
    @ResponseBody
    public User beanToJson() {
        System.out.println("jsontest    demo1");
        User user = new User();
        user.setUsername("张三");
        user.setPassword("李四");
        return user;
    }

执行结果

{"username":"张三","password":"李四"}

七文件上传

1单文件上传
a导入jar包


jar包

b在spring.xml配置文件修改相关配置

    <!-- 配置文件上传 注意id必须=multipartResolver -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 配置文件上传编码 -->
        <property name="defaultEncoding" value="utf-8"></property>
        <!-- 配置文件上传大小 -->
        <property name="maxUploadSize" value="1000000"></property>
    </bean>

c如果表单中有file控件,则必须制定enctype=“multipart/form-data”
表单实例:uploadfile.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
%>
</head>
<body>

<form action="<%=basePath %>/singleFileUpload.shtml" method="post" enctype="multipart/form-data">
<p>大头照:<input type="file" name="bigHeadImage">
<input type="submit" value="上传">
</form>
</body>
</html>

controller层:frontUploadFileController.java

@Controller

public class FrontFileUploadController {

    /**
     * 
    * <b>Description:</b> 单文件上传       </br>
    * <b>Title:</b> singleFileUpload </br> 
    * @author manyu
    * <b>update</b> 2022年1月20日上午10:20:21
     * @throws IOException 
     * @throws IllegalStateException 
     */
    @RequestMapping(value="singleFileUpload.shtml")
    public void singleFileUpload(@RequestParam(name="bigHeadImage" ) MultipartFile file,HttpServletRequest request) throws IllegalStateException, IOException {
        //1.获取上传文件名
        String originalFilename = file.getOriginalFilename();
        //2.获取表单控件file控件 name的属性值,此处为bigHeadImage
        String name = file.getName();
        //3.获取上传文件
        String path = request.getServletContext().getRealPath("/upload")+"/";
        File filepath = new File(path+originalFilename);
        file.transferTo(filepath);
        System.out.println("originalfilename="+originalFilename+"  "+"name="+name);
    }
    @RequestMapping(value="getUploadFile.shtml")
    //pageContext request session application(ServletContext)
    public void getUploadFile(HttpServletRequest request) {
        String path = request.getRealPath("upload");
        System.out.println(path);
    }
    
}

2多文件上传
例如:uploadfile.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
%>
</head>
<body>

<form action="<%=basePath %>/mutipelFileUpload.shtml" method="post" enctype="multipart/form-data">
<p>大头照:<input type="file" name="bigHeadImage">
<p>小头照:<input type="file" name="smallHeadImage">
<p>艺术照:<input type="file" name="artImage">
<p>用户名:<input type="text" name="username">
<input type="submit" value="上传">
</form>
</body>
</html>

文件:frontfileupload.java

/**
     * 
    * <b>Description:</b> 多文件上传       </br>
    * <b>Title:</b> mutipelFileUpload </br> 
    * @author manyu
    * <b>update</b> 2022年1月20日下午5:10:14
     * @throws IOException 
     * @throws IllegalStateException 
     */
    @RequestMapping(value="mutipelFileUpload.shtml")
    public void mutipelFileUpload(MultipartRequest files,HttpServletRequest request,String username) throws IllegalStateException, IOException {
        Map<String, MultipartFile> fileMap = files.getFileMap();
        Set<String> keySet = fileMap.keySet();
        for(String key:keySet) {
            String originalFilename = fileMap.get(key).getOriginalFilename();
            String realPath = request.getServletContext().getRealPath("upload")+"//";
            File filepath = new File(realPath+originalFilename);
            fileMap.get(key).transferTo(filepath);
        }
        System.out.println("username="+username);
    }
    
    public void uuidTest() {
        String fdfd = UUID.randomUUID().toString();
        System.out.println(fdfd);
    }

注意:如果upload文件夹包含在项目文件里,每次发布upload文件夹都会被覆盖。解决方案:可以和项目平级建立一个文件夹用于保存上传的图片或文件

八数据校验

1,打入jar包
classmate-1.5.1.jar
hibernate-validator-6.2.0.Final.jar
jboss-logging-3.4.1.Final.jar
validation-api-2.0.1.Final.jar
2,配置springmvc.xml

    <!-- 配置数据校验 -->
    <!-- 配置hibernate-validator-->
    <mvc:annotation-driven validator="validator"></mvc:annotation-driven>
    <bean id="localValidatorFactoryBean"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"
            value="org.hibernate.validator.HibernateValidator"></property>
    </bean>

3,实体层,使用注解配置校验内容
4,control层,实体类前需要添加@valid 注解,并且使用BindingResult返回错误结果(注意BindingRsult必须跟在需校验的实体类后面)

    @RequestMapping(value="register2.shtml")
    public  void register2(@Valid QQ register,BindingResult errorResult) {
        boolean hasErrors = errorResult.hasErrors();
        System.out.println(hasErrors);
        if(hasErrors) {
            List<FieldError> fieldErrors = errorResult.getFieldErrors();
            for(FieldError a:fieldErrors) {
                System.out.println(a.getField());  //获取属性名
                System.out.println(a.getDefaultMessage()); //获取错误信息
                
            }
        }else {
            System.out.println("可以调用业务方法了");
        }
        
    }

5常用标签

@Null  被注释的元素必须为null
@NotNull  被注释的元素不能为null
@AssertTrue  被注释的元素必须为true
@AssertFalse  被注释的元素必须为false
@Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)  被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past  被注释的元素必须是一个过去的日期
@Future  被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式,只能修饰String类型数据。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty  被注释的字符串必须非空
@Range  被注释的元素必须在合适的范围内

九 springmvc定时器
1、导入jar包
2、在springmvc.xml配置 : 包扫描中要包含定时器实现

    <!-- 6 定时器任务调度 -->
    <task:scheduler id="scheduler" pool-size="10" />
    <task:executor id="executor"  keep-alive="3600" pool-size="100-200" queue-capacity="500" rejection-policy="CALLER_RUNS"/>
    <task:annotation-driven executor="executor" scheduler="scheduler"/>

3、书写定时任务

/**   
 * Copyright © 2022 manyu All rights reserved.</br>
 * 
 * <b>Package<b>: cn.java.tasks 
 * @author  manyu   
 * @date: 2022年1月24日 上午10:47:12 
 */
package cn.java.tasks;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/** 
 * <b>Description:<b> 定时任务测试  </br>
 * <b>ClassName:</b> Task1 </br>
 * @author manyu  </br>
 * <b>address:</b> www.mpmanyu.com </br>    </br>
 * <b>date:</b> 2022年1月24日 上午10:47:12
 */
@Component
public class Task1 {

    
    @Scheduled(fixedRate=2000)
    public void task1() {
        Date date = new Date();
        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss yyyy-MM-DD");
        System.out.println(df.format(date));
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、SpringMVC简介1.什么是MVCModel:数据模型View:视图Controller:控制器 MVC是...
    青年心路阅读 2,538评论 0 1
  • 三层架构 和 MVC模型 三层架构:我们在Servlet 学习笔记讲过,当前 Web 应用体系主要为 C/S架构 ...
    Whyn阅读 549评论 0 0
  • 强烈推荐使用Spring Boot,搭建Spring Web项目,进入网址,把WEB依赖打钩,点击生成项目,会下载...
    tenlee阅读 1,596评论 3 44
  • springmvc学习笔记 学习springmvc框架原理 包括哪些组件: 前端控制器(中心) 处理器映射器(三大...
    罗志贇阅读 1,179评论 0 51
  • 1、什么是MVC 2、什么是SpringMVC 3、SpringMVC的特点 1、开发环境 2、创建maven工程...
    小茅同学阅读 283评论 0 0