这一篇就来结合SpringMVC框架来写一些常用的工具类
工具
异常处理器
在我们日常开发种必定会有写时候代码出现问题访问不到,或者维护时代码不能被访问等等。
那我们就要针对这些异常并处理它给用户传过去一些用户提示信息
先自己定义一个异常类MyException
package com.Exception;
public class MyException extends Exception {
MyException() {
super();
}
MyException(String msg) {
super();
this.msg = msg;
}
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
然后处理异常并实现异常处理器的接口,发送给前端异常的信息,前端接受后打印在页面。
package com.Exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class handleException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
String result = "页面出现异常";
if (ex instanceof MyException) {
result = ((MyException) ex).getMsg();
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", result);
return modelAndView;
}
在SpringMVC配置
<!--配置全局异常处理-->
<bean class="com.Exception.handleException"/>
文件上传
文件上传是在日常开发中必不可少的,文件上传就以一个demo来讲讲吧。
准备工作:创建一个新的文件并修改tomcat的虚拟路径
因为在后期存取图片都存在这个虚拟路径中:e:/photo
1.文件上传需要用到两个jar包
<!--文件上传-->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.写相对应的jsp页面
Upload.jsp(必须注意的是提交时一定要是post方式,并且enctype=“multipart/form-data”, input type=“file” name=“pictureFile” name属性要和控制器对应)
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/2/17
Time: 14:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%--必须改enctype--%>
<form enctype="multipart/form-data"action="" method="post">
<input type="file" name="pictureFile">
<input type="submit" name="submit">
</form>
</body>
</html>
success.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/2/17
Time: 17:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
success
</body>
</html>
3.写controller层
注:写下边这个while循环是这个进入处理方法需要有一个提交数据,为了简化流程就用while防止报空指针异常
这里采用UUID来防止重名,也可以根据时间来防止重名。
@RequestMapping("upload")
public String upload(Model model, MultipartFile pictureFile) throws IOException {
// 防止上传的文件重名而导致混乱,另外起一个名字
UUID newName = UUID.randomUUID();
while (pictureFile!= null) {
//获取原来名字
String oldName = pictureFile.getOriginalFilename();
// 后缀
String sux = oldName.substring(oldName.lastIndexOf("."));
// 新建本地文件流
File file = new File("E:\\photo\\" + newName + sux);
pictureFile.transferTo(file);
// 保存图片到数据库
System.out.println(newName + sux);
// user.setAddress(newName+sux);
model.addAttribute("msg", "Update Success!");
// model.addAttribute("user", user);
return "success";
}
return "Upload";
}
4.测试
选择后出现成功,在控制器复制路径
ef720f82-0b3e-40ee-9873-f20163c25118.jpg
在服务器上访问这个图片
这就是文件上传的简单实现,在开发中就会将此路径存入到数据库。
json数据交互
json现在已经是前后端交互的重要途径了,这是前后端交互的重要途径了。json的简洁已经获取到人们的倾心了。在前边相信大家也是经常用到吧。
1.导入jar包
(1)导入以下三个包(因为Spring版本兼容问题,版本要在2.7.5之后)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.5</version>
</dependency>
(2)或者导入下边这一个包
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
2.在控制器使用json
编写json测试类,必须再加上@ResponseBody然后返回的就是json格式了
@RequestMapping("jsonTest")
@ResponseBody
public List<User> List(Model model, @RequestParam(value = "s", required = true, defaultValue = "李") String s) {
List<User> list = userService.SelectUserByLikeIt(s);
System.out.println("123");
return list;
}
测试结果:
3.接受外边传进来的json(了解)再参数上加RequestBody
这样就可以接受外边的json,已测试过。
拦截器
和在学web基础的时候的过滤器差不多,可以对我们的一些方法进行拦截,比如我们当时在前面用Filter实现的自动登陆也可以用拦截器来实现。下边通过实例来使用拦截器。
1.先写两个页面
login.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/2/18
Time: 1:24
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/user/toLogin">
用户名:<input type="text" name="username" /><br>
密码:<input type="password" name="password" /><br>
<input type="submit">
</form>
</body>
</html>
success.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/2/17
Time: 17:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
success
</body>
</html>
2.编写controller
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class UserController1 {
@RequestMapping("/toLogin")
public String toLogin() {
return "login";
}
@RequestMapping("/login")
public String login(String username,String password,HttpSession session) {
if (session != null&&username!= null) {
if (username.equals("admin")&&password.equals("admin")) {
session.setAttribute("username", username);
return "/success";
}
}
return "login";
}
@RequestMapping("/success")
public String success() {
return "success";
}
}
3.编写拦截器
package com.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 登录拦截器
* @author Steven
*
*/
public class AutoLogin implements HandlerInterceptor {
//方法执行后被执行
//处理异常,清资源,记录日志等等
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
//方法执行之后,返回ModelAndView之前被执行
//设置页面的共用参数等等
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
//进入方法前被执行
//登录拦截,权限验证等等
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//判断用户有没有登录
Object object = request.getSession().getAttribute("username");
if(object == null){
response.sendRedirect(request.getContextPath() + "/user/toLogin");
}
//true放行,false拦截
return true;
}
}
4.配置拦截器,在有了两级目录的mvc配置文件中要在视图解析器的WEB-INF前加/。
<!--配置视图解释器,省去写路径的步骤直接写jsp的视图名-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<!-- 必须以 <mvc:mapping path=""/> 开始 -->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/**"/>
<bean class="com.Interceptor.AutoLogin"/>
</mvc:interceptor>
</mvc:interceptors>
5.运行项目
这就是拦截器的使用和配置!
到这里SpringMVC就基本完了,ssm也都写完了,在写最后这几篇的时候,消耗了很多时间,并不是有多么的难,就是在配置和编写的时候要注意的细节很多,往往这其中一个细节就可以让你调试一下午或者一整天,不过这都还算是有收获,毕竟现在出现的错误越多以后就出现的越少,后边还得找个小的项目写写,不然学的这些全是空壳!从放假到现在也有很多天没有学习,落后我计划很多,但是也不能一味的追求速度而放下了质量!!!