【Spring MVC】(五)页面在 WEB-INF 下的处理方式(jsp页面、html页面)、SpringMVC 参数校验

简介: 【Spring MVC】(五)页面在 WEB-INF 下的处理方式(jsp页面、html页面)、SpringMVC 参数校验

文章目录


一、SpringMVC 框架中页面在 WEB-INF 下的处理方式

1、页面为 JSP 的项目

2、如果项目由HTML页面构成,采用AJAX的方式获取数据


二、SpringMVC 参数校验

1、SpringMVC 参数校验概述

2、SpringMVC 参数校验步骤:

3、常见的校验规则注解


一、SpringMVC 框架中页面在 WEB-INF 下的处理方式


1、页面为 JSP 的项目


(1)由 JSP 页面构成的项目,如果想将 JSP 页面放到 WEB-INF 目录下,可以将核心控制器的地址匹配规则设置为*.do或者*.html(项目中不支持ajax请求)。但是注意,静态资源是不能放到 WEB-INF 之下的,例如 js、css、图片等。


(2)项目结构:


image.png


(3)核心控制器的地址匹配规则

<!-- 核心控制器 -->
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>


(4)一旦将 JSP 页面放到 WEB-INF 目录中,访问 JSP 页面就不能直接通过页面的地址直接进行访问,任何一个页面都需要提供一个业务控制器中的方法用转发的方式来访问页面。


为了便于转发 JSP,可以使用 SpringMVC 提供的视图解析器来配置前后缀。

<!--配置视图解析器 -->
<bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property  name="prefix"  value="/WEB-INF/page/"></property>
<property  name="suffix"  value=".jsp"></property>
</bean>


(5)对于业务控制器的分工来讲,这时分为两种情况。


① 类似于首页,登录页面,注册页面这种公共的页面,我们可以专门定义一个 PageController 提供页面的访问方式。如下:

@Controller
public class PageController {
  //访问index.jsp的地址映射
  @RequestMapping("index")
  public String index() {
  return "index";
  }
  //访问regist.jsp的地址映射
  @RequestMapping("regist")
  public String regist() {
  return "regist";
  }
  //访问login.jsp的地址映射
  @RequestMapping("login")
  public String login() {
  return "login";
  }
}


配置完成之后,按照以前 Springmvc 的配置扫描包,添加注解驱动后可以在浏览器中,分别通过index.do、login.do、register.do来访问首页、登录页面、注册页面等等。


② 对于其他的 JSP 访问,由于通常都和业务挂钩,所以自然需要我们根据业务的分类定义对应的业务控制器,在处理完业务之后转发到其他页面。


这时就要注意一个问题,由于login.do和register.do的请求地址在项目中已经使用了,是用来访问登录页面和注册页面的,那么切记我们在执行真正的登录和注册业务时就不能再直接使用login.do和register.do了。为了解决这个问题,我们可以将业务请求定义在对应的命名空间之下,例如我们可以将登录的请求地址定义为user/login.do,注册定义为user/register.do,这时我们就需要在控制器类上添加一个@RequestMapping("user")注解来定义命名空间。如下:

@Controller
@RequestMapping("user")
public class UsersController {
  //定义登录的请求地址映射
  @RequestMapping("login")
  public String login() {
  return "index";
  }
}


通过命名空间的配置,我们可以将 login 页面请求和 login 业务请求区分开来,但是加上命名空间所带来的一个新问题就是命名空间的加入会造成相对路径在使用时的障碍,所以 JSP 中推荐发送任何请求时都采用绝对路径的方式来访问,要访问绝对路径可以在 jsp 页面中首先动态获取项目的绝对路径,如下:

<%
  String path = request.getContextPath();
  String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>


然后在发送请求时统一采用绝对路径的方式来访问,如下:


超链接:

<a href=""<%=basePath %>login.do">登录</a>


表单提交:

<form action="<%=basePath %>user/login.do" method="post">
  <input type="submit" value="登录">
</form>


引入js和引入css

<script type="text/javascript" src="<%=basePath %>js/jquery-3.3.1.js"></script>
<link rel="stylesheet" type="text/css" href="<%=basePath %>css/style.css"/>

2、如果项目由HTML页面构成,采用AJAX的方式获取数据


