javaweb框架之springmvc第三天

1、拦截器

Interceptor,是springmvc使用java的动态代理实现的,能够在拦截的Controller方法执行前后,附加其他功能。
主要用来进行,权限验证,日志记录,是否登录。

有两种实现方式:
1、实现HandlerInterceptor

@Override
public 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;
    }
}

@Override
public void postHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    System.out.println("在执行方法后执行....");

}

@Override
public 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的提交方式必须是post
2、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的提交方式必须是post
2、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类编写

@InitBinder
public 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\u540D
username.length=\u7528\u6237\u540D\u957F\u5EA6\u5FC5\u987B\u57285-20

age.request=\u8BF7\u8F93\u5165\u5E74\u9F84
age.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、进行测试…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值