# javaweb **Repository Path**: hrbu2024/javaweb ## Basic Information - **Project Name**: javaweb - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-13 - **Last Updated**: 2026-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 环境安装 基于Http协议 ```java package com.neuedu; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8080); Socket accept = server.accept(); InputStreamReader reader = new InputStreamReader(accept.getInputStream()); OutputStreamWriter writer = new OutputStreamWriter(accept.getOutputStream()); new Thread(() -> { try { writer.write("hello ...."); } catch (IOException e) { throw new RuntimeException(e); } }).start(); while (true){ char c = (char)reader.read(); System.out.print(c); } } } ``` ![image-20261012164835405](assets/image-20261012164835405.png) ## 安装中间件 - Tomcat - Jetty - Weblogic ### 下载 [Apache Tomcat® - Apache Tomcat 10 Software Downloads](https://tomcat.apache.org/download-10.cgi) ![image-20261012164956944](assets/image-20261012164956944.png) ![image-20261012165235559](assets/image-20261012165235559.png) ### 安装 解压缩 ( 需要安装JDK 并且配置 JAVA_HOME) ![image-20261012165325428](assets/image-20261012165325428.png) ![image-20261012165403770](assets/image-20261012165403770.png) 执行bin目录中的 startup.bat ![image-20261012165509841](assets/image-20261012165509841.png) 测试网站是否可用 http://localhost:8080 http 的默认端口号就是80 https: 443 https : http+ssl : 非对称 : RAS 颁发秘钥: - 公钥加密 - 私钥解密 ![image-20261012165552803](assets/image-20261012165552803.png) ### 在IDEA中集成Tomcat ![image-20261012165633738](assets/image-20261012165633738.png) ![image-20261012165718932](assets/image-20261012165718932.png) 选择Tomcat Server ![image-20261012165733974](assets/image-20261012165733974.png) ![image-20261012165800434](assets/image-20261012165800434.png) ```init 2026/10/12 16:53 . 2026/10/12 16:53 .. 2026/10/12 16:53 bin 运行脚本启动、停止等 2026/09/09 22:36 27,577 BUILDING.txt 2026/10/12 16:54 conf 配置文件 2026/09/09 22:36 8,851 CONTRIBUTING.md 2026/10/12 16:53 lib 支撑程序运行的 jar 2026/09/09 22:36 61,536 LICENSE Apache 2.0 2026/10/13 08:37 logs 日志文件 2026/09/09 22:36 2,401 NOTICE 2026/09/09 22:36 3,308 README.md 2026/09/09 22:36 6,949 RELEASE-NOTES 2026/09/09 22:36 16,582 RUNNING.txt 2026/10/12 16:53 temp 临时文件 2026/10/12 16:53 webapps 应用程序 发布的目录 2026/10/12 16:54 work jsp翻译的java 以及编译后的class 7 个文件 127,204 字节 ``` ## 自定义项目 放在webapps ![image-20261013090816899](assets/image-20261013090816899.png) # 创建第一个项目 创建一个大项目(聚合项目) - javaweb(不需要写代码 删除src) -- quickstart - app1-web: webapp骨架 - app2 - 。。。。 ## 创建聚合项目 qiuickstart骨架的项目,删除src ![image-20261013091254241](assets/image-20261013091254241.png) ## 创建第一个子项目web项目 ![image-20261013091412496](assets/image-20261013091412496.png) ![image-20261013091500160](assets/image-20261013091500160.png) ## 编写代码发布到Tomcat 在01-app-helloword里面 编写一个html 用于发布到Tomcat中查看发布演示 在webapp的目录中创建一个index.html ```html Title

第一个使用 idea 发布到 Tomcat的 项目

