tomcat与servlet

目录

一、Http服务器

二、tomcat

1、概念

2、tomcat解压缩文件

(1)bin文件夹

(2)conf文件夹

(3)logs

(4)webapps

3、借助tomcat服务器访问网页

三、servlet

1、概念

2、servlet实现在浏览器上显示hello

(1)创建Maven项目

(2)引入依赖

(3)创建目录

(4)编写代码

(5)打包程序

(6)部署程序

(7)验证程序

四、IDEA集成tomcat

1、过程

(1)安装small tomcat插件

(2)修改代码并点击右上角Edit Cong...

(3)部署

(5)浏览器访问

2、解决浏览器中文乱码问题

五、编写servlet代码过程中遇到的问题

1、出现404--未找到

2、出现405--方法不允许

3、500--内部服务器错误

4、出现空白页面

5、无法访问此网站

六、Servlet API详细情况

1、HttpServlet类

2、HttpServletRequest类

(1)HttpServletRequest类中的方法

(2)针对请求的不同请求类型获取请求中的参数(query string)

3、HttpServletResponse类


一、Http服务器

服务器负责处理客户端发来的请求,作出相应的响应。可以基于tcp socket实现一个http服务器,但实际上已经有现成的http服务器供我们使用--tomcat。

二、tomcat

1、概念

是一个基于java语言实现的http服务器,解压缩就可以使用。有以下文件:

2、tomcat解压缩文件
(1)bin文件夹

里面放的是tomcat的可执行脚本。

.bat是windows批处理程序,.sh是Linux的shell脚本。双击startup.bat就能启动tomcat(控制台程序)。需注意:tomcat需搭配jdk使用,且当启动一个tomcat后不能启动第二个,端口被占用了。

出现乱码是因为tomcat默认字符集为utf8,windows cmd字符集为gbk。可以将tomcat转为gbk,也可以将gbk转为utf8,但windows cmd改变字符集较为麻烦,而utf8现在是主流,可以不处理,不影响使用。

(2)conf文件夹

放的是tomcat的配置文件,通过xml的方式提供。可以通过修改配置文件,修改tomcat的某些功能.

(3)logs

日志,调试一个服务器最重要的手段。代码中通过System.out.println打印的字符串就可以在该日志中看到,更好的理解服务器执行过程。

(4)webapps

wepapps文件中存放的是wepapp,每个wepapp中包含一个网站的前后端代码。写好的一个网站可以打包为一个war包复制到webapps中,tomcat就会自动对war包解压缩,从而完成网站的部署与加载。

3、借助tomcat服务器访问网页

在webapps文件夹中建立一个test文件夹,并在该文件夹中写入一个hello.html,启动tomcat.

通过服务器访问hello.html,需注意的是由于NAT机制,导致其他人不能访问,除非和我在同一个局域网内,可以将该网页放在云服务器的tomcat上,就可以让其他人访问了。

而直接点开hello.html,点开的是一个本地文件,不是通过网络访问的:

三、servlet

1、概念

刚刚写的hello.html是一个静态页面,每次访问的内容都是一样的。同时,tomcat也支持动态页面,不同或相同的请求,所访问到的页面是不同的。tomcat提供了API可以实现动态页面,该api为servlet。

2、servlet实现在浏览器上显示hello
(1)创建Maven项目

①Maven项目

Maven项目是一个项目管理工具,帮助开发团队更好地组织和管理项目的依赖关系、构建项目、生成项目报告等。

②通过java创建Maven项目

IDEA集成了Maven,可以直接创建Maven项目。

main中放的是业务代码,test中放的是测试代码,pom.xml中放的是maven项目入口配置文件。

(2)引入依赖

接下来的程序会使用到tomcat的servletAPI,而jdk不提供,所以需要引入。

①打开Maven中央仓库,找到servlet的jar包

②借助Maven项目,自助下载依赖至Maven本地仓库

在pom.xml中写入:

(3)创建目录

Maven项目是普适的,不仅仅局限于tomcat,而对于tomcat来说,对于Maven项目目录结构有要求。

创建了webapp文件包,在该文件包下创建了WEB-INF文件包,在该文件包下创建了web.xml,而web.xml的内容是固定的,复制就可以了。

(4)编写代码

自定义一个类:helloServlet,该类继承自HttpServlet类(来自于引入的servlet)并重写父类的doGet方法。服务器要完成的三个步骤一般为:接收请求、作出响应、返回给客户端。对于接收请求,tomcat构造了HttpServletRequest类,并解析http客户端发送的字符串请求,不需要我们干预;对于作出响应,是在doGet方法中实现的,根据请求req生成resp(响应正文);对于返回给客户端,tomcat会将HttpServletResponse类转为字符串,不需要干预。

