Spring学习笔记之渲染Web视图

视图解析

上一篇文章我们讲到在配置Spring MVC时,需要配置一个ViewResolver来解析视图。
Spring MVC定义了一个名为ViewResolver的接口:

public interface ViewResolver {
    View resolveViewName(String viewName, Locale locale) throws Exception;
}

当给resolveViewName()方法传入一个视图名和Local对象是,它会返回一个View实例,View是另一个接口:

public interface View {
    ...
    String getContentType();
    void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}

View接口的任务就是接受模型以及Servlet的request和response对象,并将输出渲染到response中。
所以,只要我们编写了ViewResolver和View的实现,将要渲染的内容放到response中,进而展现到用户的浏览器中就可以了。而Spring MVC也为我们提供了13个实现——视图解析器,足够我们应付大部分的场景,而不用我们自己去实现。以下是Spring MVC提供的13种视图解析器:
Spring自带的13个视图解析器

创建JSP视图

开发中我们最常用的就是JSP了,它对应的视图解析器是InternalResourceViewResolver。它会将视图名解析为InternalResourceView实例,如果我们在JSP页面中使用了JSTL(JSP标准标签库)的话,InternalResourceViewResolver能够将视图解析为JstlView形式的JSP文件。通过JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资源,这样做有什么好处呢,好处就是JSTL能够以恰当的方式格式化地域相关的值,如日期和货币。而要想让InternalResourceViewResolver将视图解析为JstlView,我们只需要设置他的viewClass属性即可:

@Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/view/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);//将视图解析为JstlView
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

下面我们介绍spring为JSP提供的表单标签库,个人觉得这是一个很有用的标签库。

Spring表单绑定标签库

我们知道JSP可以自己添加标签库,Spring为JSP提供了两个标签库,一个标签库会用来渲染HTML表单标签,这些标签可以绑定model中的某个属性。另外一个标签库包含了一些工具类标签,我们可以随时便利地使用它们。
Spring表单绑定标签库的声明:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>

它提供了14个标签:
Spring表单绑定标签库
下面是一个示例,我们来看它是怎么用的。
在后台我们还需要用到上一篇文章提到的Java校验API(又称JSR-303)的功能,这里用这个规范的一个标准实现——Hibernate Validator。关于JSR-303和Hibernate Validator请参考这篇文章:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/。从maven将其引入:

<dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-validator</artifactId>
       <version>5.4.0.Final</version>
    </dependency>

我们的后台control以及entity类:

@Controller
public class Spittler {
    /**
     * 进入注册页面
     * @return
     */
    @RequestMapping(value="/",method=org.springframework.web.bind.annotation.RequestMethod.GET)
    public String getRegisterForm(Model model){
        model.addAttribute("user", new User());
        return "register";
    }
    /**
     * 注册
     * @param user
     * @param errors
     * @param model
     * @return
     */
    @RequestMapping("/register")
    public String spittle(
            @Valid User user,//校验输入
            Errors errors, Model model){
        model.addAttribute("user", user);
        if(errors.hasErrors()){
            return "register";//如果校验出现错误,则重新返回表单。
        }
        return "redirect:/spitter/";//校验成功,重定向到其他Control继续执行
    }
}
public class User {
    @NotNull
    //@Size(min=5,max=16)
    private String username; //非空,5-16个字符
    @NotNull
    //@Size(min=6, max=10)
    private String password;//非空,6-10个字符
    @NotNull
    private String email;//非空
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值