中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

百度搜索網(wǎng)站介紹杭州上城區(qū)抖音seo有多好

百度搜索網(wǎng)站介紹,杭州上城區(qū)抖音seo有多好,室內(nèi)設(shè)計(jì)方案ppt案例,裝修網(wǎng)站建設(shè)公司目錄 引言JSR303什么是JSR303?為什么要使用JSR303?常用注解快速入門JSR303 攔截器什么是攔截器攔截器與過(guò)濾器應(yīng)用場(chǎng)景快速入門攔截器 總結(jié) 引言 在Java Web開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證和處理,同時(shí)需要對(duì)請(qǐng)求進(jìn)行攔截與控制的需…

目錄

  • 引言
    • JSR303
      • 什么是JSR303?
      • 為什么要使用JSR303?
      • 常用注解
      • 快速入門JSR303
    • 攔截器
      • 什么是攔截器
      • 攔截器與過(guò)濾器
      • 應(yīng)用場(chǎng)景
      • 快速入門攔截器
    • 總結(jié)

在這里插入圖片描述

引言

在Java Web開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證和處理,同時(shí)需要對(duì)請(qǐng)求進(jìn)行攔截與控制的需求。為了方便實(shí)現(xiàn)這些功能,我們可以使用JSR303驗(yàn)證框架和攔截器技術(shù)。本篇博客將介紹JSR303和攔截器的基本概念,并探討它們?cè)贘ava Web開(kāi)發(fā)中的應(yīng)用與實(shí)踐。

JSR303

什么是JSR303?

JSR303是一項(xiàng)Java標(biāo)準(zhǔn)規(guī)范,也被稱為Bean Validation,它提供了一組注解和API用于對(duì)JavaBean屬性進(jìn)行驗(yàn)證。通過(guò)使用JSR303,我們可以在不編寫繁瑣的驗(yàn)證邏輯代碼的情況下,實(shí)現(xiàn)對(duì)表單數(shù)據(jù)的驗(yàn)證和處理。JSR303使得驗(yàn)證過(guò)程更加簡(jiǎn)單和可讀,并且是一種廣泛應(yīng)用于Java Web開(kāi)發(fā)中的驗(yàn)證框架。

為什么要使用JSR303?

使用JSR303可以提供以下好處:

  • 簡(jiǎn)化驗(yàn)證邏輯:通過(guò)使用JSR303的注解,我們可以直接在JavaBean屬性上添加驗(yàn)證規(guī)則,使得驗(yàn)證邏輯更加清晰和簡(jiǎn)潔。
  • 提高可維護(hù)性:將驗(yàn)證規(guī)則與業(yè)務(wù)邏輯分離,使得驗(yàn)證規(guī)則可以獨(dú)立于業(yè)務(wù)邏輯進(jìn)行修改和擴(kuò)展,提高了代碼的可維護(hù)性。
  • 提供統(tǒng)一驗(yàn)證框架:JSR303是Java標(biāo)準(zhǔn)規(guī)范,被廣泛應(yīng)用于Java Web框架中,使用JSR303可以使得不同的Web框架之間的驗(yàn)證方式保持一致,提高了協(xié)作的效率。

常用注解

在JSR303中,有許多常用的注解用于實(shí)現(xiàn)驗(yàn)證功能,包括:

  • @NotNull:用于標(biāo)記屬性不能為空。
  • @Size:用于指定屬性的長(zhǎng)度范圍。
  • @Pattern:用于指定屬性的正則表達(dá)式驗(yàn)證規(guī)則。
  • @Min:用于指定屬性的最小值。
  • @Max:用于指定屬性的最大值。
    其他還有很多注解,可以根據(jù)具體需求選擇合適的注解進(jìn)行使用。

快速入門JSR303

以下是使用JSR303進(jìn)行表單驗(yàn)證的快速入門示例:

實(shí)體類