不是每一个get请求都要调用该doGet方法,@WebServlet("/hello")指定了请求路径是/hello时,才能调用doGet方法。

(5)打包程序

写好的代码要打包为war包(tomcat需要war包),Maven就可以实现。

①修改pom.xml,设置打包类型和包名字

②双击package按钮

打包成功

(6)部署程序

将.war包复制到tomcat的wepapps中,并启动tomcat。

(7)验证程序

通过浏览器,访问tomcat

响应正文hello

服务器控制台hello

四、IDEA集成tomcat

1、过程

上述借助tomcat服务器,实现了在浏览器上显示hello。但有个比较麻烦的问题,若业务代码改变了,就需要重新打包、重新部署,比较麻烦,为了解决上述问题,可以在IDEA中集成tomcat,安装small tomcat插件,完成一系列操作。

具体步骤:

(1)安装small tomcat插件

(2)修改代码并点击右上角Edit Cong...

(3)部署

Context path决定了访问这个servlet时,第一级路径是什么。Tomcat server中填写tomcat在那个目录。其他保存默认即可。

(4)运行tomcat

这个链接只要第一级路径,访问会显示404

(5)浏览器访问

路径为:Context path+servler path

2、解决浏览器中文乱码问题

代码改成如上图片所示时,浏览器访问会显示什么???

会出现乱码,如何解决以上问题???

在进行编码响应时,idea是utf8编码

而浏览器解析数据时,跟随系统使用的是gbk。将浏览器解析改为utf8,可以在http响应报文头中,显式的告诉浏览器响应正文采用utf8字符集,浏览器就根据正文类型改为utf8解析。

五、编写servlet代码过程中遇到的问题

1、出现404--未找到

url路径写错了、webapp没有正确加载(比如:web.xml内容错误)。

2、出现405--方法不允许

请求方法未实现、在方法中调用了父类的方法。

3、500--内部服务器错误

在方法中出现了异常。

4、出现空白页面

服务器返回的响应没有正文。

5、无法访问此网站

tomcat未正常工作

六、Servlet API详细情况

主要有3个类:HttpServlet、HttpServletRequest、HttpServletResponse。

1、HttpServlet类

在编写servlet代码时,继承了HttpServlet类,重写了父类中的方法。

上面在编写servlet代码时,没有main方法,也没有实例化对象,其实有这些步骤,只是这些步骤在tomcat中已经实现了,我们只需要补充具体响应方法,嵌入到tomcat中即可。

HttpServlet类中的方法:

init方法:Servlet被实例化之后,自动执行的方法,完成初始化操作;

service方法:收到请求时调用,根据请求方法调用相对应的方法。

destroy方法:Servlet被销毁之前,自动执行的方法,释放资源;

以上即为Servlet的生命周期,方法不用被手动调用,tomcat会在合适的时机自动调用。

2、HttpServletRequest类

表示了一个http请求,Servlet中可以调用该类中的方法获取到请求的详细信息。

(1)HttpServletRequest类中的方法

URI:唯一资源标识符;URL:唯一资源定位/地址符。实际开发中,不做严格区分。

具体使用:

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.Enumeration;

@WebServlet("/show")
public class showServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuilder s=new StringBuilder();
        s.append(req.getProtocol()); //获取协议名称和版本号
        s.append("<br>"); //另起一行
        s.append(req.getMethod()); //获取请求的http方法
        s.append("<br>");
        s.append(req.getRequestURI());  //获取请求的url
        s.append("<br>");
        s.append(req.getContextPath());  //获取请求中的uri
        s.append("<br>");
        s.append(req.getQueryString()); //获取url中的查询字符串
        s.append("<br>");
        Enumeration<String> headerNames=req.getHeaderNames(); //返回所有的header(键值对)
        while (headerNames.hasMoreElements()){
            String key= headerNames.nextElement();  //获取下一个元素
            String value=req.getHeader(key);  //key对应的value
            s.append(key+":"+value+"<br>");
        }
        //上述内容返回给客户端和服务器
        System.out.println(s.toString());
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write(s.toString());
    }
}

(2)针对请求的不同请求类型获取请求中的参数(query string)

①在浏览器地址栏里输入URL,此时构造了一个GET请求;

假设前端发来请求的query string是:a=1&b=1.

以下代码可以获取到URL中的query string:

