javaEE(1)

news2024/12/27 10:08:32

一. Web开发概述

Web开发:指的是从网页中向后端程序发送请求,与后端程序进行交互

Web服务器:是一种软件,向浏览器等Web客户端提供文档等数据,实现数据共享,它是一个容器,是一个连接用户和程序之间的中间键

二. Web开发环境搭建

我们要实现前后端交互,首先需要中间键Web服务器,所以我们去官网下载tomcat,但是在下载tomcat前要先检查电脑上有没有安装JDK,并且是否已经配置环境变量JAVA_HOME

1.安装JDK

https://blog.csdn.net/qq_64782704/article/details/139693766?spm=1001.2014.3001.5501

参考之前写过的一篇博客

2. 配置JAVA_HOME

打开设置(右键我的电脑属性),找到高级系统设置,然后跟着步骤走

 

 

 这样就配置好了JAVA_HOME,配置的目的是为了方便下面要配置的Web服务器更好的在你的电脑上找到jdk的位置

3. 安装tomcat

在apache官网下载tomcat最好下载到一个没有中文的路径上,tomcat就是我们上面说到的前后端交互的中间键,Web服务器

https://tomcat.apache.org/

安装好后,进入到bin目录中双击startup.bat文件,如果能成功运行表示安装成功

 

 注意:这是一些日志信息

三. tomcat文件介绍

四.  解决tomcat端口冲突问题

有时候我们在启动tomcat服务器时,有可能会出现和其他应用程序的端口相同,导致tomcat启动失败,这时候我们可以通过上面介绍的文件结构,打开conf,tomcat的服务器配置文件,再打开里面的server.xml修改默认打开的端口号即可

五.  在IDEA中创建javaWeb程序

 

这样一个javaWeb项目就创建完成了,接下来创建第一个javaWeb程序,随便写一个类,继承HttpServlet类,这个类就是Servlet类,也就是程序,但是还不能够运行,因为我们还没有配置tmocat和Sevlet程序的地址

六. 配置servlet程序

配置servlet程序的目的:把我们开发的servlet程序注册到服务器,由服务器启动时加载,在第一次访问时(第一个人访问到网页时),创建唯一的一个对象

打开web.xml文件

web.xml文件的作用:该文件主要是用来存储web后端项目的配置信息,在服务器启动时,由服务器加载读取的

 照着敲即可 

七. 在IDEA中配置tomcat

如果打开有默认的tomcat点击-号删掉,因为它默认不是本地的

 

 配置完成后点击运行,如果有日志信息就可以去浏览器测试

 

在Webapp文件夹下创建一个HTML文件,在<body>标签写上一句话用于测试

 打开浏览器输入

127.0.0.1:端口号(默认8080,修改过就是你修改的)/(项目名)/(刚才的html文件名)

比如我这里是:127.0.0.1:8088/demo/index.html

如下网页上会显示,刚才<body>中的内容,就表示配置成功 

八. servlet程序中的四个方法

如果我们用一个类继承了HttpServlet这个类,虽然我们的类被称为Servlet程序,但是里面没有任何方法,我们如何实现和前端进行交互呢,所以我们接下来要看四个方法

1. 无参构造方法

public class TestServlet extends HttpServlet {

    public TestServlet() {
        System.out.println("只执行一次的无参构造");
    }
}

在第一次有人访问到我们这个网页时,服务器会创建唯一的一个servlet对象,并调用唯一一次无参构造方法初始化对象

2. init方法

public class TestServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init:"+config.getInitParameter("count"));
    }
}

该方法在构造函数执行完后立即被执行,用来对servlet程序中的一些参数进行初始化,这些参数往往在web.xml文件中定义,同样只执行一次

 

3. service方法

public class TestServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service");
    }

}

这个方法主要用来对前端的请求作出处理并响应回前端,也就是说我们与前端交互的代码写在这个方法中,该方法有两个参数,req用来接收前端发来的请求,resq用来给前端作出响应

4. destroy方法


public class TestServlet extends HttpServlet {

    @Override
    public void destroy() {
        System.out.println("destroy");
    }

}

 该方法是在关闭tomcat等Web服务器时被执行,可以用来做一些在关闭服务器之前想要执行的事件

 

