大家好,今天来为大家解答深入解析Servlet:核心技术与应用实例这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
然而,随着互联网的发展,很多线下业务开始向线上发展,基于互联网的Web应用也变得越来越复杂。用户访问的资源不再局限于服务器硬盘上存储的静态网页。更多的应用需要根据用户请求动态生成网页信息。在复杂的情况下,需要从数据库中提取信息。经过一定的计算后,我们如何生成一个页面并返回给客户呢?
利用实现了HTTP协议的服务器端软件,这些软件提前为我们提供了扩展接口。我们只需要按照一定的规则提供相应的扩展功能即可。这类Web服务器在收到客户端请求时,判断该请求是否是访问我们提供的扩展功能?如果是的话,请求就会交给我们编写的程序。处理完成后,程序将处理结果返回给Web服务器软件。 Web服务器软件得到结果后,会将结果作为响应信息返回给客户端。
早期使用的Web服务器扩展机制是CGI,它允许用户调用Web服务器上的CGI程序。 CGI的全称是CommonGateway Interface。大多数CGI程序是用Perl编写的,有些也用C、Python或PHP编写。用户可以单击连接或直接在浏览器地址栏中输入URL来访问CGI程序。 Web服务器收到请求后,发现该请求是针对CGI程序的,于是启动并运行CGI程序并处理该请求。处理。 CGI程序解析请求中的CGI数据,处理数据,并生成响应,返回给Web服务器。 Web 服务器将响应打包并以HTTP 响应的形式发送到Web 浏览器。但CGI编写困难,对用户请求的响应时间较长,并且以进程模式运行,性能有限。
1997年,SUN公司推出了Servlet技术,作为Java阵营的CGI解决方案。作为微软ASP(1996年推出)的推出,SUN公司于1998年推出了JSP技术,允许Java脚本代码嵌入HTML页面中。从而实现动态网页的功能。另外,PHP(1994年发明)技术也与APS、JSP服务器端页面编写技术类似。
Servletjava Servlet(java服务器小程序)是一个基于java技术的Web组件。它运行在服务器端,由Servlet容器管理。它用于生成动态内容。 Servlet是一个与平台无关的java类。实际编写Servlet上面是按照Servlet规范编写一个Java类。 Servlet被编译成与平台无关的字节码,可以动态加载到支持Java技术的Web服务器中并运行。
小服务程序容器
Servlet容器,也称为Servlet引擎,是Web服务器或应用程序服务器的一部分。用户除了发送请求和响应、解码基于MIME 的请求以及格式化基于MIME 的请求之外,还提供网络服务。 Servlet 不能独立运行,必须部署到Servlet 容器中,容器实例化并调用Servlet 的方法。 Servlet容器在Servlet的生命周期内包含并管理Servlet。
对比CGIServlet是单实例多线程运行模式。每个请求都在独立的线程中运行。提供服务的Servlet实例只有一个Servlet。它具有可扩展性,可以响应更多请求,因为servlet 容器使用一个线程。与操作系统进程相比,线程占用的资源更小
3.Servlet使用标准API,得到更多Web服务器的支持。
4.Servlet采用Java语言编写,具有更多Java编程语言的优点。
5、Servlet可以访问Java平台丰富的类库,更容易开发各种应用程序。
6、Servlet容器为Servlet提供额外的功能。TomcatTomcat 是一个免费的开源代码Servlet 容器。它是Apache软件基金会的顶级项目。它是由Apache、SUN等公司和个人联合开发的。由于SUN的参与和支持,最新的Servlet和JSP规范始终在Tomcat中得到体现。 Tomcat支持Servlet2.5
Tomcat安装
安装jdk并配置环境变量path、CLASSPATH、JAVA_HOME
只需解压tomcat即可
Tomcat目录结构
bin 存放启动和关闭Tomcat的脚本文件
conf存放Tomcat服务器的各种配置文件,server.xml web.xml等
lib存储Tomcat服务器和所有Web应用程序需要访问的JAR文件
Logs 存储Tomcat 日志文件
temp存放Tomcat运行时产生的临时文件
webapps 发布Web应用程序时,Web应用程序的目录和文件通常都放在这个目录下。
work Tomcat在此目录下存放Servlet源文件和JSP生成的字节码文件。
Servlet详解
Servlet API
Servlet接口
init(ServletConfig 配置)
Servlet实例化后,Servlet容器会调用init()方法来初始化该对象,主要是让Servlet对象在处理客户请求之前完成一些初始化工作。例如,建立与数据库的连接、获取配置信息等。对于每个Servlet实例,init()方法只能被调用一次。 Servlet容器通过config参数将配置信息传递给Servlet。可以通过config获取Web应用的初始化参数,也可以获取ServletContext对象。
服务(ServletRequest req,ServletResponse res)
容器调用service()方法来处理客户端的请求。在容器调用service()方法之前,必须确保Init()方法正确完成。容器将构造一个ServletRequest 对象和一个ServletResponse 对象,并将它们作为参数传递给service() 方法。
破坏();
当容器检测到某个Servlet对象应该从服务中删除时,容器会调用该对象的destroy方法,以便Servlet对象释放它使用的资源,并将数据保存到数据库中。
ServletConfig getServletConfig()
返回容器调用init() 方法时传递给Servlet 对象的ServletConfig 对象。
字符串getServletInfo()
返回一个String类型的字符串,其中包含Servlet的信息,如版权、作者等。
ServletRequest
ServletRequest 对象,用来封装请求数据
对象getAttribute(字符串名称)
返回名为name 的属性的值。如果不存在,则返回nullEnumeration getAttributeNames();
返回请求中所有可用属性的名称。返回一个枚举集合void removeAttribute(String name);
删除请求中名为name 的属性void setAttribute(String key,Object val);
在请求中保存键值对。获取字符编码()
返回请求正文中使用的字符编码的名称int getContentLength()
返回请求正文的长度(以字节为单位)。字符串getContentType()
返回文本的MIME 类型ServletInputStream getInputStream()BufferedReader getReader()String getLocalAddr()
返回接收请求的网络接口的IP 地址。字符串getRemoteAddr()
返回发送请求的客户端或最后一个代理服务器的IP 地址String getRemoteHost()
返回发送请求的客户端或最后一个代理服务器的完全限定名称String getLocalName()
返回接收请求的IP 接口的主机名int getLocalPort()
返回接收请求的网络接口的IP 端口号int getRemotePort()
返回发送请求的客户端或最后一个代理服务器的IP 源端口。字符串获取参数(字符串名称)
返回请求中名称参数的值。如果name 参数有多个值,则此方法返回值列表中的第一个值。如果请求中没有找到该参数,则返回nullEnumeration getParameterNames()
返回请求中包含的所有参数的名称。 String[] getParameterValues(字符串名称);
返回请求中name参数的所有值String getProtocal()
返回请求中使用的协议的名称和版本。例如, HTTP/1.1RequestDispatcher getRequestDispatcher(String path)
返回一个RequestDispather 对象,作为按路径定位的资源的封装。字符串getServerName()
返回请求发送到的服务器的主机名int getServerPort()
返回请求发送到服务器的端口号setCharacterEncoding(String env)
覆盖请求正文中使用的字符编码的名称。
ServletResponse对象,用来封装响应数据
flashBuffer() 强制将缓存中的任何内容发送到客户端int getBufferSize() 返回实际用于响应的缓存大小。如果没有使用缓存,该方法返回0String getCharacterEncoding()
返回响应中发送的正文中使用的字符编码(MIME 字符集) String getContentType()
返回用于响应中发送的正文的MIME 类型ServletOutputStream getOutputStream()PrintWriter getWriter()boolean isCommited() 返回一个布尔值,指示响应是否已提交。 void reset() 清除缓存中的所有数据,包括状态代码和消息头。 void resetBuffer() 清除缓存中的响应内容,保留状态码和消息头。无效setBufferSize(int大小)
设置响应正文的缓存大小。无效setCharacterEncoding(字符串字符集)
设置发送到客户端的响应的字符编码void setContentLength(int len)
设置内容体长度void setContentType(String type)
设置要发送到客户端的响应的内容类型。例如:"text/html;charset=UTF-8"
ServletConfig
Servlet容器在Servlet初始化期间使用ServletConfig对象向其传递配置信息,一个ServletConfig对象。
String getInitParameter(字符串名称);
返回名为name 的初始化参数的值。初始化参数在web.xml配置文件中配置。
枚举getInitParameterNames()
返回Servlet 所有初始化参数名称的枚举集合。
ServletContext getServletContext()
返回对Servlet 上下文对象的引用。
字符串getServletName()
返回Web 应用程序的部署描述符中指定的Servlet 实例的名称。
编写Servlet实际上就是编写一个实现javax.servlet.Servlet接口的类。
GenericServlet
如果想写一个通用的Servlet,只需要继承GenericServlet,并实现抽象方法service();
String getInitParameter(字符串名称)
枚举getInitParameterNames();
ServletContext getServletContext()
init(ServletConfig config)
HttpServlet
在大多数网络应用中,客户端通过HTTP协议访问服务器端资源。我们编写的Servlet主要用于HTTP协议的请求和响应。为了快速开发应用程序对于HTTP协议的Servlet类,Sun在javax.servlet.http包中为我们提供了一个抽象类HttpServlet,它继承自GenericServlet类,用于创建适合WEB站点的HTTP Servlet。
公共无效服务(ServletRequest req,ServletResponse res);
protected void 服务(HttpServletRequest req、HttpServletResponse resp)
对于HTTP1.1定义的七种请求方法:GET、POST、HEAD、PUT、DELETE、TRACE、OPTION、
HttpServlet提供了7种处理方法
doGet(HttpServletRequest req,HttpServletResponse resp)
doPost(HttpServletRequest req,HttpServletResponse resp)
.当容器收到对HttpServlet 对象的请求时,调用该对象中方法的顺序如下:
调用公共service()方法。在public service()方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,然后调用受保护的service()方法,并将转换后的对象作为受保护服务方法中的参数传递。首先调用HttpServletRequest对象的getMethod方法获取HTTP请求方法的名称,然后根据请求方法的类型调用对应的doXxx()方法
HttpServletRequest
继承自javax.servlet.servletRequest,新建该接口添加的方法如下:
字符串getContextPath()
返回请求URI 中表示请求上下文的部分。上下文路径是请求URI 的开始部分Cookie[] getCookies()
返回本次请求中客户端发送的所有Cookie 对象String getHeader(String name)
返回名为name 的请求头的值Enumeration getHeaderNames()
返回此请求中包含的所有标头名称的枚举集Enumeration getHeaders(String name)
返回名为name 的请求头所有值的枚举集合String getMethod()
返回此请求中使用的HTTP 方法的名称String getServletPath()
返回调用Servlet HttpSession getSession() 的请求URI 部分
返回与此请求关联的SessionHttpSession getSession(boolean create)
返回与此请求关联的会话。如果没有为客户端分配Session,并且create参数为true,则创建一个新的Session。如果为false,则该请求没有有效的HttpSession,返回null
HttpServletResponse
该接口继承ServletResponse,添加新方法如下
addCookie(Cookie cookie)addHeader(String name,String value);boolean containsHeader(String name)encodeRedirectURL(String url) 使用SessionID 对重定向的URL 进行编码,以便可以在sendRedirect() 方法中使用。 encodeURL(String url) 使用SessionID 来指定url 编码sendRedirect(String location) 向客户端发送临时重定向响应,让客户端访问新的url
Servlet生命周期
Servlet 运行在Servlet 容器中,其生命周期是受管理的由容器管理,其生命周期由javax管理。 servlet.Servlet接口中的init()、service()和destroy()方法表明Servlet生命周期包括四个阶段。
加载和实例化
Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者当容器检测到Servlet响应第一个请求时,就会创建一个Servlet实例。初始化
Servlet实例化后,容器会调用Servlet的init()方法来初始化该对象。对于每个Servlet实例,init()方法只被调用一次,并处理请求
Servlet容器调用Servlet的service()方法来处理请求。 init()方法必须在服务执行之前成功执行。服务终止
当容器检测到应该从服务中删除Servlet 实例时,容器会调用该实例的destroy() 方法。释放资源。
跳转
RequestDispatcher接口
该对象由Servlet容器创建,用于封装由路径标识的服务器资源。该对象可用于将请求转发到其他Servlet 或jsp 页面。
前言(ServletRequest req,ServletResponse resp)
该方法用于将请求从Servlet 传递到服务器上的另一个Servlet、jsp 或html 文件。调用forword方法后,响应缓存中未提交的内容会被自动清除。该方法将请求转发给其他Servlet,由被调用的Servlet负责响应请求,并终止原Servlet的执行。
包括(ServletRequest req,ServletResponse resp)
该方法用于将请求转发给其他Servlet。被调用的Servlet对请求的响应会合并到原来的响应对象中,原来的Servlet可以继续输出响应信息。
forword()和include()是内部请求,浏览器地址不变,客户端只向服务器发送一次请求。
sendRedirect()
此方法由HttpServletResponse 对象提供。
重定向到另一个请求。这是一个外部请求。重定向相当于重新向服务器发送请求,浏览器地址发生变化
如果你还想了解更多这方面的信息,记得收藏关注本站。
【深入解析Servlet:核心技术与应用实例】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
Servlet 是 Javaee 中很重要的一部分啊!
有6位网友表示赞同!
每次学 Servlet 就觉得好强大,可以处理各种请求!
有10位网友表示赞同!
想问问有没有人推荐好用的 Servlet 学习资源?
有15位网友表示赞同!
从小了解Servlet,感觉用起来挺方便的。
有7位网友表示赞同!
最近在学习 Servlet,感觉它的架构还挺精妙的。
有6位网友表示赞同!
Servlet 听起来就很像 Java 的一部分啊。
有18位网友表示赞同!
我想弄明白 Servlet 和JSP的区别,哪位大佬能解释一下?
有10位网友表示赞同!
Servlet 在 WEB 开发中确实很常用!
有10位网友表示赞同!
希望有一天我能把 Servlet 运用得更加熟练!
有19位网友表示赞同!
学习 Servlet 是为了更好地理解 Web 应用的运作机制吧。
有17位网友表示赞同!
Servlet 的生命周期还挺复杂,需要好好研究一下。
有16位网友表示赞同!
Java 的 Servlet 和 Spring 都挺不错的,哪个更适合学习呢?
有16位网友表示赞同!
Servlet 的例子代码在哪里能找到啊?分享一下吧!
有20位网友表示赞同!
每次遇到 Web 开发就想起Servlet!
有20位网友表示赞同!
Servlet 不是一个很古老的规范了,但现在还是非常有用的!
有17位网友表示赞同!
希望以后还有更多关于 Servlet 的学习内容可以参考!
有15位网友表示赞同!
感觉 Servlet 和 Node.js 有些类似的功能?
有8位网友表示赞同!
Servlet 可以实现动态网页吗?
有16位网友表示赞同!
我的项目中需要用到 Servlet,来推荐一些资料吧!
有12位网友表示赞同!
学习 servlet 很有挑战性,但也充满了乐趣!
有9位网友表示赞同!