前言:
继续学习SpringMVC的内容,本次的内容如下:
- 文件上传
- Ajax,json
- 拦截器
废话不多说,进入正题
1.文件上传
导入相关jar包
image.png配置springmvc的配置解析器
<!-- 文件上传配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置编码格式 -->
<property name="defaultEncoding" value="utf-8"></property>
<!-- 设置文件大小 -->
<property name="maxUploadSize" value="10485760000"></property>
<!-- 设置缓冲区大小 -->
<property name="maxInMemorySize" value="40960"></property>
</bean>
JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action = "upload.action" method="post", enctype="multipart/form-data">
文件:<input type="file" name = "file"/><input type="submit" value="上传"/>
</form>
</body>
</html>
Controller
@Controller
public class FileUploadController {
@RequestMapping(value = "/upload")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) {
//获取上传位置
String path = request.getRealPath("/fileupload");
//获取文件名
String fileName = file.getOriginalFilename();
try {
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream(new File(path,fileName));
int len = 0;
byte[] buffer = new byte[400];
while((len = is.read(buffer)) != -1) {
os.write(buffer,0,len);
}
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:index.jsp";
}
}
2.Ajax,json
导入jar包
image.png配置json转换器
<!-- json配置 -->
<!-- 用于将对象转换为 JSON -->
<bean id="stringConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringConverter" />
<ref bean="jsonConverter" />
</list>
</property>
</bean>
Controller
public class JsonController {
@RequestMapping("/json")
@ResponseBody
public List<User> json() {
List<User> list = new ArrayList<User>();
list.add(new User(1,"json"));
list.add(new User(2,"ajax"));
list.add(new User(3,"cookie"));
return list;
}
}
3.拦截器
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
//在请求方法处理前执行
//用于用户认证校验、用户权限校验
//如果返回false表示拦截不继续执行请求的方法,如果返回true表示放行
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("处理前");
return true;
}
//在请求方法处理前执行
//如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("处理后");
}
//在dispatherServlet处理后执行
//作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
//实现 系统 统一日志记录
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 指明哪些请求需要被拦截
/login.do 表示login.do需要被拦截
/user/add.do 表示/user/add.do请求要被拦截
/* 表示项目路径下的所有请求被拦截
可以拦截: /login.do /add.do /user.do /sys.do等
/**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
可以拦截: /login.do /add.do /user.do /sys.do
/user/add.do
-->
<mvc:mapping path="/**"/>
<bean class="cn.springmvc.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
指明哪些请求需要被拦截
- /login.do 表示login.do需要被拦截
- /user/add.do 表示/user/add.do请求要被拦截
- /* 表示项目路径下的所有请求被拦截
可以拦截: /login.do /add.do /user.do /sys.do等 - /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
可以拦截: /login.do, /add.do , /user.do ,/sys.do ,/user/add.do
这里用的是拦截全部请求
效果:
image.png
4.拦截器的举例应用(登录拦截)
Cotroller
@Controller
public class LoginController {
@RequestMapping(value = "/login")
public String login(String name, String password, HttpSession session) {
System.out.println(name + password);
if("zhangsan".equals(name) && "123".equals(password)) {
session.setAttribute("name","zhangsan");
return "redirect:/index.jsp";
}
return "redirect:/login.jsp";
}
@RequestMapping(value = "/add")
public String add() {
System.out.println("add");
return "redirect:/index.jsp";
}
}
拦截器:
public class LoginInterceptor implements HandlerInterceptor {
private List<String > allowedPass;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//获得请求的路径
String path = httpServletRequest.getRequestURL().toString();
HttpSession session = httpServletRequest.getSession();
String name = (String)session.getAttribute("name");
//如果session里面已经有值了直接放行
if(name != null) {
return true;
}
for (String str:
allowedPass) {
if(path.endsWith(str))
return true;
}
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.jsp");
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
public void setAllowedPass(List<String> allowedPass) {
this.allowedPass = allowedPass;
}
}
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 指明哪些请求需要被拦截
/login.do 表示login.do需要被拦截
/user/add.do 表示/user/add.do请求要被拦截
/* 表示项目路径下的所有请求被拦截
可以拦截: /login.do /add.do /user.do /sys.do等
/**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
可以拦截: /login.do /add.do /user.do /sys.do
/user/add.do
-->
<mvc:mapping path="/**"/>
<bean class="cn.springmvc.interceptor.LoginInterceptor">
<property name="allowedPass">
<value>login.action</value>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
效果图:
hello.action请求被拦截跳转到登录界面
image.png
提交错误的账号密码,依然是登录界面
image.png
提交正确的账号密码
image.png
网友评论