看到上述截图,我访问了两次网页,只有第一次访问时执行了无参构造和init,因为从始至终只创建了一个对象,所以与初始化有关的方法只会被执行一次,第二次只执行了service方法,与前端进行交互,这也就是说无参构造和init只有在第一次访问页面时会被执行,用来初始化唯一的一个servlet对象,当我关闭服务器,destroy方法才会被执行

九. http请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求,也叫超文本传输协议,也就是说我们前端向后端发送的请求都是http请求,所以我们有必要了解一下http请求

1.http请求的组成部分

一个完整的http请求包括:请求行,请求头,请求体

请求行:包括http的请求方式,请求资源名称,http版本

请求头:包含客户端的一些信息,这些信息都是由浏览器自动发送的, 以键值形式传递

请求体:当前端通过post请求提交表单中的数据时,请求体中会包含表单中的数据

 

 2. http请求的两种方式

 http请求分为:GET方式POST方式,两种方式各有各的用处

2.1 get请求

get请求:主要是从后端获取信息的,例如网页上的超链接,向后端传递少量信息,获取大量信息,请求数据在请求地址中直接拼接,所以传输数据数量有限,并且敏感数据不安全

可以看到get请求将我在表单中的数据直接拼在了地址栏中,这就是敏感数据不安全,并且地址栏的长度有限所以传输数据的数量有限

2.2 post请求

post请求:post请求主要用于向后端发送大量数据,请求数据在请求体中,可以传输大量数据,不会在地址中显示, 所以相对安全

 可以看到post请求并没有将表单中的数据拼接到地址栏中,而是保存到了请求体中,这样数据既安全又能存储大量数据

十. 后端接收外部发来的请求

public class TestServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        System.out.println(account);
        System.out.println(password);
    }

}

可以看到我们用HttpServletRequest req对象中的getParameter方法来接收前端发来的请求,account和password是前端表单中定义的name属性,一般前端人员会告诉你

1. 用post请求接收不含中文的数据

可以看到我们可以成功的收到该消息

2. 用post请求接收含中文的消息

可以看到这里发生了中文乱码的情况,这是因为tomcat自带编码是ISO-8859-1格式和我们解码所用的编码表(utf-8)不同,所以我们在用post请求解码时加上一行设置解码的编码的代码,必须加在第一行最开始的时候

request.setCharacterEncoding("utf-8");

这句代码改变了tomcat服务器在接收前端请求时所采用的编码格式

 这样就成功接收到了含中文的消息

3. get请求接收不含中文的请求

可以看到能成功接收

4. get请求接收含中文的请求

可以看到get请求接收中文时不会出现乱码的情况,所以这意味着当后端处理请求时对于get和post这两种请求,要采取不同的方式进行处理 

十一. 再谈servlet中的四个方法

上面谈到对于post请求和get请求我们应该采取不同的处理方式,并且我们上面说到了,servlet有四个方法是一定会执行的(我们不写会调用父类的),所以也就意味着这四个方法其实不是必须写的.

1.默认的无参构造我们不写,编译器也会自动生成,给对象赋默认值

2.init方法当我们不需要对servlet程序中的参数初始化时也可以不写(但编译器还是会调用父类的,只不过父类中的方法,什么都没写)

3.destroy方法,如果在关闭服务器之前没有要做的事,也可以不写,同样也会调用父类的(父类中什么都没写)

4.最后service方法,由于http分为get请求和post请求,这两种情况要用不同的方式来处理,所以我们也不写service方法了,而是重写两个方法doGet()和doPost()方法

public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}

doGet方法用来处理get请求,doPost方法用来处理post请求

十二. 后端接收请求头和请求行中的数据

getMethod()获得请求方式
getProtocol()获得请求协议
getServerName()获得服务名/可以是ip,也可以是域名
getServerPort()获得服务器端口
getRemoteAddr()获得客户端ip
getRemotePort()获得客户端端口

 以上是常用的接收请求行中的数据

getHeader("User-Agent")获得客户机信息

接收请求头中的数据,只有一个方法getHeader方法,由于请求头中的数据都是以键值对存储的,所以我们只要给getHeader()方法中传入对应的键,就能获得我们想要的值,都有哪些键,我们可以在浏览器按f12开发者模式查看