package com.yuan.model;import lombok.ToString;import javax.validation.constraints.NotBlank;@ToString
public class Student {@NotBlank(message = "編號(hào)不能為空")private String sid;@NotBlank(message = "名字不能為空")private String sname;@NotBlank(message = "年齡不能為空")private String sage;@NotBlank(message = "性別不能為空")private String ssex;public Student(String sid, String sname, String sage, String ssex) {this.sid = sid;this.sname = sname;this.sage = sage;this.ssex = ssex;}public Student() {super();}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSage() {return sage;}public void setSage(String sage) {this.sage = sage;}public String getSsex() {return ssex;}public void setSsex(String ssex) {this.ssex = ssex;}
}
}

后臺(tái)校驗(yàn)

    //    給數(shù)據(jù)添加服務(wù)端校驗(yàn)@RequestMapping("/valiAdd")public String valiAdd(@Validated Student student, BindingResult result, HttpServletRequest req){
//        如果服務(wù)端驗(yàn)證不通過(guò),有錯(cuò)誤if(result.hasErrors()){
//            服務(wù)端驗(yàn)證了實(shí)體類的多個(gè)屬性,多個(gè)屬性都沒(méi)有驗(yàn)證通過(guò)List<FieldError> fieldErrors = result.getFieldErrors();Map<String,Object> map = new HashMap<>();for (FieldError fieldError : fieldErrors) {
//                將多個(gè)屬性的驗(yàn)證失敗信息輸送到控制臺(tái)System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());map.put(fieldError.getField(),fieldError.getDefaultMessage());}req.setAttribute("errorMap",map);}else {this.studentBiz.insertSelective(student);return "redirect:list";}return "stu/edit";}

JSP頁(yè)面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title></title>
</head>
<body>
<form action="${pageContext.request.contextPath }/${empty s ? 'student/valiAdd' : 'student/edit'}" method="post">學(xué)生編號(hào):<input type="text" name="sid" value="${s.sid }"><span style="color: red">${errorMap.sid}</span><br>學(xué)生姓名:<input type="text" name="sname" value="${s.sname }"><span style="color: red">${errorMap.sname}</span><br>學(xué)生年齡:<input type="text" name="sage" value="${s.sage }"><span style="color: red">${errorMap.sage}</span><br>學(xué)生性別:<input type="text" name="ssex" value="${s.ssex }"><span style="color: red">${errorMap.ssex}</span><br><input type="submit">
</form>
</body>
</html>

頁(yè)面效果
在這里插入圖片描述

通過(guò)在JavaBean的屬性上添加注解,我們可以指定驗(yàn)證規(guī)則。在上述示例中,使用了注解表示該屬性不能為空,注解表示該屬性的長(zhǎng)度范圍是2到20之間,注解表示該屬性的值必須符合正則表達(dá)式"[a-zA-Z0-9]+"。在實(shí)際使用中,我們可以通過(guò)調(diào)用驗(yàn)證器來(lái)驗(yàn)證數(shù)據(jù)是否符合規(guī)則。@NotNull@Size@Pattern

攔截器

什么是攔截器

攔截器是Java Web開(kāi)發(fā)中常見(jiàn)的一種技術(shù),它允許在請(qǐng)求到達(dá)目標(biāo)資源之前或之后對(duì)請(qǐng)求進(jìn)行處理。攔截器可以攔截請(qǐng)求和響應(yīng),并在處理過(guò)程中對(duì)它們進(jìn)行修改和控制。攔截器在開(kāi)發(fā)過(guò)程中具有廣泛的應(yīng)用,用于實(shí)現(xiàn)身份驗(yàn)證、日志記錄、性能監(jiān)控等功能。

攔截器與過(guò)濾器

雖然攔截器和過(guò)濾器在功能上有一些相似之處,但它們?cè)趯?shí)現(xiàn)方式和應(yīng)用場(chǎng)景上有所不同。

  • 過(guò)濾器是基于Servlet規(guī)范的,它通過(guò)在web.xml文件中配置,并作用于整個(gè)應(yīng)用或者特定的URL模式。過(guò)濾器可以在請(qǐng)求到達(dá)目標(biāo)資源之前或之后進(jìn)行處理,但其處理方式是基于Servlet API的。過(guò)濾器通常用于請(qǐng)求和響應(yīng)的預(yù)處理和后處理。
  • 攔截器是基于Java反射機(jī)制的,它通常與特定的框架或技術(shù)相關(guān)聯(lián),比如Spring框架。攔截器可以更加細(xì)粒度地進(jìn)行控制,可以通過(guò)在配置文件或注解中添加攔截器的方式來(lái)指定攔截的目標(biāo)資源。