(1)如果一个项目完全由HTML组成,采用了AJAX的方式获取数据,那么首先要明确一点,页面间的跳转不再依赖于控制器的转发,而是直接访问HTML网页,这时也可以将HTML网页放到WEB-INF 中处理。


(2)项目结构:


image.png


(3)所有的静态资源都放到了WEB-INF下,那么我们对于任何静态资源的访问,都不能直接访问,而是要通过 SpringMVC 的进行响应,所以对核心控制器的地址匹配规则需要定义为/不能定义为*.do。

<!-- 核心控制器 -->
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>


(4)SpringMVC 在3.0以后专门提供了静态资源处理器,用于对静态资源和它的路径进行映射,这是一个非常强大且实用的工具,使用它我们可以可以访问WEB-INF下的静态资源。

<mvc:resources location="/WEB-INF/resources/page/" mapping="/page/**"/>
<mvc:resources location="/WEB-INF/resources/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/resources/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/resources/img/" mapping="/img/**"/>
<mvc:resources location="/WEB-INF/resources/fonts/" mapping="/fonts/**"/>


上述标签需要配置在 SpringMVC 的配置文件中,其含义是,将请求地址以 page 开头的所有请求地址映射到 WEB-INF下resources 文件夹下的 page 文件中,SpringMVC 会从该文件夹下去响应网页文件,将所有以 js 开头的请求地址映射到 WEB-INF 下 resources 文件夹下的 js 文件中,以此类推。


二、SpringMVC 参数校验


1、SpringMVC 参数校验概述


SpringMVC 提供了非编程式的后端参数校验,Spring3 以后支持 JSR-303 验证框架,JSR-303 是JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方推荐的实现是 Hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对 Java Bean 中的字段的值进行验证。


2、SpringMVC 参数校验步骤:


(1)添加jar包


image.png


添加jar包时,注意不同版本 springmvc 对 Hibernate-Validator 框架的兼容性,如 SpringMVC 5.1.6 兼容 Hibernate-Validator 6.0 版本,Hibernate-Validator6.0 需要其他3个依赖包,所以总共需要导入4个包。


(2)在springmvc配置文件中加载参数校验器

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  <!-- 校验器 -->
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
</bean>


(3)在实体类的属性中使用注解添加验证规则以及错误信息

public class Users {
    private Integer userId;
    @NotNull(message="用户名不能为空")
    @NotEmpty(message="用户名不能为空")
    private String userName;
    @NotNull(message="密码不能为空")
    @NotEmpty(message="密码不能为空")
  @Length(max=16,min=6,message="密码长度为6-16位")
    private String userPassword;
    @Pattern(regexp="[a-zA-Z0-9]{1,}@{1}[a-zA-Z0-9]{1,}(\\.[a-z]{2-3}){1,2}",message="邮箱格式不正确")
    private String email;
    //省略get、set方法
}


(4)在控制器中接收 User 类型的参数时,添加注解进行校验,添加@Validated表示在 springmvc对 user 参数绑定时进行校验,校验信息写入BindingResult中,在要校验的实体类对象后边添加BingdingResult, 一个BindingResult对应一个实体类对象,且BingdingResult放在实体类对象的后边。

@RequestMapping("login")
public ModelAndView login(@Validated @ModelAttribute("users") Users users, BindingResult br) {
  ModelAndView mav = new ModelAndView();
  //如果验证未通过,将错误信息保存到模型中并返回到登录界面
  if(br.hasErrors()) {
    lList<ObjectError> errors = br.getAllErrors();
    mav.addObject("errors", errors);
    mav.setViewName("login.jsp");
  }else{
  //验证通过,跳转到首页
  mav.setViewName("index.jsp");
  }
  return mav;
}


(5)在 jsp 页面中显示错误信息

<c:forEach items="${errors}" var="error">
  ${error.defaultMessage}
</c:forEach>


3、常见的校验规则注解

image.png

image.png


目录
相关文章
|
11月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
410 0
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
1078 29
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
306 2
|
Java 应用服务中间件 Maven
idea+maven+tomcat+spring 创建一个jsp项目
这篇文章介绍了如何在IntelliJ IDEA中使用Maven和Tomcat创建一个JSP项目,包括配置Maven依赖、设置Tomcat服务器、编写JSP页面、创建控制器和配置文件,以及项目的运行结果。
1333 0
idea+maven+tomcat+spring 创建一个jsp项目
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
4611 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
317 7