十三. 后端对请求作出响应

/*
      处理post请求
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置解码的编码格式
        req.setCharacterEncoding("utf-8");
        //接收我们自己向后端发送的数据
        String account = req.getParameter("account");
        String password = req.getParameter("password");

        //调用jdbc与数据库交互


        //做出响应
        //设置响应内容编码格式
        //resp.setHeader("content-type", "text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获得打印输出字符流
        PrintWriter printWriter =  resp.getWriter();
        printWriter.write("<h2>登录成功</h2>");

    }

注意:当请求的类型是post请求时,我们需要在作出响应前设置输出的内容的解码方式,否则会导致中文乱码问题,这是因为tomcat服务器默认解码是按ISO8859-1编码表,但我们IDEA默认是utf-8,所以会乱码,get请求响应时不需要设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pinia安装及简介

pinia简介 基本特点 轻量级&#xff1a;Pinia相比于传统的Vuex&#xff0c;体积更小&#xff0c;性能更好&#xff0c;只有大约1KB左右。 简化API&#xff1a;Pinia简化了状态管理库的使用方法&#xff0c;抛弃了Vuex中的mutations&#xff0c;只保留了state、getters和actions…

论文阅读:(DETR)End-to-End Object Detection with Transformers

论文阅读&#xff1a;&#xff08;DETR&#xff09;End-to-End Object Detection with Transformers 参考解读&#xff1a; 论文翻译&#xff1a;End-to-End Object Detection with Transformers&#xff08;DETR&#xff09;[已完结] - 怪盗kid的文章 - 知乎 指示函数&…

传输层(port)UDP/TCP——解决怎么发,发多少,出错了怎么办

**传输层&#xff1a;**负责数据能够从发送端传输接收端. 传输层所封装的报头里一定有&#xff1a;源端口号和目的端口号的。 **端口号&#xff1a;**可以标识一台主机中的唯一一个进程&#xff08;运用程序&#xff09;&#xff0c;这样当数据传输到传输层的时候就可以通过端…

电商项目之如何判断线程池是否执行完所有任务

文章目录 1 问题背景2 前言3 4种常用的方法4 代码4.1 isTerminated()4.2 线程池的任务总数是否等于已执行的任务数4.3 CountDownLatch计数器4.4 CyclicBarrier计数器 1 问题背景 真实生产环境的电商项目&#xff0c;常使用线程池应用于执行大批量操作达到高性能的效果。应用场景…

当全球银行系统“崩溃”时会发生什么?

有句名言&#xff1a;“当美国打喷嚏时&#xff0c;世界就会感冒……”换句话说&#xff0c;当人们对美国及其经济稳定性的信心下降时&#xff0c;其他经济体&#xff08;以及黄金、白银和股票等资产&#xff09;的价值往往会下降。 与任何其他资产类别一样&#xff0c;加密货…

Java并发编程深入浅出(个人造诣)

目录 串行&#xff0c;并行与并发&#xff1a; 并发编程的目的 如何保证多线程的安全&#xff08;并发编程思想&#xff09; 写后读思想&#xff1a;&#xff08;一个线程写后再让另一个线程读&#xff09; 如何保障写后读&#xff1f; 1、加锁&#xff1a;&#xff08;s…

Cocos Creator2D游戏开发(3)-飞机大战(1)-背景动起来

资源见: https://pan.baidu.com/s/1cryYNdBOry5A4YEEcLwhDQ?pwdzual 步骤 1, 让背景动起来 2, 玩家飞机显现,能操控,能发射子弹 3.敌机出现 4. 碰撞效果(子弹和敌机,敌机和玩家) 5. 积分和游戏结束 6. 游戏存档,对接微信小游戏,保存历史最高分 7. cocos发布到微信小游戏 资源…

【计算机网络】IP地址和子网掩码(IP地址篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️计算机网络】 文章目录 前言IP地址网络地址网络地址的定义与组成作用分类网络地址的分配与管理 广播地址&#xff08;Broadcast Address&#xff09;定义构成类型作用注意事项 广播地址功能 组播地址…

【初阶数据结构篇】栈的实现(赋源码)

文章目录 栈1 代码位置2 概念与结构1.1概念1.2结构 2 栈的实现2.1 栈的初始化和销毁2.1.1 初始化2.1.2 销毁 2.2 栈顶插入和删除数据2.2.1 栈顶插入数据&#xff08;压栈&#xff09;2.2.2 栈顶删除数据&#xff08;出栈&#xff09; 2.3 返回栈顶数据2.4 返回栈的有效数据个数…

Jenkins持续部署

开发环境任务的代码只要有更新&#xff0c;Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee&#xff0c;点击添加账户&#xff0c;并将自己的账户添…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p …

【QGroundControl二次开发】六. QGC地面站中视频流配置gstreamer

本文解决qgc源码编译后无法接收视频推流&#xff0c;原因是缺少gstreamer。 下面为windows安装流程&#xff0c;qgc版本为4.4.1稳定版 1. 安装gstreamer 官网链接&#xff1a;https://gstreamer.freedesktop.org/download/#windows 两个都要下载。安装的时候&#xff0c;在cu…

网络安全自学从入门到精通的制胜攻略!!!

在信息时代&#xff0c;网络安全已成为至关重要的领域。越来越多的人希望通过自学掌握这门技术&#xff0c;开启充满挑战与机遇的职业道路。以下是一份精心为您打造的网络安全自学攻略&#xff0c;助您在自学之旅中乘风破浪。 一、明确目标与兴趣方向 网络安全涵盖众多领域&am…

Java的四种引用类型

Java的四种引用类型 1. 强引用&#xff08;Strong Reference&#xff09;2. 软引用&#xff08;Soft Reference&#xff09;3. 弱引用&#xff08;Weak Reference&#xff09;4. 虚引用&#xff08;Phantom Reference&#xff09; &#x1f496;The Begin&#x1f496;点点关注…

硬件工程师笔面试真题汇总

目录 1、电阻 1&#xff09;上拉电阻的作用 2&#xff09;PTC热敏电阻作为电源电路保险丝的工作原理 2、电容 1&#xff09;电容的特性 2) 电容的特性曲线 3) 1uf的电容通常来滤除什么频率的信号 3、电感 4、二极管 1&#xff09;二极管特性 2&#xff09;二极管伏安…

MySQL练手 --- 1633. 各赛事的用户注册率

题目链接&#xff1a;1633. 各赛事的用户注册率 思路&#xff1a; 两张表&#xff0c;一张为Users用户表&#xff0c;该表存储着所有用户的 user_id 和 user_name 另一张表为Register注册表&#xff0c;该表存储着赛事id&#xff08;contest_id&#xff09;&#xff0c;和已…

NumpyPandas:Pandas库(25%-50%)

目录 前言 一、列操作 1.修改变量列 2.筛选变量列 3.删除变量列 4.添加变量列 二、数据类型的转换 1.查看数据类型 2.将 ok的int类型转换成float类型 3.将ar的float类型转换成int类型 三、建立索引 1.建立DataFrame时建立索引 2.在读入数据时建立索引 3.指定某列或…

PHP8.3.9安装记录,Phpmyadmin访问提示缺少mysqli

ubuntu 22.0.4 腾讯云主机 下载好依赖 sudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config libbz2-dev libreadline-dev libicu-dev libsqlite3-dev libwebp-dev 下载php8.3.9安装包 nullhttps://www.php.net/d…

【Linux】生产者消费者模型 + 线程池的介绍和代码实现

前言 上节我们学习了线程的同步与互斥&#xff0c;学习了互斥锁和条件变量的使用。本章我们将学习编程的一个重要模型&#xff0c;生产者消费者模型&#xff0c;并且运用之前学的线程同步和互斥的相关接口来实现阻塞队列和环形队列&#xff0c;最后再来实现一个简易的线程池。 …

springboot电子产品销售系统-计算机毕业设计源码80294

摘 要 电子商务行业在全球范围内迅速发展&#xff0c;随之而来的是电子产品销售市场的快速增长和消费者对在线购物体验的需求提升&#xff0c;因此&#xff0c;电子产品销售系统应运而生。该系统旨在满足电子产品市场的需求&#xff0c;提供全面的购物功能和高效的管理操作。 …