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插件](#(1)安装small tomcat插件)

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

(3)部署

(5)浏览器访问

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

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

1、出现404--未找到

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

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

4、出现空白页面

5、无法访问此网站

[六、Servlet API详细情况](#六、Servlet API详细情况)

1、HttpServlet类

2、HttpServletRequest类

(1)HttpServletRequest类中的方法

[(2)针对请求的不同请求类型获取请求中的参数(query string)](#(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:唯一资源定位/地址符。实际开发中,不做严格区分。

具体使用:

java 复制代码
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字符串返回给客户端。

java 复制代码
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请求,得到响应:

代码应用:

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

相关推荐
Koi慢热1 小时前
路由基础(全)
linux·网络·网络协议·安全
hzyyyyyyyu3 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
刽子手发艺3 小时前
WebSocket详解、WebSocket入门案例
网络·websocket·网络协议
速盾cdn7 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
yaoxin5211237 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin7 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
PersistJiao9 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
黑客Ash11 小时前
【D01】网络安全概论
网络·安全·web安全·php
->yjy11 小时前
计算机网络(第一章)
网络·计算机网络·php