Java基礎入門day57

day57

JSP、Servlet,Java bean和JDBC整合項目

index.jsp頁面

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head><title>JSP - Hello World</title>
</head>
<body>
<h1><%= "student page!" %>
</h1>
<br/>
<a href="Stu">all student</a>
<a href="stu.jsp">save student</a>
</body>
</html>

用戶點擊all student超鏈接會請求Stu這個url所對應Servlet叫做StudentServlet

StudentServlet.java

package com.saas.servlet;
?
import com.saas.service.IStudentService;
import com.saas.service.impl.StudentServiceImpl;
import com.saas.entity.Student;
?
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
?
@WebServlet(urlPatterns = "/Stu")
public class StudentServlet extends HttpServlet {
?private IStudentService iss = new StudentServiceImpl();
?@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
?@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Student Servlet");
?List<Student> students =iss.getAllStudents();
?
// ? ? ?  resp.getWriter().write(students.toString());
?req.setAttribute("students",students);
?req.getRequestDispatcher("stus.jsp").forward(req,resp);}
}

該servlet結束StudentService以及StudentDao完成數據的查詢,得到Student的List數據,并將該list存放在key值為students所對應的request范圍內

最后跳轉到stus.jsp頁面

stus.jsp

<%@ page import="com.saas.entity.Student" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/5/23
Time: 9:24
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>students</title>
</head>
<body>
<h1>all students</h1>
?
<table border="1" width="80%" align="center"><tr><td>sid</td><td>name</td><td>sex</td><td>age</td><td>score</td><td>cid</td><td>operation</td></tr><%List<Student> students = (List<Student>) request.getAttribute("students");for (Student student : students) {%><tr><td><%=student.getSid()%></td><td><%=student.getName()%></td><td><%=student.getSex()%></td><td><%=student.getAge()%></td><td><%=student.getScore()%></td><td><%=student.getCid()%></td><td><a href="Stu?action=getStudentBySid&sid=<%=student.getSid()%>">update</a></td></tr><%}%>
</table>
</body>
</html>

在該JSP頁面中通過JSP的內置對象request獲取到key值為students的value所對應的Student的list數據

在該頁面中使用循環對于Student類所對應的list students進行遍歷

先畫表格的頭部

再去循環list

list中嵌套html標簽,通過表格里面的tr循環所有的數據到表格中

最終將Student的所有對象的list在瀏覽器頁面中以表格的方式呈現給用戶

升級StudentServlet.java

package com.saas.servlet;
?
import com.saas.service.IStudentService;
import com.saas.service.impl.StudentServiceImpl;
import com.saas.entity.Student;
?
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
?
@WebServlet(urlPatterns = "/Stu")
public class StudentServlet extends BaseServlet {
?private IStudentService iss = new StudentServiceImpl();
?
?protected void getAllStudents(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Student Servlet");
?List<Student> students =iss.getAllStudents();
?
// ? ? ?  resp.getWriter().write(students.toString());
?req.setAttribute("students",students);
?req.getRequestDispatcher("stus.jsp").forward(req,resp);}
?
?protected void getStudentBySid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ? ? ?  super.doGet(req, resp);String ssid = req.getParameter("sid");
?int sid = ssid == null ? 0 : Integer.parseInt(ssid);
?Student student = iss.getStudentBySid(sid);
?
// ? ? ?  resp.getWriter().write(student.toString());
?req.setAttribute("student", student);
?req.getRequestDispatcher("stu.jsp").forward(req, resp);}
?protected void saveStudent(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");String sex = req.getParameter("sex");String sage = req.getParameter("age");int age = sage == null ? 0 : Integer.parseInt(sage);String sscore = req.getParameter("score");double score = sscore == null ? 0 : Double.parseDouble(sscore);String scid = req.getParameter("cid");int cid = scid == null ? 0 : Integer.parseInt(scid);String ssid = req.getParameter("sid");int sid = ssid == null ? 0 : Integer.parseInt(ssid);
?Student s = new Student();s.setSid(sid);s.setName(name);s.setSex(sex);s.setAge(age);s.setScore(score);s.setCid(cid);boolean flag = iss.updateStudent(s);
?if(flag){resp.sendRedirect("Stu?action=getAllStudents");}}
}

這個Servlet里面完成了三個功能,查詢所有學生,查詢單個學生和修改學生

這個類繼承了我們之前反射完成的BaseServlet,可以保證整個項目中,只需要一個方法完成對于不同操作的分支處理

