目录
四、Servlet监听器和过滤器(相信我它也考不到,这么多文字他自己肯定也懒得看,过滤器可以看一下)
3. 示例代码(以 ServletContextListener 为例)
一、JavaBean
1、规范与定义
定义:
1、字段私有,public方法来访问私有字段set/get/is等方法
2、最好提供一个无参的构造
3、最好实现一个接口
概念:JavaBean一般只封装数据,不包含复杂逻辑的方法
属性:如果Java Bean中只要有一个get/set方法则我们就称为该Java Bean中有一个xxx属性。(例如下方示例我们就可以说Student这个JavaBean有name属性)
注:其实这个对于我们来说这是很熟悉的,无参构造和带参构造在我们C++中如果你的代码规范的话,这两个是很好理解的;get和set在C++中就是其它文件可以对某一个文件中的一个私有成员进行访问。
示例:
testJavaBean.java
package com.example; class Student //加上接口的写法就是class Student implements Serializable { private String name; public Student() { } public Student(String name) { this.name = name; } // Getter 和 Setter 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } }
student.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.example.Student" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsp对javabean的使用</title> </head> <body> <% Student student = new Student(); student.setName("王五"); %> <h2>学生信息</h2> <p>姓名: <%= student.getName() %></p> </body> </html>
2、与JavaBean相关的JSP动作标签
<jsp:useBean>
此标签用于在 JSP 页面里创建或者查找 JavaBean 实例。
<jsp:useBean id="beanName" class="package.className" scope="page|request|session|application" />
id
:JavaBean 实例的唯一标识符,后续可通过该标识符引用这个实例。
class
:JavaBean 类的全限定名。
cope
:指定 JavaBean 实例的作用域,有四个可选值:
page
:仅在当前 JSP 页面有效。
request
:在当前请求范围内有效。
session
:在整个会话期间有效。
application
:在整个应用程序范围内有效。
根据以上testJavaBean.java写的示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JavaBean 动作标签示例</title> </head> <body> <!-- 创建 Student JavaBean 实例 --> <jsp:useBean id="student" class="com.example.Student" scope="request" /> <!-- 设置 JavaBean 的属性值 --> <jsp:setProperty name="student" property="name" value="李四" /> <!-- 显示 JavaBean 的属性值 --> <h2>学生信息</h2> <p>姓名: <jsp:getProperty name="student" property="name" /></p> </body> </html>
根据以上我们可以理解到其实<jsp:useBean ……>也就相当于new了;<jsp:setProperty……>和<jsp:getProperty……>也就是直接代替了set/get函数。
二、MV开发模式(JSP+JavaBean)
JavaBean+JSP开发模式我们一般成为MV模式或Model1模式,可以很好实现前后端业务分离。简单来说就是客户在JSP页面操作,JSP去调用JavaBean进行数据处理。这其实也就是MVC少了C罢了。
三、Servlet组件
1、Servlet定义
JSP代表MVC中的V但还是有有一些业务逻辑,Servlet实际上就是进一步分理出业务逻辑。
概念:运行在服务端的小程序
Servlet就是一个实现了javax.servlet.Servlet接口,定义了Java类被Tomcat识别的规则。
2、基于HTTP请求的Servlet开发
没什么好讲的看懂示例就可以了与C++的MVC做对比性观看
文件路径
my-web-app
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── MyServlet.java
│ └── webapp
│ ├── WEB-INF
│ │ ├── web.xml
│ │ └── classes
│ └── index.jsp
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- Servlet 配置 --> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <!-- 与上同那么 --> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping> </web-app>
<servlet-mapping>对servlet进行一个映射;<url-pattern>就是设置一个访问的路径可以通过哪个路径访问到这里就是例如:https://localhost:8080/myServlet可以访问到这个servlet,下main的注解中是相同的
MyServlet.java
import java.io.IOException; import jakarta.servlet.*; @WebServlet("/myServlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String message = request.getParameter("message"); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Servlet Example</title> </head> <body> <h1>Send Request to Servlet</h1> <!-- GET 请求表单 --> <form action="myServlet" method="get"> <label for="name">Name:</label> <input type="text" id="name" name="dcm"> <input type="submit" value="Send GET Request"> </form> <!-- POST 请求表单 --> <form action="myServlet" method="post"> <label for="message">Message:</label> <textarea id="message" name="hello"></textarea> <input type="submit" value="Send POST Request"> </form> </body> </html>
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_3_1.xsd" version="3.1"> <!-- 配置 UserServlet --> <servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>com.example.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping> </web-app>
3、Sevlet执行原理
执行原理:
(1)当服务器接收到客户端请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
(2)查找web.xml文件,是否有对应的<url-pattern>标签体内容
(3)如果有,则找对应的<servlet-class>全类名
(4)tomcat会将字节码文件加载进内存,并且会创建对象
(5)调用其方法,访问的时候进行初始化init(),执行的时候执行service(),销毁的时候执行destroy(),很好理解这三个就差不多相当于C++中的纯虚函数,只需要重写它就会自己调用。
4、控制器程序的分层设计(DAO)模式
书上讲的很复杂,实际上我们用C++中的MVC来看就易懂很多了
这个就是本人写的一个C++项目中使用到了MVC框架。model中的usermodel继承于我的basemodel也就是一个总业务逻辑,quser呢就是我们访问到的数据对象。
这是Java中的MVC框架。我们对比来看其实
service->UserService.jav+dao->UserDAO.java相当于singleDB+control->qcontrol+model->basemodel->usermodel.cpp去数据库中访问我们需要的user数据,
java中的model->User.java相当于我们的data->quser.cpp一个访问的数据对象
java示例:
User.java
(数据对象)public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
UserDAO.java
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class UserDAO { private static final String URL = "jdbc:mysql://localhost:3306/mydb"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public User findById(int id) { User user = null; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id =?")) { stmt.setInt(1, id); ResultSet rs = stmt.executeQuery(); if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); } } catch (SQLException e) { e.printStackTrace(); } return user; } public List<User> findAll() { List<User> users = new ArrayList<>(); try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users")) { ResultSet rs = stmt.executeQuery(); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; } // 其他增删改操作方法... }
UserService.java
(调用我们的UserDao,然后返回数据)import java.util.List; public class UserService { private UserDAO userDAO = new UserDAO(); public User findUserById(int id) { return userDAO.findById(id); } public List<User> findAllUsers() { return userDAO.findAll(); } // 其他业务逻辑方法... }
UserServlet.java
(实例化UserService然后获取它的返回值去给页面)import java.io.IOException; import java.util.List; import jakarta.servlet.*; @WebServlet("/user") public class UserServlet extends HttpServlet { private UserService userService = new UserService(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<User> users = userService.findAllUsers(); request.setAttribute("users", users); request.getRequestDispatcher("userList.jsp").forward(request, response); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户管理</title> </head> <body> <h1>用户管理系统</h1> <a href="user">查看用户列表</a> </body> </html>
C++示例:
quser.h(java中的User一样)
singledb .cpp(类似于DAO层但这个用的是单例模式)
#include "singledb.h"
//懒汉式单例设计模式
SingleDB* SingleDB::db=nullptr;
SingleDB *SingleDB::getInstance()
{
//只有第一次调用会new
if(SingleDB::db==nullptr)
{
SingleDB::db=new SingleDB();
}
return SingleDB::db;
}
void SingleDB::relaseInstance()
{
if(SingleDB::db!=nullptr)
{
delete SingleDB::db;
SingleDB::db=nullptr;
}
}
int SingleDB::openDB(char *path)
{
int res=0;
res=sqlite3_open(path,&this->psqlite);
if(res==SQLITE_OK)
{
//qDebug()<<"open success";
}
else
{
qDebug()<<"错误码:"<<sqlite3_errcode(this->psqlite);
qDebug()<<"错误信息:"<<sqlite3_errmsg(this->psqlite);
}
return res;
}
void SingleDB::closeDB()
{
if(this->psqlite!=NULL)
{
int res=sqlite3_close(this->psqlite);
if(res==SQLITE_OK)
{
qDebug()<<"open success";
}
else
{
qDebug()<<"错误码:"<<sqlite3_errcode(this->psqlite);
qDebug()<<"错误信息:"<<sqlite3_errmsg(this->psqlite);
}
}
}
SingleDB::SingleDB()
{
openDB("../database/IntelligentSecuritySystem.db");
}
SingleDB::~SingleDB()
{
closeDB();
}
sqlite3 *SingleDB::getPsqlite() const
{
return psqlite;
}
和上面的singledb结合在一起来返回一个从数据库中查到的user数据。只不过在java中返回的数据专门用了一个Service来返回
以下是cpp获取数据库中数据的方法
5、Servlet实现文件上传与下载 (我赌他不考)
略……
四、Servlet监听器和过滤器(相信我它也考不到,这么多文字他自己肯定也懒得看,过滤器可以看一下)
说了不考,那么不相信我,那还看我的博客复习啥。既然要看那我就简单以我的理解给你概括一下吧,下面这些呢,一般都是init->过程->destory过程好了结束了,就是创建->执行->销毁,好了吧浪费一分钟了吧!快去下一篇吧!!!
1、Servle监听器
1.概念和作用
Servlet 监听器是一种特殊的 Java 类,用于监听 Web 应用程序中的各种事件,比如 Servlet 上下文(
ServletContext
)的创建和销毁、会话(HttpSession
)的创建和销毁、请求(ServletRequest
)的初始化和销毁等。通过监听器,我们可以在这些事件发生时执行一些特定的操作,例如记录日志、初始化资源、统计在线用户数量等。
2. 常见的监听器类型
Servlet 上下文监听器:
ServletContextListener
:监听ServletContext
的创建和销毁事件。当 Web 应用程序启动时,ServletContext
被创建,contextInitialized(ServletContextEvent event)
方法被调用;当 Web 应用程序停止时,ServletContext
被销毁,contextDestroyed(ServletContextEvent event)
方法被调用。
ServletContextAttributeListener
:监听ServletContext
属性的添加、删除和替换事件。对应的方法分别是attributeAdded(ServletContextAttributeEvent event)
、attributeRemoved(ServletContextAttributeEvent event)
和attributeReplaced(ServletContextAttributeEvent event)
。会话监听器:
HttpSessionListener
:监听HttpSession
的创建和销毁事件。sessionCreated(HttpSessionEvent event)
方法在会话创建时调用,sessionDestroyed(HttpSessionEvent event)
方法在会话销毁时调用。
HttpSessionAttributeListener
:监听HttpSession
属性的添加、删除和替换事件。对应的方法是attributeAdded(HttpSessionBindingEvent event)
、attributeRemoved(HttpSessionBindingEvent event)
和attributeReplaced(HttpSessionBindingEvent event)
。
HttpSessionActivationListener
:监听HttpSession
的活化(从持久化存储恢复到内存)和钝化(将内存中的会话数据保存到持久化存储)事件。sessionDidActivate(HttpSessionEvent event)
方法在会话活化时调用,sessionWillPassivate(HttpSessionEvent event)
方法在会话钝化时调用。请求监听器:
ServletRequestListener
:监听ServletRequest
的初始化和销毁事件。requestInitialized(ServletRequestEvent event)
方法在请求初始化时调用,requestDestroyed(ServletRequestEvent event)
方法在请求销毁时调用。
ServletRequestAttributeListener
:监听ServletRequest
属性的添加、删除和替换事件。对应的方法分别是attributeAdded(ServletRequestAttributeEvent event)
、attributeRemoved(ServletRequestAttributeEvent event)
和attributeReplaced(ServletRequestAttributeEvent event)
。
3. 示例代码(以 ServletContextListener
为例)
import jakarta.servlet.*;
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 初始化了!");
// 可以在这里进行一些初始化操作,如加载配置文件等
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext 销毁了!");
// 可以在这里进行资源清理等操作
}
}
二、Servlet 过滤器(Filter)
1. 概念和作用
Servlet 过滤器是一个实现了
Filter
接口的 Java 类,它可以对 Web 应用程序中的请求和响应进行拦截和处理。过滤器可以在请求到达 Servlet 之前对请求进行预处理,也可以在 Servlet 处理完请求后对响应进行后处理。常见的应用场景包括权限验证、字符编码转换、日志记录、请求参数修改等。
2. Filter
接口的方法
init(FilterConfig filterConfig)
:在过滤器被实例化后,容器会调用这个方法来初始化过滤器。FilterConfig
对象提供了访问过滤器配置信息的方法。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:这是过滤器的核心方法,当请求进入过滤器时,容器会调用这个方法。在这个方法中,过滤器可以对请求和响应进行处理,然后通过chain.doFilter(request, response)
方法将请求传递给下一个过滤器或目标 Servlet。
destroy()
:当过滤器被销毁时,容器会调用这个方法。在这个方法中,可以进行一些资源清理的操作。
3. 示例代码(简单的字符编码过滤器)
import jakarta.servlet.*;
import java.io.IOException;
@WebFilter("/user") // 拦截所有访问 /user 的请求
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作,这里可以不做具体处理
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8"); // 设置请求的字符编码
response.setCharacterEncoding("UTF-8"); // 设置响应的字符编码
chain.doFilter(request, response); // 将请求传递给下一个过滤器或目标 Servlet
}
@Override
public void destroy() {
// 资源清理操作,这里可以不做具体处理
}
}