``` 右上角选择 Edit Configurations ![image-20261013093425284](assets/image-20261013093425284.png) ![image-20261013093457500](assets/image-20261013093457500.png) ![image-20261013093607119](assets/image-20261013093607119.png) 选择 Deployment ![image-20261013093627297](assets/image-20261013093627297.png) ![image-20261013093643952](assets/image-20261013093643952.png) ![image-20261013093705488](assets/image-20261013093705488.png) 修改上下文(发布到Tomcat里面的名称) ![image-20261013093814818](assets/image-20261013093814818.png) 默认会打开浏览器 [Title](http://localhost:8080/web/) ![image-20261013093953242](assets/image-20261013093953242.png) - JavaME: 应用于手机端的 - JavaSE :标准的 JDK的东西, java.lang java.util - JavaEE: 企业级java应用 EJB javaweb JMS - javax.sevlet.HttpServlet - javax.servlet.HttpServletRequest - javax.servlet.HttpServletResponse - JakartaEE: 捐献给Eclipse基金会 (IBM 牵头的) Tomcat 10+ 包括 Tomcat11 - Jakarta.sevlet.HttpServlet - Jakarta.servlet.HttpServletRequest - Jakarta.servlet.HttpServletResponse # JavaWeb ## [01.Web应用基础](https://www.yuque.com/donghua-nhdx0/abx4x1/dqqqo4o1s2zlzwf7) BS架构 ### 1.3.HTTP协议 HTTP协议:(HyperText Transfer Protocol)超文本传输协议。 http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。 也就是说:HTTP协议规范客户端和服务端之间进行请求和响应的格式: 1. HTTP请求信息组成: - - 请求行: - - - 请求方式:POST、GET - 请求的资源:/DemoEE/form.html - 协议版本:HTTP/1.1(一般都是) - - 请求头:请求头是客户端发送给服务器端的一些信息,使用键值对表示key:value - 请求体: - - - 请求方式是post的时,请求体有请求的参数,格式如下:name=zhangsan&password=123 - 如果请求方式为get,那么请求参数不会出现在请求体中,会拼接在url地址后面 1. HTTP响应信息组成: - - 响应行:http状态码 - 响应头:响应也都是键值对形式,服务器端将信息以键值对的形式返回给客户端。 - 响应体:响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染,显示页面内容 ### 1.4.URL简介 http://localhost:8080/web/index.html URL:Uniform Resource Locator 即统一资源定位符:用于完整地描述Internet上网页和其他资源的地址的一种标识方法。就是我们通常所说的网址。 URL是惟一能够识别Internet上具体的计算机、目录或文件位置的命名约定。 ![img](assets/1604978372077-b9f7e76f-09ca-40be-b6f2-782814630414.png) ### 1.5.Web服务器简介 Web 服务器通过 HTTP 协议与客户端通信,学习Web开发,需要安装一台web服务器,然后再在Web服务器中部署相应的web资源,供用户使用浏览器访问。常用Web服务器有: 1. IIS Windows产品自带的一种免费的Web服务器,安装配置简单,主要解析的是ASP程序代码。 2. Apache 世界排名第一、免费开源的Web服务器软件,它以跨平台、高效和稳定而闻名,是最流行的Web服务器端软件之一。 3. Tomcat(后续学习采用此服务器) Apache-Jarkarta开源项目中的一个子项目,是一个小型、轻量级的支持JSP和Servlet 技术的Web应用服务器。 4. Nginx Nginx 服务器是一个高性能的 Web 和反向代理服务器。Nginx 在激烈的 Web 服务器竞争中依旧保持良好的发展势头,一度成为 Web 服务器市场的后起之秀。 5. WebSphere,IBM公司的产品(商业化的专业服务器)。 6. WebLogic ,BEA公司的产品(商业化的专业服务器)。 ## 第一个Servlet程序 - 添加Servlet依赖 (父项目中的 pom.xml) ```xml jakarta.servlet jakarta.servlet-api 6.1.0 provided ``` - 编写一个Java类 实现HttpServlet: com.neuedu.servlet.HelloServlet extend HttpServlet - doGet、doPost方法 - 接收请求,存储、响应结果 在01-app-helloword/src/main中创建了一个 Java的原目录 ![image-20261013104753741](assets/image-20261013104753741.png) 新建了一个包 ![image-20261013104824308](assets/image-20261013104824308.png) ![image-20261013104840160](assets/image-20261013104840160.png) ```java package com.neuedu.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloServlet extends HttpServlet { /**** * request * @param request 封装的所有请求的信息 * @param response 响应对象, 通过它 输出 html 下载文件,等 * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //浏览器的请求信息 StringBuffer requestURL = request.getRequestURL(); String method = request.getMethod() ;// get post System.out.println("requestURL = " + requestURL); System.out.println("method = " + method); //响应给浏览器一段 html response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.write("

第一个Servlet 程序

"); // 普通文本 还是 html json js out.flush(); out.close(); //关闭资源 } } ``` - 配置Servlet到web.xml(部署描述符) - servlet -calss com.neuedu.servlet.HelloServlet - url-mapping 地址中使用的路径 - /hello: http://localhost:8080/web//hello 可以看到结果 ![image-20261013105354779](assets/image-20261013105354779.png) 在web.xml中配置Servlet 映射 ( Servlet2.5+以上可以使用注解 替代 xml) ```xml HelloServlet com.neuedu.servlet.HelloServlet HelloServlet /hello ``` 测试 - 启动tomcat 访问资源 http://localhost:8080/web/hello ![image-20261013105802844](assets/image-20261013105802844.png) ### 使用@WebServlet注解 替代xml http://localhost:8080/web/second ```java package com.neuedu.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; //直接 以 @ //@WebServlet(urlPatterns = {"/second" ,"/other"}) @WebServlet(urlPatterns = "/second") public class SecondServlet extends HttpServlet { /**** * request * @param request 封装的所有请求的信息 * @param response 响应对象, 通过它 输出 html 下载文件,等 * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //浏览器的请求信息 StringBuffer requestURL = request.getRequestURL(); String method = request.getMethod() ;// get post System.out.println("requestURL = " + requestURL); System.out.println("method = " + method); //响应给浏览器一段 html response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.write("

第一个Servlet 程序

"); // 普通文本 还是 html json js out.flush(); out.close(); //关闭资源 } } ``` ## Servlet生命周期 http Method 有 7种, 浏览器 实现了2种(get :地址栏直接请求,超链接 post: form method='post' ) - get - post - header - put - delete - push - options - 构造器 - init - server(父类) - doGet - doPost - destory ### 解决中文乱码的问题 在Tomcat的虚拟机参数中添加 `-Dstdout.encoding=UTF-8` ![image-20261013114947449](assets/image-20261013114947449.png) ## HTTP状态码 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的。所有状态码的第一个数字代表了响应的五种状态之一。 1xx:消息。这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。 2xx:成功。代表请求已成功被服务器接收、理解、并接受。比如: - 200:请求已成功。出现此状态码是表示正常状态。 3xx:重定向。代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。 4xx:请求错误。代表客户端请求发生错误。比如: - **404:**找不到请求的资源 查看地址是否正确 ![image-20261013134111908](assets/image-20261013134111908.png) - **405:服务器端处理请求方法不被允许。** - http:// ```java package com.neuedu.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/not_allow") public class NowAllowServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //响应给浏览器一段 html response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.write("

第222222个Servlet 程序

"); // 普通文本 还是 html json js out.flush(); out.close(); //关闭资源 } } ``` ![image-20261013134030468](assets/image-20261013134030468.png) 5xx:服务器错误。代表服务器端出现错误。 比如: - 500:服务器端代码错误。 - 503:服务器异常(通常重启服务器即可解决)。 ![image-20261013134733276](assets/image-20261013134733276.png) ![image-20261013134911228](assets/image-20261013134911228.png) ## 内存对象转换成JSON - FastJSON - FastJon2 - Jackon - Geson 使用Fastjson2 [FASTJSON 2.0介绍 | fastjson2](https://alibaba.github.io/fastjson2/) ```xml com.alibaba.fastjson2 fastjson2 2.0.65 ``` ``` String text = JSON.toJSONString(data); ``` ```java package com.neuedu.servlet; import com.alibaba.fastjson2.JSON; import com.neuedu.entity.Emp; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; import java.util.List; @WebServlet("/emp") public class EmpServlet extends HttpServlet { /*** * http://localhost:8080/web/emp * http://127.0.0.1:8080/web/emp * http://192.168.84.47:8080/web/emp * @param req * @param response * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { //1 模拟从数据库查询 List list = new ArrayList(); for (int i = 0; i < 10; i++) { Emp emp = new Emp( 8001+i, "ename"+i, "程序员"+i, 7566, new Date(), 9999.0, 6666.0, 10); list.add(emp); } //2 将内存对象转换成json String json = JSON.toJSONString(list); // System.out.println(json); //响应给浏览器一段 html response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); out.write(json); out.flush(); out.close(); //关闭资源\ } } ``` # Apifox [Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。](https://apifox.com/) ## 下载和安装 https://apifox.com ![image-20261013142212588](assets/image-20261013142212588.png) ![image-20261013142235503](assets/image-20261013142235503.png) ## 启动之后登录 ![image-20261013142346615](assets/image-20261013142346615.png) ![image-20261013142416007](assets/image-20261013142416007.png) 邀请大家加入我的项目 金山 在 Apifox 邀请你加入项目 JavaWeb https://app.apifox.com/invite/project?token=gtirXB8MUUqlEpEss4IKf # Ajax [AJAX 教程 | 菜鸟教程](https://www.runoob.com/ajax/ajax-tutorial.html) ## 原生ajax ```java // 同步查询 // function requestServlet(){ // // //请求网络 // let xhr = new XMLHttpRequest(); // // const url = "http://localhost:8080/web/emp" // xhr.open("GET", url, false); // // //发送请求 // xhr.send() // // //拿到结果 // // console.log("xhr.responseText ",xhr.responseText) // // console.log(typeof(xhr.responseText)) // console.log(typeof(JSON.parse(xhr.responseText))) // // return JSON.parse(xhr.responseText) // } /** * js 是单线程的, * @returns {any} */ function requestServlet(callback){ //请求网络 let xhr = new XMLHttpRequest(); const url = "http://localhost:8080/web/emp" xhr.open("GET", url, true); xhr.onreadystatechange = () => { //http协议的请求状态 xhr.status 200 (失败 404 403 500 503) console.log("xhr.status: "+xhr.status+" \t xhr.readyState: "+ xhr.readyState ) if( xhr.status == 200 // 200 表示成功 && xhr.readyState == 4 // 4: 请求已完成,且响应已就绪 ){ callback(JSON.parse(xhr.responseText)) } } //发送请求 xhr.send() } ``` ## 使用Axios 安装 ``` ``` emp_list.html ```html 员工表格 、
empno ename job mgr hiredate sal comm deptno
{{emp.empno}} {{emp.ename}} {{emp.job}} {{emp.mgr}} {{emp.hiredate}} {{emp.sal}} {{emp.comm}} {{emp.deptno}}
``` useAxios.js ```js /** * 使用 axios * @returns {any} */ function requestServlet(callback){ const url = "http://localhost:8080/web/emp" axios.get(url).then( (response)=>{ if(response.status == 200){ callback(response.data) } }) } ``` 对于浏览器来说虽然localhost是一致的,但是端口号不同,认为是两个服务器 涉及跨域的问题 ![image-20261014113251918](assets/image-20261014113251918.png) - A : 第一个请求的是A - B:在A的网页上请求的B。 - 当A访问的时候 告诉浏览器,我的数据可以给A用,允许跨域访问 - ## 在Javaweb中解决跨域 ```java package com.neuedu.servlet; import com.alibaba.fastjson2.JSON; import com.neuedu.entity.Emp; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Date; import java.util.List; @WebServlet("/emp") public class EmpServlet extends HttpServlet { /*** * http://localhost:8080/web/emp * http://127.0.0.1:8080/web/emp * http://192.168.84.47:8080/web/emp * @param req * @param response * @throws ServletException * @throws IOException */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { //1 模拟从数据库查询 List list = new ArrayList(); for (int i = 0; i < 10; i++) { Emp emp = new Emp( 8001+i, "ename"+i, "程序员"+i, 7566, new Date(), 9999.0, 6666.0, 10); list.add(emp); } //2 将内存对象转换成json String json = JSON.toJSONString(list); // System.out.println(json); // try { // Thread.sleep(3000); // //模拟查询比较慢,或者网络比较慢 // } catch (InterruptedException e) { // throw new RuntimeException(e); // } //响应给浏览器一段 html response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); //允许跨域 // response.setHeader("Access-Control-Allow-Origin" ,"http://localhost:63342/"); response.setHeader("Access-Control-Allow-Origin", "*"); PrintWriter out = response.getWriter(); out.write(json); out.flush(); out.close(); //关闭资源\ } } ``` # 会话跟踪 - Cookie - Session 02-app-session 创建项目 替换01发布 ![image-20261014140109409](assets/image-20261014140109409.png) ![image-20261014140349530](assets/image-20261014140349530.png) ![image-20261014141904180](assets/image-20261014141904180.png) http://localhost:8080/web/login.jsp ![image-20261014141926206](assets/image-20261014141926206.png) # 登录 - 保持会话 - 过滤器 ![image-20261014161909696](assets/image-20261014161909696.png) - 过滤器 : LoginFilter - login.jsp - LoginServlet - 资源: index.jsp ## 实现 ## 创建项目 ![image-20261014162105860](assets/image-20261014162105860.png) ## 修改pom 创建完的项目 把项目中的pom.xml 的依赖给删掉了 ```xml 4.0.0 com.neuedu.web javaweb 1.0 03-app-mis war ``` ## 发布项目tomcat - 删除02 - 发布03 ![image-20261014162404688](assets/image-20261014162404688.png) ![image-20261014162414279](assets/image-20261014162414279.png) ![image-20261014162611073](assets/image-20261014162611073.png) ## 创建过滤器LoginFilter ```java package com.neuedu.mis.filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("拦截器,用于判断用户是否登录"); //判断用户是否登录 //模拟 未登录 boolean pass = false; //放行 if(pass) { chain.doFilter(request,response); }else{ request.getRequestDispatcher("/login.jsp").forward(request,response); } } } ``` ## 添加忽略地址 ```java package com.neuedu.mis.filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; @WebFilter("/*") public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(); Object isLogin = session.getAttribute("isLogin"); System.out.println("拦截器,用于判断用户是否登录"); //判断用户是否登录 boolean ignore = isIgnore(request); //放行 if(isLogin!=null || ignore) { chain.doFilter(request,response); }else{ //内部跳转 // request.getRequestDispatcher("/login.jsp").forward(request,response); response.sendRedirect("login.jsp"); } } // /mis/login.jsp private boolean isIgnore(HttpServletRequest request) { String requestURI = request.getRequestURI(); if (requestURI != null) { requestURI = requestURI.substring( requestURI.lastIndexOf("/") ); } System.out.println("requestURI = " + requestURI); if( "/login.jsp".equals(requestURI) || "/loginValidate".equals(requestURI)){ return true; } return false; } } ``` ## login.jsp ```jsp <%-- Created by IntelliJ IDEA. User: Administrator Date: 2026/10/14 Time: 16:34 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> Title
用户名:
密码:
``` ## 验证用户名 ```java package com.neuedu.mis.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/loginValidate") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if( "admin".equals(username) && "123456".equals(password) ){ HttpSession session = request.getSession(); session.setAttribute("isLogin",true); }else{ response.sendRedirect("login.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } } ```