Servlet(二)

Servlet(二)

  1. GenericServlet:

1). 是一个 Serlvet. 是 Servlet 接口和 ServletConfig 接口的实现类. 但是一个抽象类. 其中的 service 方法为抽象方法

2). 如果新建的 Servlet 程序直接继承 GenericSerlvet 会使开发更简洁.
3). 具体实现:

①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化
②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法
③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.
④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,
则会出现空指针异常.
⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

public abstract class GenericServlet implements Servlet, ServletConfig {

	/** 以下方法为 Servlet 接口的方法 **/
	@Override
	public void destroy() {}

	@Override
	public ServletConfig getServletConfig() {
		return servletConfig;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	private ServletConfig servletConfig;
	
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		this.servletConfig = arg0;
		init();
	}

	public void init() throws ServletException{}

	@Override
	public abstract void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException;

	/** 以下方法为 ServletConfig 接口的方法 **/
	@Override
	public String getInitParameter(String arg0) {
		return servletConfig.getInitParameter(arg0);
	}

	@Override
	public Enumeration getInitParameterNames() {
		return servletConfig.getInitParameterNames();
	}

	@Override
	public ServletContext getServletContext() {
		return servletConfig.getServletContext();
	}

	@Override
	public String getServletName() {
		return servletConfig.getServletName();
	}

}
  1. HttpServlet:

1). 是一个 Servlet, 继承自 GenericServlet. 针对于 HTTP 协议所定制.

2). 在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse.
并调用了重载的 service(HttpServletRequest, HttpServletResponse)

在 service(HttpServletRequest, HttpServletResponse) 获取了请求方式: request.getMethod(). 根据请求方式有创建了
doXxx() 方法(xxx 为具体的请求方式, 比如 doGet, doPost)

@Override
 public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {

    HttpServletRequest  request;
    HttpServletResponse response;
    
    try {
        request = (HttpServletRequest) req;
        response = (HttpServletResponse) res;
    } catch (ClassCastException e) {
        throw new ServletException("non-HTTP request or response");
    }
    service(request, response);
}

public void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	//1. 获取请求方式.
	String method = request.getMethod();
	
	//2. 根据请求方式再调用对应的处理方法
	if("GET".equalsIgnoreCase(method)){
		doGet(request, response);
	}else if("POST".equalsIgnoreCase(method)){
		doPost(request, response);
	}
}

public void doPost(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException{
	// TODO Auto-generated method stub
	
}

public void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
	// TODO Auto-generated method stub
	
}

3). 实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可.

4). 好处: 直接由针对性的覆盖 doXxx() 方法; 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转.

  1. 请求的转发和重定向:

1). 本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求.

具体:

①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址

②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.

③. 请求的转发: 只能转发给当前 WEB 应用的的资源,不能超出该工程
请求的重定向: 可以重定向到任何资源.

④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.
在这里插入图片描述
在这里插入图片描述

### JavaWeb 实验Servlet 示例代码及实现方法 以下是基于提供的引用内容和专业知识整理的关于 JavaWeb 实验Servlet 的示例代码及其具体实现方法。 #### 1. 创建 Servlet 类 在 `src` 下新建一个包,例如命名为 `ServerTest`,用于存储所有的 Servlet 文件。随后在此包下创建一个新的 Servlet 类文件,通常以 `.java` 结尾[^5]。以下是一个标准的 Servlet 示例代码: ```java // 导入必要的类库 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应的内容类型为 text/html 并指定字符编码 UTF-8 response.setContentType("text/html;charset=UTF-8"); // 获取输出流对象 try (var out = response.getWriter()) { // 向客户端发送 HTML 数据 out.println("<!DOCTYPE html>"); out.println("<html lang='en'>"); out.println("<head><title>Hello Servlet</title></head>"); out.println("<body>"); out.println("<h1>欢迎来到 Servlet 编程世界!</h1>"); out.println("</body></html>"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 如果需要处理 POST 请求,则在这里编写逻辑 doGet(request, response); } } ``` 上述代码展示了如何通过继承 `HttpServlet` 来定义一个基本的 Servlet,并重写了其默认的方法 `doGet()` 和 `doPost()`[^1]。 --- #### 2. 配置 web.xml 文件 为了让 Web 容器识别该 Servlet,需将其注册到项目的部署描述符文件 `web.xml` 中。以下是配置示例: ```xml <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 定义 Servlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>ServerTest.HelloServlet</servlet-class> </servlet> <!-- 映射 URL 到 Servlet --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> ``` 以上 XML 片段指定了访问路径 `/hello` 将映射至名为 `HelloServlet` 的 Servlet。 --- #### 3. 运行与测试 完成上述步骤后,启动 Tomcat 或其他兼容的 Servlet 容器运行项目。打开浏览器并输入如下地址即可查看效果: ``` http://localhost:8080/<your_project_name>/hello ``` 如果一切正常,页面会显示一条消息:“欢迎来到 Servlet 编程世界!”[^4]。 --- #### 4. 关键知识点总结 - **Servlet 生命周期**:包括初始化 (`init`)、服务 (`service`) 和销毁 (`destroy`) 方法。 - **请求处理机制**:通过 HTTP 协议接收来自客户端的 GET 或 POST 请求,并返回相应数据给客户端[^2]。 - **编程模型**:采用面向对象的方式扩展 `HttpServlet` 类来构建动态网页应用程序。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值