通过postman发送一个请求,URL中的query string是:a=1&b=1

②通过form表单触发GET/POST请求,服务器获取请求方法

本质上也是一个query String的格式,只是放在了正文里。

和上述获取请求信息的过程是一样的,使用的是doPost方法。

借助postman发送一个post请求,请求类型是from表单类型。

②通过ajax方法构造http请求,并将请求转为json字符串发送给服务器(servlet)

由于json请求本身支持嵌套,自己写代码解析json请求较为困难。但Servlet也不支持读取json类型请求参数,因此需要使用json库--jackson。

引入jackson依赖到Maven项目

流程:获取到json请求,读取json请求并将json请求转为java对象,响应完成后,响应结果转为json字符串返回给客户端。

import com.fasterxml.jackson.databind.ObjectMapper;

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;

//java对象
class Request{
        public String a;
        public String b;
}
class Response{
        public boolean ok;
}
@WebServlet("/json")
public class showJson extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /*
        请求json字符串
        {
           "a":"1",
           "b":"1"
        }
        响应json字符串
        {
          "ok":"true"
        }*/
                ObjectMapper objectMapper=new ObjectMapper();  //核心类
                Request request=objectMapper.readValue(req.getInputStream(),Request.class);  //请求转为java对象
                System.out.println(request.a);
                System.out.println(request.b);
                Response response=new Response(); //响应的java对象
                response.ok=true;
                String jsonResponse=objectMapper.writeValueAsString(response); //响应转为json字符串
                resp.setContentType("application/json;charset=utf8");
                resp.getWriter().write(jsonResponse);
        }
}

json字符串转java对象:ObjectMapper类的readValue方法,获取到请求流,readValue内部会读取请求的正文信息(json字符串);按照json字符串形式将正文信息解析为键值对格式(map);获取到java对象属性,.class知道java对象的属性,根据属性名字查询对应的value,并赋值给java对象,查询完成后就得到一个完整的请求对象。

java对象的响应转字符串:ObjectMapper类的writeValueAsString方法,以java对象为参数,得到java属性和属性值,对应转为json字符串。

借助postman发送一个post请求,请求类型是json类型。

3、HttpServletResponse类

servlet编写代码时,考虑如何构造响应的一些方法。

代码应用:

Postman发送一个get请求,得到响应:

代码应用:

浏览器访问结果不断刷新:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java SSM园林绿化管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM园林绿化管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

安全基础~web攻防特性2

文章目录 知识补充Javaweb安全之webGoatwebgoat靶场搭建闯关GeneralInjectionldentity & Auth Failurelog4j2漏洞利用 JS项目&Node.JS框架安全 知识补充 Burpsuite Render在无法预览显示时&#xff0c;可以适当的清理缓存 win10下输入文字变成繁体解决 Javaweb安全之…

一键转换,让JPG轻松变身BMP - 提升办公效率,从这里开始!

在繁忙的办公环境中&#xff0c;我们总是在追求更高的效率&#xff0c;希望以更短的时间完成更多的任务。今天&#xff0c;我们将为您带来一款强大且实用的工具&#xff0c;它能帮助您快速将JPG格式的图片转换为BMP格式&#xff0c;让您在处理图片时更加得心应手。 首先&#x…

5分钟教会你如何在生产环境debug代码

前言 有时出现的线上bug在测试环境死活都不能复现&#xff0c;靠review代码猜测bug出现的原因&#xff0c;然后盲改代码直接在线上测试明显不靠谱。这时我们就需要在生产环境中debug代码&#xff0c;快速找到bug的原因&#xff0c;然后将锅丢出去。 生产环境的代码一般都是关闭…

怎么解决离散型制造业中的7大浪费

企业在生产管理中会产生各种浪费&#xff0c;MES可以巧妙结合精益化生产管理思想消除这些浪费。离散制造中的7大浪费&#xff1a; 1、生产不良 生产过程中出现废品、次品这类质量问题&#xff0c;一方面会消耗原材料、零部件等&#xff0c;另一方面生产、返修过程也会消耗人工…

Dicom标准里的 RescaleType

DCM_RescaleType 0x0028, 0x1054 这个 HU 和 us 是代表什么含义 之前去一个公司面试&#xff0c;问我&#xff0c; MR里灰阶是什么 CT里才叫CT值&#xff0c; MR里叫什么呢&#xff1f; DICOMLookup

selenium处理下拉框

