当前位置: 首页 > news >正文

day30_servlet

今日内容

零、复习昨日

一、接收请求

二、处理响应

三、综合案例

零、复习昨日

画图, 请求处理的完整流程(javaweb开发流程)

image-20230818094130792

零、注解改造

@WebServlet注解,相当于是在web.xml中配置的servlet映射

Servlet类

package com.qf.servlet;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;/*** --- 天道酬勤 ---** @author QiuShiju* @desc* 注解@WebServlet取代web.xml中的配置* 服务器运行时会处理这个注解* 根据注解后的参数匹配请求路径*/
@WebServlet("/a")
public class MyServlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("接收请求" );}
}

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"><!--    @WebServlet("/a")可以取代以下配置-->
<!--    <servlet>-->
<!--        <servlet-name>aServlet</servlet-name>-->
<!--        <servlet-class>com.qf.servlet.MyServlet1</servlet-class>-->
<!--    </servlet>-->
<!--    <servlet-mapping>-->
<!--        <servlet-name>aServlet</servlet-name>-->
<!--        <url-pattern>/a</url-pattern>-->
<!--    </servlet-mapping>--></web-app>

启动项目,访问/a路径即可

一、接收请求

需求: html页面中写一个表单,发送请求,后台服务器接收所有请求数据

1.1 编写页面

index.jsp或者index.html都行

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body><%--input必须加name属性,因为后台服务器通过name获取输入框的值单选,复选框,选择框,需要设置value属性,后台服务器获得是value的值文件上传比较特殊,后续单独讲,暂时忽略
--%>
<h1>演示:servlet接收请求数据</h1>
<form action="/req" method="get"><table><tr><td>用户名</td><td><input type="text" name="username"></td></tr><tr><td>密码</td><td><input type="password" name="password"></td></tr><tr><td>性别</td><td><input type="radio" name="sex" value="1">男<input type="radio" name="sex" value="2">女</td></tr><tr><td>爱好</td><td><input type="checkbox" name="hobby" value="1">唱歌<input type="checkbox" name="hobby" value="2">跳舞<input type="checkbox" name="hobby" value="3">rap</td></tr><tr><td>生日</td><td><input type="date" name="birthday"></td></tr><tr><td>学历</td><td><select name="xl"><option value="1">大专</option><option value="2">本科</option><option value="3">研究生</option></select></td></tr><tr><td>提交</td><td><input type="submit" value="提交"></td></tr></table>
</form>
</body>
</html>

image-20230818104807614

1.2 编写Servlet

package com.qf.servlet;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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 演示接收请求数据*/
@WebServlet("/req")
public class MyServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*** 请求中有请求方法,请求路径以及请求数据* ----------------------------------* 通过doGet方法参数1 HttpServletRequest req对象来获得请求数据* ps:当请求到达该类的这个方法时,该参数req就会被赋值,其中就有关于请求的所有东西*/String method = req.getMethod( );String uri = req.getRequestURI( );StringBuffer url = req.getRequestURL( );System.out.println("method = " +  method);System.out.println("uri = " +  uri);// uri资源标识符System.out.println("url = " +  url);// url资源定位符// ===============获得请求数据[重点]===================/*** 获得请求参数的方法是* req.getParameter("key"); key就是前端标签name值* [重点:] 后端获得的数据全都是字符串,如果需要后续使用,* 还需按照性质做相应的转换* 比如: 字符串转数字,字符串转日期*/String username = req.getParameter("username");String password = req.getParameter("password");String sex = req.getParameter("sex");// int i = Integer.parseInt(sex);String birthday = req.getParameter("birthday");// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// try {//     Date parse = sdf.parse(birthday);// } catch (ParseException e) {//     e.printStackTrace( );// }String xl = req.getParameter("xl");System.out.println("username = " +  username);System.out.println("password = " +  password);System.out.println("sex = " +  sex);System.out.println("birthday = " +  birthday);System.out.println("xl = " +  xl);// 多选框使用getParameterValues()String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println("hobby = " + hobby );}}
}

总结:

  • req.getParameter(“”) 能获得请求数据
  • req.getParameterValues(“”) 能获得请求数据

1.3 配置web.xml

注解开发,不需要配置

1.4 部署项目

1.5 启动测试

复习回顾

前端
html,css,js/jq

后端服务器:

1开发架构有哪些:

  • b/s,
  • c/s

2服务器是干什么的?

  • 运行web项目项目容器
  • 接收请求,做出响应

3浏览器如何发出的请求

  • 常见的如,a标签,form表单
  • js中使用ajax发请求
  • vue中使用axios发请求

