一、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包
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));
}
}