程序员的知识教程库

网站首页 > 教程分享 正文

Servlet探索(servlet .do)

henian88 2024-08-15 21:55:59 教程分享 15 ℃ 0 评论

背景

相信做 java-web,用过 structs2 同学对于 servlet 并不陌生。然而,目前大家做 java-web 都是用springmvc、springboot。spring 框架对servlet做了很好的封装,很好用,但是框架也让我们变成了只会用注解,对于 java-web 底层缺乏了解的,只专注业务逻辑的开发者。一旦有线上故障出现,就会很慌张。作为一名有志向的程序员,了解一些底层的知识是必备技能。

servlet

概念

??servlet是sun公司提供的用于开发动态web资源的技术,是 j2ee 三大规范之一,servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法。

??其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

?你初始化时要做什么??你销毁时要做什么??你接受到请求时要做什么?

容器

1.servlet容器是什么?

??Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。

??Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。

1.http请求过程

如上图所示,解析 http 请求的是 servlet 容器,容器将请求封装为 servlet 中的 HttpServletRequest 对象,调用 init(),service()等方法输出response,由容器包装为 httpResponse 返回给客户端的过程。

应用

一: 创建项目

1.idea 新建一个 servlet 项目

创建好的项目目录如下:

2.新增一个 servlet 类

新增一个实现 DisplayHeader 类继承 HttpServlet 抽象类,重写了 doGet 的方法,可以通过HttpServletRequest 取到请求数据,并进行处理。返回时将数据和html结合起来,写到 HttpServletResponse 类中进行返回。

代码示例如下:


import javax.servlet.ServletException;

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

public class DisplayHeader extends HttpServlet {

@Override

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

resp.setContentType("text/html");

PrintWriter out = resp.getWriter();

String title = "HTTP Header 请求实例";

String docType =

"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";

out.println(docType +

"<html>\n" +

"<head><title>" + title + "</title></head>\n"+

"<body bgcolor=\"#f0f0f0\">\n" +

"<h1 align=\"center\">" + title + "</h1>\n" +

"<table width=\"100%\" border=\"1\" align=\"center\">\n" +

"<tr bgcolor=\"#949494\">\n" +

"<th>Header 名称</th><th>Header 值</th>\n"+

"</tr>\n");

Enumeration headnames = req.getHeaderNames();

while (headnames.hasMoreElements()){

String paramName = (String) headnames.nextElement();

out.print("<tr><td>" + paramName +"<td>\n");

String paramValue = req.getHeader(paramName);

out.println("<td>" +paramValue+"</td><tr>\n");

}

out.println("</table>\n</body></html>");

}

@Override

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

doGet(req,resp);

}

}

3.servlet部署

默认情况下,Servlet 应用程序位于路径 /webapps/ROOT 下,且类文件放在 /webapps/ROOT/WEB-INF/classes 中。如果类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于 WEB-INF/classes/com/myorg/MyServlet.class 中。

并在位于 /webapps/ROOT/WEB-INF/ 的 web.xml 文件中创建以下配置:


<servlet>

<servlet-name>DisplayHeader</servlet-name>

<servlet-class>DisplayHeader</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>DisplayHeader</servlet-name>

<url-pattern>/DisplayHeader</url-pattern>

</servlet-mapping>

在该项目中,配置好了,直接启动程序,访问http://localhost:8090/ServletTest/DisplayHeader则可以出现如下页面。

二: servlet 访问流程

浏览器地址栏中输入:http://localhost:8080/day06/hello

访问过程如下

servlet和springmvc的关系

springmvc

??Springmvc的核心是一个DispatcherServlet,并且DispatcherServlet继承自 FrameworkServlet继承自HttpServletBean 继承自HttpServlet(也就是你说的servelt) 本质上是一样的东西。其实就是基于tomcat等这些web容器对我们的CS请求能做更多的事情,如校验,拦截(AOP思想),后期渲染等等,好让我们专注于业务的开发。

参考博客

1.将tomcat、servlet的关系讲很清晰: https://blog.csdn.net/weixin_40396459/article/details/81706543

2. idea中创建一个servlet程序: https://www.cnblogs.com/liusong-funtime/p/9144275.html

3.https://zhuanlan.zhihu.com/p/295173834

4.https://blog.csdn.net/weixin_39893958/article/details/84389384

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表