4发请求后如何与后端servlet类关联的?
(或者说绑定的?一一映射的?)

  • 没注解时,通过web.xml文件一一映射关联
  • 有注解,通过注解@WebServlet(“/路径”)中设置路径

5什么时候servlet类会执行doGet方法,什么时候执行doPost方法?

  • 前端发get,后端就执行doGet
  • 前端发post,后端就执行doPost

6写出完整的项目(假设项目命名his)http请求路径,以登录(login)请求为例

  • 协议://ip:端口/资源?k=v&k=v
  • jdbc:mysql://localhost:3306/java2313?useSSL=false&serverTimeZone=utc
  • http://localhost:8080/his/login?username=admin&password=123456

7画图, 请求处理的完整流程(javaweb开发流程)

8具体如何接收请求中的数据?

  • 通过HttpServletRequest对象接收请求中的数据
  • 通过req对象调用getParameter(“key”)

二、做出响应

做出响应是通过HttpServletResponse对象

  • 响应正文
    • 向浏览器展现的内容
package com.qf.servlet;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.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 演示接收请求数据,响应内容*/
@WebServlet("/req")
public class MyServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// ....// ==================演示响应=======================/*** 响应是通过HttpServletResponse resp对象来完成* 响应可以设置响应内容(即展示在浏览器上的内容)* -----------------------------------------* ps: 其实响应也可以设置响应状态码,但是一般不需要,服务器会自动设置状态码* 但是需要知道一些常见状态码:* 200 成功, 404 资源未找到, 500 服务器内部错误,* 405 get/post请求方式不对,400 一般是数据解析出错了*/// 响应乱码,在响应前设置编码格式resp.setContentType("text/html;charset=utf-8");// 响应是通过输出流的形式实现PrintWriter out = resp.getWriter( );//out.write("hello this is response - 这是响应");out.write("<html>");out.write("<head><title>响应</title></head>");out.write("<body>");out.write("<h1>这是响应的页面</h1>");out.write("<div style='color:red'>div</div>");out.write("<p style='color:red'>"+username+"</p>");out.write("</body>");out.write("</html>");}
}

三、乱码解决

请求乱码

 req.setCharacterEncoding("utf-8");

响应乱码

resp.setContentType("text/html;charset=utf-8");

四、 综合案例-登录(Servlet + JDBC)

  • 要求:实现登录功能
第一步: 先设计数据库库,表 (ORM,要根据表设置实体类)
登录页面html/jsp表单发送请求,携带数据
后台服务器代码servlet,接收数据jdbc+ormservlet,做出响应

4.0 项目结构[重点]

web开发有三层架构

  • 控制层 -servlet 流程控制,是指整个请求响应的流程
  • 业务层 - service - 是指在请求接收后,对数据按照需求处理
  • 数据访问层 - DataAccessObject - DAO

image-20230818145238992

三层架构

image-20230818150122062

4.1 数据库

