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、进行测试…

原创粉丝点击