應(yīng)用場(chǎng)景

攔截器在Java Web開(kāi)發(fā)中具有廣泛的應(yīng)用場(chǎng)景,包括但不限于以下幾個(gè)方面:

  • 身份驗(yàn)證和權(quán)限控制:攔截器可以用于驗(yàn)證用戶的身份,并對(duì)用戶的訪問(wèn)權(quán)限進(jìn)行控制,以確保只有具備相應(yīng)權(quán)限的用戶可以訪問(wèn)受限資源。
  • 日志記錄:攔截器可以用于記錄請(qǐng)求和響應(yīng)的日志信息,包括請(qǐng)求參數(shù)、處理時(shí)間、返回結(jié)果等,便于后期的問(wèn)題排查和系統(tǒng)分析。
  • 參數(shù)處理和轉(zhuǎn)換:攔截器可以在請(qǐng)求到達(dá)目標(biāo)資源之前對(duì)請(qǐng)求參數(shù)進(jìn)行處理和轉(zhuǎn)換,使得目標(biāo)資源能夠更加方便地獲取到需要的數(shù)據(jù)。
  • 性能監(jiān)控:攔截器可以用于統(tǒng)計(jì)和監(jiān)控系統(tǒng)的性能指標(biāo),例如請(qǐng)求處理時(shí)間、訪問(wèn)頻率等,以便及時(shí)發(fā)現(xiàn)潛在的性能問(wèn)題。

快速入門攔截器

以下是使用攔截器進(jìn)行身份驗(yàn)證和權(quán)限控制的快速入門示例:

  • 1.攔截器鏈
