【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


目录
相关文章
|
8月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
9月前
|
存储 安全 Java
如何在 Spring Web 应用程序中使用 @SessionScope 和 @RequestScope
Spring框架中的`@SessionScope`和`@RequestScope`注解用于管理Web应用中的状态。`@SessionScope`绑定HTTP会话生命周期,适用于用户特定数据,如购物车;`@RequestScope`限定于单个请求,适合无状态、线程安全的操作,如日志记录。合理选择作用域能提升应用性能与可维护性。
368 1
|
11月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
10月前
|
存储 NoSQL Java
探索Spring Boot的函数式Web应用开发
通过这种方式,开发者能以声明式和函数式的编程习惯,构建高效、易测试、并发友好的Web应用,同时也能以较小的学习曲线迅速上手,因为这些概念与Spring Framework其他部分保持一致性。在设计和编码过程中,保持代码的简洁性和高内聚性,有助于维持项目的可管理性,也便于其他开发者阅读和理解。
261 0
|
11月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
742 0
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1221 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
1076 7
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
1078 7
Spring Boot 入门:简化 Java Web 开发的强大工具
|
XML Java 网络架构
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
使用 Spring Boot 公开 SOAP Web 服务端点:详细指南
1881 0
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
453 0