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.mzph.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;下层管理数据在各个物理硬盘上的存储及读写。相对于单独的物理硬…