package com.yuan.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class OneInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【OneInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【OneInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【OneInterceptor】:afterCompletion...");}
}
package com.yuan.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TwoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【TwoInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【TwoInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【TwoInterceptor】:afterCompletion...");}
}
    <mvc:interceptors><!--2) 多攔截器(攔截器鏈)--><mvc:interceptor><!--這個(gè)是攔截所有的--><mvc:mapping path="/**"/><bean class="com.yuan.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><!--這個(gè)是只攔截/studnt路徑下所有的--><mvc:mapping path="/student/**"/><bean class="com.yuan.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>
  • 2.登錄

登錄攔截器

package com.yuan.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【implements】:preHandle...");StringBuffer url = request.getRequestURL();if (url.indexOf("/login") > 0 || url.indexOf("/logout") > 0){//        如果是 登錄、退出 中的一種return true;}
//            代表不是登錄,也不是退出
//            除了登錄、退出,其他操作都需要判斷是否 session 登錄成功過(guò)String uname = (String) request.getSession().getAttribute("uname");if (uname == null || "".equals(uname)){response.sendRedirect("/page/login");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

Login Web層

package com.yuan.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class LoginController {@RequestMapping("/login")public String login(HttpServletRequest req){String uname = req.getParameter("uname");HttpSession session = req.getSession();if ("yh".equals(uname)){session.setAttribute("uname",uname);}return "redirect:/student/list";}@RequestMapping("/logout")public String logout(HttpServletRequest req){req.getSession().invalidate();return "redirect:/student/list";}
}

login.jsp

<%--Created by IntelliJ IDEA.User: yuanhDate: 2023/9/11Time: 18:38To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<a href="/login?uname=yh">登錄</a>
</body>
</html>

配置攔截器

   <mvc:interceptors><bean class="com.yuan.interceptor.LoginInterceptor"></bean></mvc:interceptors>

以我的代碼為例,如果登錄點(diǎn)擊進(jìn)去攜帶的參數(shù)不為空并且為yh就可以進(jìn)入主界面,如果不是就會(huì)被攔截一直在登錄界面

總結(jié)

本篇博客介紹了JSR303在這里插入代碼片驗(yàn)證框架和攔截器技術(shù)在Java Web開(kāi)發(fā)中的應(yīng)用與實(shí)踐。通過(guò)使用JSR303,我們可以簡(jiǎn)化表單驗(yàn)證邏輯,并提高代碼的可維護(hù)性。攔截器則可以用于實(shí)現(xiàn)身份驗(yàn)證、日志記錄、性能監(jiān)控等功能,提升系統(tǒng)的安全性和可觀測(cè)性。通過(guò)深入掌握和靈活應(yīng)用JSR303和攔截器,我們可以更好地開(kāi)發(fā)出高質(zhì)量的Java Web應(yīng)用。

希望本篇博客能夠幫助你對(duì)JSR303和攔截器有更深入的理解,并能在實(shí)際項(xiàng)目中應(yīng)用它們來(lái)提升開(kāi)發(fā)效率和代碼質(zhì)量。

http://www.risenshineclean.com/news/62331.html

相關(guān)文章:

  • 做網(wǎng)站優(yōu)化哪家公司好關(guān)鍵詞自動(dòng)優(yōu)化
  • 合肥知名網(wǎng)站制作上海關(guān)鍵詞優(yōu)化排名哪家好
  • 松原網(wǎng)站建設(shè)網(wǎng)站建設(shè)的好公司
  • 做網(wǎng)站網(wǎng)頁(yè)掙錢不免費(fèi)刷seo
  • 深圳做網(wǎng)站公司地點(diǎn)十大免費(fèi)網(wǎng)站推廣平臺(tái)
  • 百度搜索量seo要點(diǎn)
  • 圖床網(wǎng)站怎么做廣州seo團(tuán)隊(duì)
  • 石家莊高鐵站123網(wǎng)址之家
  • 秦皇島網(wǎng)站制作方案電商網(wǎng)站怎樣優(yōu)化
  • 網(wǎng)站建設(shè)公司的網(wǎng)銷好做嗎百度輸入法免費(fèi)下載
  • wordpress使用步驟杭州seo網(wǎng)站推廣排名
  • 云南房產(chǎn)網(wǎng)站建設(shè)seo的理解
  • 鹽城z做網(wǎng)站上海專業(yè)的seo公司
  • 專業(yè)網(wǎng)站建設(shè)策劃網(wǎng)絡(luò)營(yíng)銷和網(wǎng)絡(luò)推廣
  • 做測(cè)算的網(wǎng)站影視后期培訓(xùn)機(jī)構(gòu)全國(guó)排名
  • 湖南網(wǎng)站建設(shè) 真好磐石網(wǎng)絡(luò)免費(fèi)推廣網(wǎng)址
  • 山東青島網(wǎng)站建設(shè)樂(lè)天seo視頻教程
  • 做門窗投標(biāo)網(wǎng)站優(yōu)化模型
  • 小學(xué)課程建設(shè)網(wǎng)站目標(biāo)新網(wǎng)域名查詢
  • 百度免費(fèi)做網(wǎng)站百度在線使用網(wǎng)頁(yè)版
  • spring boot 做網(wǎng)站關(guān)鍵詞優(yōu)化推廣公司
  • 手機(jī)網(wǎng)站自動(dòng)適應(yīng)短鏈接在線生成器
  • 山東平臺(tái)網(wǎng)站建設(shè)制作百度網(wǎng)頁(yè)版下載安裝
  • 住建部網(wǎng)站2015年城市建設(shè)統(tǒng)計(jì)seo優(yōu)化的優(yōu)點(diǎn)
  • 奉賢區(qū)網(wǎng)站建設(shè)收錄網(wǎng)站排名
  • 福田祥菱q雙排小貨車報(bào)價(jià)及圖片廈門seo推廣外包
  • 天津自己制作網(wǎng)站網(wǎng)站新站整站排名
  • 網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)設(shè)計(jì)游戲代理加盟平臺(tái)
  • seo兼職論壇手機(jī)優(yōu)化大師官網(wǎng)
  • 怎么快速推廣網(wǎng)站萬(wàn)網(wǎng)域名交易