当想要爬取的数据由下拉框来选择时&#xff0c;应该如何处理&#xff1f; 页面如下&#xff1a; 目的获得电影的详细信息&#xff0c;包括票房&#xff0c;上映日期等。 代码如下&#xff1a; from selenium import webdriver from selenium.webdriver.support.select impor…

LLM:Training Compute-Optimal Large Language Models

论文&#xff1a;https://arxiv.org/pdf/2203.15556.pdf 发表&#xff1a;2022 前文回顾&#xff1a; OpenAI在2020年提出《Scaling Laws for Neural Language Models》&#xff1a;Scaling Laws(缩放法则&#xff09;也一直影响了后续大模型的训练。其给出的结论是最佳计算效…

2024PMP考试新考纲-【过程领域】近期典型真题和很详细解析(7)

华研荟继续为您分享【过程Process领域】的新考纲下的真题&#xff0c;进一步帮助大家体会和理解新考纲下PMP的考试特点和如何应用知识来解题&#xff0c;并且举一反三&#xff0c;一次性、高等级通过2024年PMP考试。 2024年PMP考试新考纲-【过程领域】真题解析31 题&#xff1…

【4k】4k的webrtc播放示例

目录 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数

Pytest插件“pytest-selenium” - 让自动化测试更简洁

在现代Web应用的开发中,自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具,以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例,助你轻松进入无忧的Web应用测试之…

Pytorch从零开始实战17

Pytorch从零开始实战——生成对抗网络入门 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成对抗网络入门环境准备模型定义开始训练总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch1.8cpu&#xf…

CSS 浮动 定位

文章目录 网页布局的本质浮动如何设置浮动测试浮动 定位相对定位绝对定位测试定位 网页布局的本质 用 CSS 来摆放盒子&#xff0c;把盒子摆放到相应位置。 CSS 提供了三种传统布局方式&#xff08;简单说就是盒子如何进行排列&#xff09;。 普通流&#xff08;标准流&#…

后面的输入框与前面的联动,输入框只能输入正数(不用正则)

概要 提示&#xff1a;这里可以描述概要 前面的输入框是发票金额&#xff0c;后面的输入框是累计发票金额&#xff08;含本次&#xff09;--含本次就代表后倾请求的接口的数据&#xff08;不是保存后返显的-因为保存后返显的是含本次&#xff09;是不含本次的所以在输入发票金…

从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】

好久不见朋友们&#xff0c;今天给大家分享一个我自己很感兴趣的话题分析——NBA球员表现跟年龄关系到底大不大&#xff1f;数据来源于Kaggle&#xff0c;感兴趣的朋友可以点赞评论留言&#xff0c;我会将数据同代码一起发送给你。 目录 NBA球员表现的探索性数据分析导入Python…

会话跟踪技术(cookiesession)

文章目录 1、什么是会话跟踪技术2、Cookie2.1、Cookie基本使用2.2、Cookie原理2.3、Cookie使用细节 3、Session3.1、Session基本使用3.2、Session原理3.3、Session使用细节 4、Cookie和Session的对比 1、什么是会话跟踪技术 会话 ​ 用户打开浏览器&#xff0c;访问web服务器的…

在行情一般的情况下,就说说23级应届生如何找java工作

Java应届生找工作&#xff0c;不能单靠背面试题&#xff0c;更不能在简历中堆砌和找工作关系不大的校园实践经历&#xff0c;而是更要在面试中能证明自己的java相关商业项目经验。其实不少应届生Java求职者不是说没真实Java项目经验&#xff0c;而是不知道怎么挖掘&#xff0c;…

DB107S-ASEMI智能LED灯具专用DB107S

编辑&#xff1a;ll DB107S-ASEMI智能LED灯具专用DB107S 型号&#xff1a;DB107S 品牌&#xff1a;ASEMI 封装&#xff1a;DBS-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引…

浅析智能家居企业面临的组网问题及解决方案

在这个快速发展的时代&#xff0c;组网对于企业的发展来说是一个至关重要的环节。 案例背景&#xff1a; 案例企业是一家智能家居制造企业&#xff0c;在不同城市分布有分公司、店铺、工厂&#xff0c;这些点原本都是各自采购网络&#xff0c;与总部进行日常沟通、访问。 现在…

Linux用户与文件的关系和文件掩码(umask)的作用

文章目录 1 前言2 Linux用户与文件的关系3 文件掩码&#xff08;umask&#xff09;4 总结 1 前言 阅读本篇文章&#xff0c;你将了解Linux的目录结构&#xff0c;用户与文件的关系&#xff0c;以及文件掩码的作用。为了方便大家理解&#xff0c;本文将通过实例进行演示&#xf…