chapter06_渲染Web视图_1_创建JSP视图

  • 通常将JSP文件放在 /WEB-INF目录下,防止对它的直接访问

  • InternalResourceViewResolver是JSP的视图解析器,它遵循一种约定,会在视图名上添加前缀和后缀,进而定位JSP文件的位置

    (1) JavaConfig

      @Configuration
      @EnableWebMvc
      @ComponentScan("spittr.web")
      public class WebConfig extends WebMvcConfigurerAdapter {
    
          @Bean
          public ViewResolver viewResolver() {
    
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      
              resolver.setPrefix("/WEB-INF/views/");
              resolver.setSuffix(".jsp");
       
              return resolver;
          }
    
          ...
      }
    

    (2) Xml

      
      
    
          
    
          ...
      
      
    
  • (1) 如果JSP文件使用JSTL处理格式化和信息的话,应该将视图解析为 JstlView。这时需要设置InternalResourceViewResolver的viewClass属性

    (2) Java Config

      @Configuration
      @EnableWebMvc
      @ComponentScan("spittr.web")
      public class WebConfig extends WebMvcConfigurerAdapter {
    
          @Bean
          public ViewResolver viewResolver() {
    
              InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      
              resolver.setPrefix("/WEB-INF/views/");
              resolver.setSuffix(".jsp");
              resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
       
              return resolver;
          }
    
          ...
      }
    

    (3) Xml

      
      
    
          
    
          ...
      
      
    
  • 使用Spring的JSP库(一):绑定model中的某个属性

    (1) Spring的表单绑定JSP库包含14个标签。与原生html标签的区别在于它们可以绑定模型中的一个对象,根据模型中的对象填充值

    (2) 使用前要进行声明

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

    (3) 14个标签

      
      
      ...
    

    (4) 示例

    SpitterController.java

      @Controller
      @RequestMapping("/spitter")
      public class SpitterController {
    
          ...
    
          @RequestMapping(value = "/register", method = GET)
          public String showRegistrationForm(Model model) {
    
              model.addAttribute("spitter", new Spitter());
    
              return "registerForm";
          }
    
          ...
      }
    

    registerForm.jsp

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
      <%@ page session="false" %>
      
      
          Spitter
          ">
      
      
          

    Register

    First Name:
    Last Name:
    Email:
    Username:
    Password:

    (5)

    标签的commandName属性用来绑定某个model,这需要在Controller中添加这个对应名称的model,否则会报错(这里model的名称为"spitter")

    (6) 标签中的path属性用于设置原生html中value的值,例如代表这个input的值设定为 spitter.firstName

  • 展现错误

    (1) 使用

    示例

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
      <%@ page session="false" %>
      
      
          Spitter
          ">
      
      
          

    Register

    First Name:
    Last Name:
    Email:
    Username:
    Password:

    的path属性会绑定model的某个字段,以为例,它会绑定 spitter.firstName这个字段。如果这个字段有问题,那么则显示错误;否则,不渲染任何内容。

    的element属性用于确定错误的渲染类型,span代表html中的用于渲染一行;div代表

    ,代表一个块。

    cssClass指定了出现错误时的显示方式,对应的css文件中会有 span.error指定错误时的样式

    style.css

      ...
    
      span.error {
          color: red;
      }
    
      ...
    

    (2) 何时产生错误与产生何种错误信息都在模型对应的类中决定

    示例

      public class Spitter {
    
          ...
    
          @NotNull(message = "{username.size}")
          @Size(min = 5, max = 16, message = "{username.size}")
          private String username;
    
          @NotNull(message = "{password.size}")
          @Size(min = 5, max = 25, message = "{password.size}")
          private String password;
    
          @NotNull(message = "{firstName.size}")
          @Size(min = 2, max = 30, message = "{firstName.size}")
          private String firstName;
    
          @NotNull(message = "{lastName.size}")
          @Size(min = 2, max = 30, message = "{lastName.size}")
          private String lastName;
    
          @NotNull
          @Email(message = "{email.valid}")
          @Size(min = 3, message = "{email.valid}")
          private String email;
    
          ...
      }
    

    当不满足注解中的要求时,会产生错误;错误的信息由每个注解的message属性指定(添加多重校验注解时,每个注解可以对应不同的message);

    当message属性的内容是"xxx"时,则直接错误信息显示为xxx;当message属性的内容是"{xxx}"时,则错误信息从ValidationMessages.properties属性文件中读取;

    ValidationMessages.properties必须叫这个名字,且必须放在根类路径下(即src/main/resources/ValidationMessages.properties);在属性文件中定义message中各种对应的参数

    示例 ValidationMessages.properties

      firstName.size=First name must be between {min} and {max} characters long.
      lastName.size=Last name must be between {min} and {max} characters long.
      username.size=Username must be between {min} and {max} characters long.
      password.size=Password must be between {min} and {max} characters long.
      email.valid=The email address must be valid.
    

    属性文件也可以有占位符{},{min}代表从校验注解上读取min属性的值

    (3) 用来显示额外的错误信息,,同样可以指定发生错误时的显示样式,通过设置 cssError属性

    示例

    registerForm.jsp

      ...
    
      Email:
      
    
      ...
    

    style.css

      ...
    
      label.error {
          color: red;
      }
    
      input.error {
          background-color: #ffcccc;
      }
    
      ...
    
  • 使用Spring的JSP库(二):Spring的通用标签库

    (1) 使用前要添加声明

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

    (2) 常用的有10个标签 P180

    (3) 代替硬编码 --

    将信息放在属性文件里,使用时只需引用属性文件中的值即可

    示例

    home.jsp

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
      <%@ page session="false" %>
      
    
      ...
      
          

    ...

    messages.properties

      spitter.welcome=Welcome to Spitter!
    

    为了可以使用属性文件,需要配置信息源,即在JavaConfig文件中添加信息源的Bean

    WebConfig.java

      @Configuration
      @EnableWebMvc
      @ComponentScan("spittr.web")
      public class WebConfig extends WebMvcConfigurerAdapter {
    
          ....
    
          @Bean
          public MessageSource messageSource() {
    
              // Method 1
              ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
      
              messageSource.setBasename("/WEB-INF/messages");
              messageSource.setCacheSeconds(10);
              return messageSource;
    
              // Method 2
              /*ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    
              messageSource.setBasename("messages");
              messageSource.setCacheSeconds(10);
    
              return messageSource;*/
          }
      }
    

    常用的信息源类有两种,一种是ReloadableResourceBundleMessageSource,它从 src/main/webapp开始查找(即web应用的根路径);另一种是ResourceBundleMessageSource,它从src/main开始查找(即根类路径)

你可能感兴趣的:(chapter06_渲染Web视图_1_创建JSP视图)