BaseServlet.java

package com.saas.servlet;
?
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
?
public class BaseServlet extends HttpServlet {
?@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
?
// ? ? ?  req.setCharacterEncoding("UTF-8");
// ? ? ?  resp.setCharacterEncoding("UTF-8");
// ? ? ?  resp.setContentType("text/html;charset=UTF-8");
?
?Class<? extends BaseServlet> clazz = getClass();
?String action = req.getParameter("action");
?try {Method method = clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
?method.setAccessible(true);
?method.invoke(this, req, resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}
}

這個Servlet中,讓所有的Servlet都繼承自該類,該類的service方法中動態獲取傳遞過來的action用來交給各自Servlet中的業務方法

IStudentService.java

package com.saas.service;
?
import com.saas.entity.Student;
?
import java.util.List;
?
public interface IStudentService {List<Student> getAllStudents();
?Student getStudentBySid(int sid);
?boolean updateStudent(Student s);
}

這個業務類中只是實現了查詢所有,根據id查詢單個對象以及修改功能,我們可以根據自己的需要進行方法的增減

StudentServiceImpl.java

package com.saas.service.impl;
?
import com.saas.dao.IStudentDao;
import com.saas.dao.impl.StudentDaoImpl;
import com.saas.entity.Student;
import com.saas.service.IStudentService;
?
import java.util.List;
?
public class StudentServiceImpl implements IStudentService {
?private IStudentDao studentDao = new StudentDaoImpl();
?@Overridepublic List<Student> getAllStudents() {return studentDao.getAllStudents();}
?@Overridepublic Student getStudentBySid(int sid) {return studentDao.getStudentBySid(sid);}
?@Overridepublic boolean updateStudent(Student s) {return studentDao.updateStudent(s) > 0;}
}

service接口的實現類,通過調用dao來完成自己的業務方法

IStudentDao.java

package com.saas.dao;
?
import com.saas.entity.Student;
?
import java.util.List;
?
public interface IStudentDao {List<Student> getAllStudents();
?Student getStudentBySid(int sid);
?int updateStudent(Student s);
}

dao接口中用來完成dao層的查詢所有,查詢單個對象,以及修改功能,我們也可以后期做增減

StudentDaoImpl.java

package com.saas.dao.impl;import com.saas.dao.IStudentDao;
import com.saas.entity.Student;
import com.saas.util.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;import java.sql.SQLException;
import java.util.List;public class StudentDaoImpl implements IStudentDao {private QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());@Overridepublic List<Student> getAllStudents() {try {return qr.query("select * from student", new BeanListHandler<Student>(Student.class));} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic Student getStudentBySid(int sid) {try {return qr.query("select * from student  where sid = ?", new BeanHandler<Student>(Student.class), sid);} catch (SQLException e) {throw new RuntimeException(e);}}@Overridepublic int updateStudent(Student s) {try {return qr.update("update student set name = ?, age =? , sex = ?, score = ?, cid = ? where sid = ?",s.getName(), s.getAge(), s.getSex(), s.getScore(), s.getCid(), s.getSid());} catch (SQLException e) {throw new RuntimeException(e);}}
}

dao層的實現類,借助apache的dbutil工具jar包的api query runner完成dao的具體功能

Student.java

package com.saas.entity;public class Student {private int  sid;private String  name;private String  sex;private double  score;private int  cid;private int  age;@Overridepublic String toString() {return "Student{" +"sid=" + sid +", name='" + name + '\'' +", sex='" + sex + '\'' +", score=" + score +", cid=" + cid +", age=" + age +'}';}public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

學生的實體類

MySQL

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sid   | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | char(6)     | YES  |     | NULL    |       |
| score | double      | YES  |     | NULL    |       |
| cid   | int(11)     | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

數據庫中student的表結構

DruidUtil.java

package com.saas.util;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;public class DruidUtil {private static Env env = Env.getInstance();public static DataSource getDataSource(){try {DruidDataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(env);dataSource.setUrl(env.getProperty("url"));dataSource.setUsername(env.getProperty("user"));dataSource.setPassword(env.getProperty("pass"));dataSource.setDriverClassName(env.getProperty("driver"));return dataSource;} catch (Exception e) {throw new RuntimeException(e);}}
}

連接池工具類

Env.java

package com.saas.util;import java.io.IOException;
import java.util.Properties;public class Env extends Properties {private static final long serialVersionUID = 1L;private static Env env = new Env();private Env() {super();try {load(getClass().getResourceAsStream("/db.properties"));} catch (IOException e) {throw new RuntimeException(e);}}public static Env getInstance() {return env;}public static String get(String key) {return env.getProperty(key);}
}

單例模式動態加載db.properties文件是為了更好地實現跨平臺操作

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/saas?characterEncoding=utf-8
user=root
pass=Abc@1234

CharacterFilter.java

package com.saas.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;//@WebServlet("/*")
public class CharacterFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");chain.doFilter(request, response);}}

關于中文亂碼的處理交給當前的過濾器來完成

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>CharacterFilter</filter-name><filter-class>com.saas.filter.CharacterFilter</filter-class></filter><filter-mapping><filter-name>CharacterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

三個jar包支持

commons-dbutils-1.6.jar druid-1.0.28.jar mysql-connector-java-5.1.37.jar

小結:

以上功能寫了三個功能,查詢所有學生對象,根據sid查詢單個學生對象以及修改功能

之前我們也寫過,只不過今天關于serlet中編寫的html代碼完全交給了jsp頁面,杜絕了在Servlet的java代碼中編寫了大量的Java代碼

只要是頁面標簽性的東西都交給jsp去完成

只要是邏輯控制的東西都交給servlet的邏輯控制去完成

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17461.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS 媒體查詢 響應式開發

介紹 媒體查詢&#xff08;Media Queries&#xff09;是CSS3的技術&#xff0c;可以根據設備的特性&#xff08;如屏幕寬度、高度、方向等&#xff09;來應用不同的樣式規則。媒體查詢可以使網頁在不同設備上呈現不同的樣式&#xff0c;以實現響應式設計。 語法 media scree…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加載預訓練模型參數對不齊和收到意外參數報錯解決方案

使用mmdetection時遇到的問題比較多&#xff0c;首先要對自己要使用的預訓練模型有一定的了解&#xff0c;并且懂得使用各種分類模型時不同的模型不同任務執行階段需要參數上的對其。&#xff08;比如mask-rcnn和它的三個頭之間的參數&#xff09;。 首先&#xff0c;談談torc…

什么是聲明式事務管理?

聲明式事務管理是Spring提供的一種事務管理機制&#xff0c;它允許開發者通過聲明的方式&#xff0c;而不是通過編程的方式&#xff0c;來管理事務的邊界和行為。在聲明式事務管理中&#xff0c;你可以通過注解或XML配置來指定方法或類上的事務屬性和行為。 在Spring中&#x…

Spring Boot集成六大常用中間件,附集成源碼,親測有效

目錄 萬字論文&#xff0c;從0到1&#xff0c;只需1小時獲取途徑1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

JavaEE(入門)

JavaEE &#xff08;詳細注釋版&#xff09; 1. 入門基礎 1.1 JavaEE簡介 JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;是由Sun Microsystems推出的一套標準&#xff0c;現由Oracle維護。JavaEE平臺主要用于開發和運行企業級應用程序&#xff0c;具有高…

11 Goroutine-并發與并行、阻塞與非阻塞

并發 順序執行&#xff1a;按照事先計劃好的順序&#xff0c;執行完一個操作后&#xff0c;再執行下一個操作。 順序執行效率不高的原因&#xff1a; 每個操作由多個步驟組成&#xff0c;每個步驟所需要的時間長短不一&#xff0c;有些步驟可能相當耗時。顧客點菜需要時間&a…

VectorDBBench在windows的調試

VectorDBBench在windows的調試 VectorDBBench是一款向量數據庫基準測試工具&#xff0c;支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等&#xff0c;可以測試其QPS、時延、recall。 VectorDBBench是一款使用python編寫的…

輕松學EntityFramework Core--Entity Framework Core 簡介

一、什么是Entity Framework Core Entity Framework Core&#xff08;簡稱EF Core&#xff09;是一個現代的、跨平臺的、開源的ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;由微軟開發。它允許.NET開發者通過.NET對象與關系型數據庫進行交互&#xff0c;而無需編…

putty中的plink.exe功能和用法

plink對于自動化的執行命令和工作非常有好處。plink可以讓我們直接在命令行制定好命令&#xff0c;然后執行&#xff0c;完成后自動關閉session。 Plink: command-line connection utility Release 0.81 Usage: plink [options] [user]host [command]("host" can al…

2024年150道高頻Java面試題(七十四)

147. 如何在 MyBatis 中實現一對多和多對一的關系映射&#xff1f; 在 MyBatis 中實現一對多&#xff08;One-to-Many&#xff09;和多對一&#xff08;Many-to-One&#xff09;的關系映射&#xff0c;主要是通過 <resultMap> 元素中的 <collection> 和 <assoc…

深度學習模型在OCR中的可解釋性問題與提升探討

摘要&#xff1a; 隨著深度學習技術在光學字符識別&#xff08;OCR&#xff09;領域的廣泛應用&#xff0c;人們對深度學習模型的可解釋性問題日益關注。本文將探討OCR中深度學習模型的可解釋性概念及其作用&#xff0c;以及如何提高可解釋性&#xff0c;使其在實際應用中更可…

在Linux系統上使用Nginx的詳解指南

目錄 簡介 準備工作 安裝Nginx 通過包管理器安裝 源碼編譯安裝 Nginx基礎配置 主配置文件nginx.conf詳解 基本服務器塊配置 SSL/TLS配置 動靜分離 反向代理配置 負載均衡配置 常見問題及解決方法 結論 1. 簡介 Nginx是一款高性能HTTP和反向代理服務器&#xff…

上位機圖像處理和嵌入式模塊部署(f103 mcu唯一的id)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 對于stm32f103系列mcu來說,一般每一顆原廠的mcu,都會對應一個唯一的id。那這個id可以用來做什么用呢?個人認為,可以用來做激活使用。舉個例子,第一次mcu模塊使用的時候,一般可…

Java 零基礎入門學習(小白也能看懂!)

&#x1f4da;博客主頁&#xff1a;愛敲代碼的小楊. ?專欄&#xff1a;《Java SE語法》 | 《數據結構與算法》 | 《C生萬物》 |《MySQL探索之旅》 |《Web世界探險家》 ??感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;&#xff0c;您的三連就是我持續更…

第16篇:JTAG UART IP應用<三>

Q&#xff1a;如何通過HAL API函數庫訪問JTAG UART&#xff1f; A&#xff1a;Quartus硬件工程以及Platform Designer系統也和第一個Nios II工程--Hello_World的Quartus硬件工程一樣。 Nios II軟件工程對應的C程序調用HAL API函數&#xff0c;如open用于打開和創建文件&#…

前端最新面試題(ES6模塊篇)

目錄 1 ES5、ES6和ES2015有什么區別? 2 babel是什么,有什么作用? 3 let有什么用,有了var為什么還要用let? 4 舉一些ES6對String字符串類型做的常用升級優化? 5 舉一些ES6對Array數組類型做的常用升級優化 6 舉一些ES6對Number數字類型做的常用升級優化 7 舉一些ES…

前端基礎入門三大核心之JS篇:JavaScript,不只是咖啡因那么簡單!—— 進階案例集錦篇

前端基礎入門三大核心之JS篇&#xff1a;解鎖JavaScript的魔法密鑰—— 進階案例集錦 &#x1f9d9; 基礎概念與作用&#xff1a;JS&#xff0c;不僅僅是“腳本”&#x1f4da; 變量聲明的進化史 &#x1f50d; 多維度功能使用&#xff1a;函數、數組與對象&#x1f916; 函數&…

前后端聯調小細節

前端向后端發數據&#xff0c;有時候前端和后端的字段是一樣的&#xff0c;字段沒有問題&#xff0c;前端發過來的載荷也沒有問題&#xff0c;但后端接收到的字段是null的&#xff0c;這時候可以排查前端發過來的數據是不是多嵌套了一層&#xff0c;比如發過來的是。 實例如下…

使用YOLOv9訓練和測試自己的數據集

任務&#xff1a;檢測舌頭上的裂紋和齒痕 已經有了labelme標注的數據集&#xff0c;并且轉為了coco格式 參考&#xff1a; 詳細&#xff01;正確&#xff01;COCO數據集&#xff08;.json&#xff09;訓練格式轉換成YOLO格式&#xff08;.txt&#xff09;_coco數據集的train…

服務器數據恢復—服務器raid常見故障表現原因解決方案

RAID&#xff08;磁盤陣列&#xff09;是一種將多塊物理硬盤整合成一個虛擬存儲的技術&#xff0c;raid模塊相當于一個存儲管理的中間層&#xff0c;上層接收并執行操作系統及文件系統的數據讀寫指令&#xff0c;下層管理數據在各個物理硬盤上的存儲及讀寫。相對于單獨的物理硬…