javaweb框架之springmvc第三天
来源:互联网 发布:精美的php个人网站源码 编辑:程序博客网 时间:2024/05/21 14:57
1、拦截器
Interceptor,是springmvc使用java的动态代理实现的,能够在拦截的Controller方法执行前后,附加其他功能。
主要用来进行,权限验证,日志记录,是否登录。
有两种实现方式:
1、实现HandlerInterceptor
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("在执行方法前执行...."); String name = request.getParameter("name"); String passwd = request.getParameter("passwd"); if(!"zhangsan".equals(name) || !"123".equals(passwd)){ response.sendRedirect("http://www.baidu.com"); return false; } else{ return true; }}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("在执行方法后执行....");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("完成页面渲染后执行...");}
2、实现webRequestInterceptor
然后,需要在spring-mvc.xml进行配置:
<mvc:interceptors> <mvc:interceptor> <!-- 拦截那个请求 --> <mvc:mapping path="/user/*"/> <bean class="springmvc.MyInterceptor1"></bean> </mvc:interceptor></mvc:interceptors>
2、国际化
1、springmvc增加配置
<!-- 配置国际化文件 --><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 支持两种配置方式,第一种只能使用message开头的国际化文件,第二种可以配置多个国际化文件 --> <!-- 第一种:<property name="basenames" value="message" /> --> <!-- 第二种 --> <property name="basenames"> <list> <value>message</value> </list> </property></bean>
2、增加配置文件
需要是unicode编码(可用native2ascii或这eclipse插件编码)
message_en_US.properties
message_zh_CN.properties
3、通过spring标签获取国际化内容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><spring:message code="userName"/>:<input type="text" name="userName"> <spring:message code="userName"/>:<input type="text" name="passwd"> </body></html>
3、文件上传下载
3.1普通上传
1、需要第三方jar包支持
<!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
2、编写上传页面
<form action="${pageContext.request.contextPath }/uploadfile" method="post" enctype="multipart/form-data"><!-- 1、form的提交方式必须是post2、form的enctype必须是"multipart/form-data"3、上传控件 --><input type="file" name="fileupload"><input type="submit" value="上传"></form>
3、编写Controller实现上传
@RequestMapping(value="/uploadfile", method=RequestMethod.POST)public String upload(@RequestParam("fileupload") MultipartFile file,HttpServletRequest request){ //怎么获取上传的文件 //获取后文件放在哪儿 //得到上传文件的绝对路径 String uploadPath = request.getSession().getServletContext().getRealPath("upload"); //然后设置文件名 String destFile = uploadPath+File.separator+file.getOriginalFilename(); try { file.transferTo(new File(destFile)); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return "result";}
3.2ajax上传
1、需要导入jquery.js和jquery.form.js
2、编写上传页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.form.min.js"></script><script type="text/javascript">$(function(){ $("#btn").click(function(){ $("#form-upload").ajaxSubmit({ type: 'post', url: "${pageContext.request.contextPath }/ajaxupload", success: function (data) { var d = eval("("+data+")"); if (d.success) { alert(d.msg); }else{ alert(d.msg); } } }); });});</script><title>Insert title here</title></head><body><form id="form-upload" action="" method="post" enctype="multipart/form-data"><!-- 1、form的提交方式必须是post2、form的enctype必须是"multipart/form-data"3、上传控件 --><input type="file" name="fileupload"><input type="button" id='btn' value="上传"></form></body></html>
3.编写ajax实现文件上传的Controller
@RequestMapping(value="/ajaxupload", method=RequestMethod.POST)public void ajaxUpload(@RequestParam("fileupload") MultipartFile file,HttpServletRequest request, HttpServletResponse resp){ //怎么获取上传的文件 //获取后文件放在哪儿 //得到上传文件的绝对路径 String uploadPath = request.getSession().getServletContext().getRealPath("upload"); String fileName = file.getOriginalFilename(); //然后设置文件名 String destFile = uploadPath+File.separator+file.getOriginalFilename(); if(!StringUtils.endsWithIgnoreCase(fileName, ".doc") && !StringUtils.endsWithIgnoreCase(fileName, ".docx")){ try { resp.getOutputStream().write("{'success':'false','msg':'只允许上传doc和docx格式的文件!'}".getBytes()); } catch (IOException e) { e.printStackTrace(); } } else{ try { file.transferTo(new File(destFile)); resp.getOutputStream().write("{'success':'true','msg':'上传成功!'}".getBytes()); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
4、数据转换
1、需要实现Converter接口
public class DateConverter implements Converter<String, Date>{ @Override public Date convert(String source) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); try { return format.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; }}
2、在springmvc配置文件配置
<mvc:annotation-driven conversion-service="conversionService" /><!-- 我们使用spring提供的conversionService实现FormattingConversionServiceFactoryBean --><bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="springmvc.DateConverter" /> </list> </property></bean>
5、格式化
能够把日期,金额,数字进行有效格式化,springmvc常用的格式化类
- DateFormatter
- NumberFormatter
- CurrencyFormatter
- PercentFormatter
6、验证
6.1通过自定义validator验证
0、导入第三方的jar包
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version></dependency>
1、自定义校验器
public class UserValidate implements Validator{ @Override public boolean supports(Class<?> clazz) { //首先判断需要检验的class是不是Student,如果是才进行校验 return User.class.equals(clazz); } @Override public void validate(Object target, Errors errors) { //将传入的target强制转换成Student User u = (User) target; if(u.getName()==null || "".equals(u.getName())){ errors.rejectValue("name", null, null,"请输入用户名!"); } if(u.getAge()==null || "".equals(u.getAge())){ errors.rejectValue("age", null, null,"请输入年龄!"); } }}
2、注册校验器,在校验的Controller类编写
@InitBinderpublic void initBinder(DataBinder binder){ binder.replaceValidators(new UserValidate());}
3、编写验证Controller,需要使用@valid验证实体类,然后需要BindResult绑定错误信息,注意顺序,BindResult一定要在@valid的后面
@RequestMapping(value="addUser", method=RequestMethod.POST)//必须使用@Valid对Student进行检验,然后将校验结果绑定到BindingResult,页面才能展示public String addUser(@Valid User user, BindingResult result){ //如果说result里面包含错误信息了,那么将返回增加用户页面 if (result.hasErrors()) { return "addUser"; } else{ return "..."; }}
4、展示错误信息,需要导入spring和jstl的标签
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <spring:hasBindErrors name="user"> <c:if test="${errors.fieldErrorCount > 0}"> <c:forEach items="${errors.fieldErrors}" var="error"> <spring:message var="message" code="${error.defaultMessage}" arguments="${error.arguments}" text="${error.defaultMessage}"/> ${message}<br/> </c:forEach> </c:if> <c:if test="${errors.globalErrorCount > 0}"> <c:forEach items="${errors.globalErrors}" var="error"> <spring:message var="message" code="${error.defaultMessage}" arguments="${error.arguments}" text="${error.defaultMessage}"/> <c:if test="${not empty message}"> ${message}<br/> </c:if> </c:forEach> </c:if> <br/> </spring:hasBindErrors>
6.1通过jsr303注解验证
jsr303是个验证标准,然后HibernateValidator实现了这个标准
1、需要在验证的实体类上进行注解校验
public class User { @NotNull(message = "username.request") @Length(min = 5, max = 20, message = "username.length") private String name; @NotNull(message = "age.request") @Pattern(regexp = "[0-9]+", message = "age.regexp") private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; }}
2、配置国际化支持
参考国际化配置
3、增加国际化文件,然后添加验证的内容
username.request=\u8BF7\u8F93\u5165\u7528\u6237\u540Dusername.length=\u7528\u6237\u540D\u957F\u5EA6\u5FC5\u987B\u57285-20age.request=\u8BF7\u8F93\u5165\u5E74\u9F84age.regexp=\u5E74\u9F84\u53EA\u80FD\u662F\u6570\u5B57
4、编写校验的Controller
@RequestMapping(value="addUser", method=RequestMethod.POST)//必须使用@Valid对Student进行检验,然后将校验结果绑定到BindingResult,页面才能展示public String addUser(@Valid User user, BindingResult result){ //如果说result里面包含错误信息了,那么将返回增加用户页面 if (result.hasErrors()) { return "addUser"; } else{ return "..."; }}
5、进行测试…
- javaweb框架之springmvc第三天
- javaweb框架之springmvc
- javaweb框架之springmvc第二天
- 【javaWeb第三天】-XML技术
- JAVAWEB第三天js对象
- JAVAWEB第三天案例代码
- Spring框架第三天
- ## Hibernate框架第三天 ##
- (菜鸟来动手)SpringMVC+Spring+Mybatis整合(第三天) SSM框架整合
- 自学Java的第三天(Maven搭建springmvc+spring+mybatis框架)
- struts2框架搭建第三天
- Hibernate框架基础知识第三天
- Spring框架的第三天
- Slim 框架学习,第三天
- 三天学好ADO之第三天
- 新环境之第三天
- 上海之行第三天
- MFC学习之第三天
- python字符串排序(按输入顺序/按字符出现次数/按字符)
- select语句for update
- xjoi奋斗群群赛13
- Qpainter绘制文本
- javaweb框架之springmvc第二天
- javaweb框架之springmvc第三天
- jstree的基本应用----记录
- 009 极限的四则运算定理(加、减、乘、除)
- 作为软件连接件的区块链(上)【渡鸦论文系列】
- 实验一 Linux操作系统的安装
- 每日区块链:福布斯:区块链大规模应用的阻碍因素;能源公司Origin联合Power Ledger试验区块链能源共享
- 区块宝研究院月报:《区块链:价值互联时代的引擎(2017)》
- JsTree3.3动态加载树节点
- Android6.0------权限申请RxPermissions