CREATE TABLE `tb_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(20) DEFAULT NULL,`password` varchar(20) DEFAULT NULL,`sex` char(1) DEFAULT NULL,`money` double(10,2) DEFAULT NULL,`createTime` date DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

实体类 - ORM

需要创建一个包,专门存储实体类,一般命名pojo/entity/model

public class User {// 列名对属性名private int id;private String username;private String password;private String sex;private double money;private Date createTime;// set get 构造 toString
}

4.2 pom依赖

   <!-- 引入servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!-- 引入jsp依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency> <!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version><!-- DbUtils依赖 --><dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.7</version></dependency></dependency>

4.3 登录页面

index.jsp

<body>
<h2>登录</h2>
<form action="/login" method="post">用户名<input type="text" name="username"><br>密码<input type="password" name="password"><br><input type="submit" value="提交"><br>
</form>
</body>

4.4 控制层Servlet

Servlet只负责接收请求数据,做出响应

如果要处理数据,那就调用业务层

package com.qf.servlet;import com.qf.model.Admin;
import com.qf.service.AdminService;
import com.qf.service.AdminServiceImpl;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.io.PrintWriter;
import java.util.List;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 命名* 功能+层* LoginServlet* LoginService* LoginDao*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 防止乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 1 接收请求数据String username = req.getParameter("username");String password = req.getParameter("password");// servlet调用service(业务层)LoginService service = new LoginService( );User user = service.login(username, password);// 做出响应resp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter( );if (user != null) { // 登录成功writer.write("登录成功!");writer.write(user.toString());} else { // 登录失败writer.write("登录失败!用户名或密码错误");}}
}

4.5 业务层service

业务层就处理项目业务逻辑的,业务逻辑包含哪些内容?

  • 除了servlet接收请求做出响应以及jdbc操作数据库的代码,其他全是业务逻辑
    • 加密解密
    • 处理上传下载excel表格
    • 处理项目中数据格式
    • 计算项目中涉及金额
    • 缓存处理
    • 购物车,订单,支付
    • 短信,验证码,定时调度,推送
    • …等等

业务层代码编码

  • 需要创建包结构service

LoginService

public class LoginService {/*** 业务层要定义方法,能接收数据,处理后返回数据* -----* 登录一般返回的是实体类* - 登录成功,返回实体类对象中有数据* - 登录失败,返回实体类对象是null* ----------------------* 业务层需要调用数据层 操作数据库*/public User login(String username, String password){// 处理业务// ...// 处理后,要将数据继续传递给dao层LoginDao loginDao = new LoginDao( );User user = loginDao.login(username, password);return user;}
}

4.6 数据访问层dao

数据访问层 Data Access Object - DAO

项目需要创建dao层代码专门操作数据库

dao层编码

LoginDao

public class LoginDao {public User login(String username,String password) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try{Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java23132?useSSL=false", "root", "123456");ps = conn.prepareStatement("select * from tb_user where username = ? and password = ?");ps.setString(1,username);ps.setString(2,password);rs = ps.executeQuery( );while (rs.next()) {User user = new User( );user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setSex(rs.getString("sex"));user.setMoney(rs.getDouble("money"));user.setCreateTime(rs.getDate("createTime"));return user;}}catch (Exception e){e.printStackTrace();}finally {try {rs.close();ps.close();conn.close();} catch (SQLException e) {e.printStackTrace( );}}return null;}
}

4.7 测试

登录页面

image-20230523162257066

登录成功

image-20231120143529612

登录失败

image-20231120143524446

4.8 总结

重点

  • 熟悉开发的流程
  • 熟记开发架构 (控制层,业务层,数据访问层)
  • 响应拼接页面方式,了解即可
  • 前后端发请求,做响应

经验总结

1 写项目不要照抄,应该按照流程一步一步写
(前端–>servlet–>service–>dao–>service—>servlet–>前端)

2 学会看异常

  • 前端页面报错404,405,500
  • 后端控制台要查看异常(注意几个关键词,Exception,error,caused by ,at …)

3 逻辑bug

  • 前端页面没有报错,后端控制台有没有报错,但是结果不对
  • 这就是bug,该怎么解决?
  • 从头(按照流程)读,检查代码,去输出,高端玩家打断点

4 如果确定前端,后端,数据库都没问题,考虑缓存

  • idea缓存(file-invalidate cache)(删除target文件夹)
  • 浏览器缓存(清空)

5 学会倒推

五、注册功能

(如何写需求?建议当做用户,见到什么写什么,需要什么写什么)

注册 —> 向数据库插入数据

5.1 跳转注册

5.2 注册页面

5.3 发请求,后端Servlet接收

注意接收的中文防止乱码

5.4 UserService

注意: 将之前的LoginService重命名为UserService,因为一个类中可以定义多个方法,不需要创建很多类

5.5 UserDao

注意日期bug,只能是java.sql.Date类型

5.6 UserDao返回给UserService

5.7 UserService在返回给RegistServlet

5.8 Servlet根据结果做响应

六、作业-查询全部

登录成功后查询全部,并展示全部

相关文章:

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…...

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

go 判断两棵树内容是否一致

goroutine http://127.0.0.1:3999/concurrency/8 question 使用 go 判断 两个 树 存放的 序列 是否 相同, 如果 相同 他们 被称为 equivalent_tree tree struct type Tree struct {Left *TreeValue intRight *Tree }由于 递归的 写法 比较简单, 此处 使用循环的 形式 来实…...

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…...

Vue 前置 后置 路由守卫 独享 路由权限控制 自定义属性

import Vue from vue import VueRouter from vue-router //导入路由器 Vue.use(VueRouter)import Login from ../components/Login import User from ../components/User //导入需要路由的组件const router new VueRouter({//暴露出去使用routes:[{path: /login,component: Lo…...

upload-labs关卡11(双写后缀名绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十一关通关思路1、看源代码2、bp抓包双写后缀名绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的…...

go语言学习之旅之Go语言基础语法二

学无止境&#xff0c;今天继续学习go语言的基础语法 变量&#xff08;Variables&#xff09;: 变量声明&#xff1a; var x int变量初始化&#xff1a; var x int 10或者可以使用类型推断&#xff1a; x : 10多变量声明&#xff1a; var a, b, c int同时初始化多个变量&#…...

七天.NET 8操作SQLite入门到实战 - SQLite 简介

什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个小型的C语言库的形式存在。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&#xff0c;在嵌入式设备中&#xff0c;可能只需要几…...

问题 R: 胜利大逃亡(HUST)

#include <deque> #define inf 200000 #include<iostream> #include<queue> using namespace std;// 迷宫坐标 int map[59][59][59] { 0 };// 可访问标记 int visit[51][51][51] { 0 }; // 移动方式 int next1[7][4] { {1,0,0},{-1,0,0}, {0,1,0},{0,-1,…...

项目讲解:让你在IT行业面试中以开发、实施、产品更近一步

1、会议系统项目 项目介绍 提示&#xff1a;可以简单介绍IT技术发展的背景 面试准备 开发 实施 产品 2、医疗项目 项目介绍 提示&#xff1a;可以谈谈你认为IT行业就业方向有哪些&#xff0c;并说出你认为最好的就业领域是什么&#xff1f; 面试准备 开发 实施 产品 3、数字化交…...

Windows 安装 Docker

目录 前言安装 WSL2WSL2 简介系统要求安装步骤 安装 Docker Desktop下载安装验证 安装 Docker Compose结语开源项目 前言 下图展示了在 Windows 系统上安装 Docker&#xff0c;并利用Docker Compose一键搭建 youlai-mall 微服务商城所需的环境。本篇将先介绍 Windows 上如何安…...

AI绘画使用Stable Diffusion(SDXL)绘制三星堆风格的图片

一、前言 三星堆文化是一种古老的中国文化&#xff0c;它以其精湛的青铜铸造技术闻名&#xff0c;出土文物中最著名的包括青铜面具、青铜人像、金杖、玉器等。这些文物具有独特的艺术风格&#xff0c;显示了高度的工艺水平和复杂的社会结构。 青铜面具的巨大眼睛和突出的颧骨&a…...

Window下如何对Redis进行开启与关闭

目录 前言1. 图文界面2. 命令行 前言 由于长期使用Linux界面&#xff0c;对于Window下的Redis&#xff0c;不知如何下手。特此记录该博文 特别注意&#xff0c;刚下载好的Redis&#xff0c;如果需要配置密码&#xff0c;可以再该文件进行配置&#xff1a;redis.windows-servi…...

C++ Qt 学习(十):Qt 其他技巧

1. 带参数启动外部进程 QProcess 用于启动外部进程int QProcess::execute(const QString &program, const QStringList &arguments);QObject *parent; ... QString program "./path/to/Qt/examples/widgets/analogclock"; QStringList arguments; argument…...

跳台阶游戏(Python排列组合函数itertools.combinations的应用)

给定台阶总数和两种单次可跳级数&#xff0c;编写自定义函数&#xff0c;计算所有的游戏组合方案数量。 (笔记模板由python脚本于2023年11月19日 19:18:48创建&#xff0c;本篇笔记适合熟悉python自定义函数编写&#xff0c;了解排列组合知识的coder翻阅) 【学习的细节是欢悦的…...

【Python百宝箱】Python测试工具大揭秘:从单元测试到Web自动化

前言 在现代软件开发中&#xff0c;测试是确保代码质量和稳定性的关键步骤。Python作为一门广泛应用的编程语言&#xff0c;拥有丰富的测试工具和库&#xff0c;从单元测试到Web自动化&#xff0c;覆盖了多个测试层面。本文将介绍一系列Python测试工具&#xff0c;帮助开发者选…...

〖大前端 - 基础入门三大核心之JS篇㊵〗- DOM事件监听及onxxx的使用

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…...

解锁潜力:创建支持Actions接口调用的高级GPTs

如何创建带有Actions接口调用的GPTs 在本篇博客中&#xff0c;我们将介绍如何创建一个带有Actions接口调用的GPTs &#xff0c;以及如何进行配置和使用。我们将以 https://chat.openai.com/g/g-GMrQhe7ka-gptssearch 为例&#xff0c;演示整个过程。 Ps: 数据来源&#xff1a…...

【发明专利】天洑软件再度收获六项国家发明专利授权

近日&#xff0c;南京天洑软件有限公司再度收获行业内六项国家发明专利授权&#xff0c;专利名称为&#xff1a;一种发电机绕组温度预警方法及装置&#xff08;专利号&#xff1a;ZL 2022 1 1525605.3&#xff09;&#xff0c;一种CSTR系统的控制方法及装置&#xff08;专利号&…...

Netty源码学习4——服务端是处理新连接的netty的reactor模式

零丶引入 在前面的源码学习中&#xff0c;梳理了服务端的启动&#xff0c;以及NioEventLoop事件循环的工作流程&#xff0c;并了解了Netty处理网络io重要的Channel &#xff0c;ChannelHandler&#xff0c;ChannelPipeline。 这一篇将学习服务端是如何构建新的连接。 一丶网络包…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...