首页 > 学院 > 开发设计 > 正文

Servlet学习 ——Web部分第十天

2019-11-14 09:27:39
字体:
来源:转载
供稿:网友

Servlet学习 ——Web部分第十天

小知识点

Servlet是java web 的三大组件之一,它属于动态资源。java web 的三大组件有Servlet,Filter,Listener。常见的端口号:http/80 ; smtp/25 ; pop3/110 ; ftp/23 ; https/443

1. Servlet简介

Servlet是用来完成客户端向服务器发出请求的处理行为的编写。即接受请求数据,处理请求,完成响应。实现Servlet的方式有我们自己编写,通过继承或实现接口的方式有关接口和类信息:javax.servlet.Servlet 接口 ; javax.servlet.GenericServlet 抽象类 ;javax.servlet.http.HttpServlet 抽象类

特性

Servlet是单例类,可以实现多个Servlet类,但每个类只有一个对象。线程不安全,它存在多个客户端访问同一个Servlet资源,所以不要在Servlet类中实现可以同时读和写的方法 。Servlet由我们编写,但是由服务器去创建对象,并且由服务器来调用相应的方法。

写完后的Servlet实现要在WEB-INF下的web.xml中编写xml信息

<servlet> <!--servlet标签中存放的信息就是ServletConfig的信息,并且通过以下方法获取关键的信息--> <!--public String getInitParameter(String name) 通过指定的名称获取指定初始化参数的值--> <!--public Enumeration getInitParameterNames() 获取所有初始化参数的名称 --> <!--public ServletContext getServletContext()获取Servet上下文对象 --> <!--public String getServletName() :用于获取servlet-name标签下的内容--> <!--servlet-name标签是自定义访问名称,用于servlet-mapping标签中的servlet-name标签来相匹配--> <!--servlet-class 中存放的应是classes目录下实现的MySerlevt的类名--> <!--init-param标签下设置的是初始化参数--> <!--load-on-startup表示当服务器启动时就访问该Servlet参数为多个Servlet标签时的执行顺序--> <servlet-name>abc</servlet-name> <servlet-class>包名.MyServlet</servlet-class> <load-on-startup>0</load-on-startup> <init-param> <param-name>p1</param-name> <param-value>v1</param-value> </init-param> <init-param> <param-name>p2</param-name> <param-value>v2</param-value> </init-param><servlet><servlet-mapping> <servlet-name>abc</servlet-name> <!--url-pattern 决定了当服务器访问该Servlet的路径名称,可以为多个标签常用的标签表达方式如下三种--> <!--通配符*只能出现在末尾或者开头--> <!--表示serlevtpath地址下的的所有路径对应此servlet--> <url-pattern>/servletpath/*</url-pattern> <!--表示对应的扩展名为.xxxx的路径对应此servlet--> <url-pattern>*.xxx</url-pattern> <!--表示所有路径都对应此servlet--> <url-pattern>/*</url-pattern></servlet-mapping>

通过实现Servlet接口实现MyServlet

import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyServlet implements Servlet { @Override public void destroy() { //该方法会在Servlet对象销毁之前执行,并且只执行一次。 } @Override public ServletConfig getServletConfig() { //获取Servlet的配置信息 return null; } @Override public String getServletInfo() { //获取Servlet的信息 return null; } @Override public void init(ServletConfig config) throws ServletException { //由Tomcat服务器来调用并且只调用一次 //该方法会在Servlet对象创建之后马上执行,并且只执行一次。 } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //该方法会被多次调用,用于处理每次发出的请求,并做出回应或处理。 }}

通过实现GenericServlet接口实现MyServlet

GenericServlet该类视为了方便程序员对Servlet接口的重复操作的编写创建的抽象类以下代码即为GenericServlet功能的主要实现。MyServlet就可以模拟GenericServlet存在的目的当继承GenericServlet类时,重写无参的init()方法即可。//手写GenericServlet类的源码实现import java.io.IOException;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyServlet implements Servlet,ServletConfig{ //创建ServletConfig对象,方便服务调用, PRivate ServletConfig config; @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return this.config; } //如下四个方法是是实现的ServletConfig接口中的方法 public String getInitParameter(String name) { return getServletConfig().getInitParameter(name); } public Enumeration getInitParameterNames() { return getServletConfig().getInitParameterNames(); } public ServletContext getServletContext() { return getServletConfig().getServletContext(); } public String getServletName() { return getServletConfig().getServletName(); } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig servletConfig) throws ServletException { this.config = servletConfig; init(); } //通过创建无参init方法方便子类继承并能够正常的享有父类拥有的信息 public void init() throws ServletException { } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { }}

通过继承HttpServlet接口实现MyServlet

HttpServlet是专门对GenericServlet类中ServletRequest, ServletResponse 的参数进行强转来处理Http的请求继承该类后只需实现其中的doGet()和doPost()方法即可如果没有实现其中的一种方法而用该种方式请求浏览器则浏览器会报405状态码,表示客户端向服务器请求方式的错误。package text.web.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }}

2.ServletContext关键类

一个项目只有一个ServletContext对象,他的创建和销毁是对应服务器的创建和销毁。

它可以被个Servlet来获取该对象,它可以被用来给多个Servlet对象传递数据。

获取ServletContext对象的方式

ServletConfig中的getServletContext() ;GenericServlet中的getSerletContext() ;Httpsession中的getSerletContext() ;SerletContextEvent中的getSerletContext() ;

ServletContext是javaweb的四大域对象之一

四大域对象分别是: PageContext;ServletRequest;HttpSession ;ServletContext所有域对象内部有一个Map。用来储存数据

ServletContext操作数据的方法

void setAttribute(String name, Object object) 保存一个域信息,和map相同的是相同的name会覆盖object ;Object getAttribute(String name) 得到name的域信息void removeAttribute(String name) 删除name的键值对信息;Enumeration getAttributeNames() 得到所有的name的域信息

ServletContext的对象可以获取真实的路径

可以使用ServletContext来获取web应用下的资源文件,String realPath = servletContext.getRealPath("/WEB下的文件") ;//realPath返回的是带盘符的真实路径可以使用ServletContext来获取web应用下的资源流,InputStream in = servletContext.getResourceAsStream("/WEB下的文件") ;可以使用ServletContext来获取web目录下的所有资源Set set = servletContext.getResourcePaths("/WEB下的文件") ;
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表