【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


目录
相关文章
|
Java 数据安全/隐私保护
JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
该博客文章通过JavaBean组件和JSP动作元素`<jsp:forward>`与`<jsp:param>`的使用示例,演示了用户登录流程,包括登录信息的提交、验证以及根据验证结果进行的页面跳转。
JavaBean组件<jsp:forward>动作<jsp:param>动作登录页面输入用户名和密码,然后进入检查页面判断是否符合要求,符合要求跳转到成功界面,不符合要求返回登录界面,显示错误信息。
|
存储 Java
JSP中实现留言页面的编写并将留言信息展示出来
这篇文章介绍了如何在JSP中编写留言页面,并通过JavaBean类存储用户留言信息,同时展示了留言信息的展示方法。
JSP中实现留言页面的编写并将留言信息展示出来
`<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
该博客文章讲解了JSP中`<jsp:getProperty>`和`<jsp:setProperty>`动作的使用方法,包括它们的语法格式和如何在页面中使用这些动作来获取和设置JavaBean对象的属性值,并通过图书信息的填写和展示示例进行了演示。
`<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
前端开发 JavaScript Java
springmvc前端jsp与html
在Spring MVC框架中,前端页面既可以使用JSP(JavaServer Pages)也可以使用HTML,具体使用哪一种或哪几种技术,主要取决于项目的需求、团队的熟悉度以及项目的可维护性等因素。
243 2
编写一个jsp页面,利用Scriptlet编写一段计算代码,要求用零作为除数,并使用page指令将错误信息显示在另外一个jsp页面,产生的错误信息为“错误,不能用0做除数”
该文章展示了如何创建一个JSP页面,使用Scriptlet编写包含除零操作的计算代码,并配置page指令将错误信息重定向至另一个JSP页面进行显示。
编写一个jsp页面,利用Scriptlet编写一段计算代码,要求用零作为除数,并使用page指令将错误信息显示在另外一个jsp页面,产生的错误信息为“错误,不能用0做除数”
|
5月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
505 5
|
9月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
9月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。

热门文章

最新文章