实现并配置一个简单的Servlet
来源:互联网 发布:贷款app源码 编辑:程序博客网 时间:2024/05/19 02:25
Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求。尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求。 Servlet必须部署在Java servlet容器才能使用。既然Servlet是一个Java类,那么我们就可以自己去实现它。下面展示了如何实现一个简单的Servlet类,并对其进行配置的过程。
1.继承HttpServlet实现一个简单的Servlet
package com.meituan.longkaili;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.*;public class MyFirstServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/plain;charset=UTF-8"); resp.setHeader("Content-Disposition", "attachment; filename=test.txt"); String txt = "这是一段测试文字"; byte[] bytes = txt.getBytes("UTF-8"); OutputStream outputStream = resp.getOutputStream(); outputStream.write(bytes); outputStream.flush(); outputStream.close(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>MyFirstServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Welcome to my servlet</h2>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } @Override public String getServletInfo() { return "MyFirstServlet"; }}
为了在web容器里注册上面的Servlet,你要为你的应用建一个web.xml入口文件。这是最简化后的servlet配置了。
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <welcome-file-list> <welcome-file>MyfirstServlet</welcome-file> </welcome-file-list> <servlet> <servlet-name>MyFirstServlet</servlet-name> <servlet-class>com.meituan.longkaili.MyFirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyFirstServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping></web-app>
可以看到MyFirstServlet类继承了HttpServlet。这个继承是必须的,因为所有的Servlet必须是要么继承了 javax.servlet.GenericServlet 的普通Servlet,要么是继承了 javax.servlet.http.HttpServlet 的HTTP Servlet。
重写了doGet() 和 doPost() 方法。这两个方法都已在 HttpServlet 类里定义了。当一个GET或POST请求到来时,它就会被映射到相应的方法里。例如,如果你向这个servlet发送一个HTTP GET请求,doGet()方法就会被调用。
这里也有一些其他有用的方法。你可以重写它们来在运行时控制应用。例如getServletInfo()。
HttpServletRequest 和 HttpServletResponse 是所有doXXX()方法的默认参数。
2.Servlet生命周期方法
在你的应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件。这些事件叫做Servlet的生命周期事件(或方法)。让我们一起来进一步了解它们。
Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。
1) 在Servlet生命周期的初始化阶段,web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig 接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次。
init方法定义与这类似:
public void init() throws ServletException { //custom initialization code}
2) 初始化后,Servlet实例就可以处理客户端请求了。web容器调用Servlet的service()方法来处理每一个请求。service() 方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。编写Servlet的开发者必须为这些方法提供实现。如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。
通常,我们不需要重写(override)这个方法。下面是HttpServlet中的service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }
3) 最后,web容器调用destroy()方法来终结Servlet。如果你想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,你可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。
public void destroy() {//}
3.处理Servlet请求和响应
Servlet可以轻松创建一个基于请求和响应生命周期的web应用。它们能够提供HTTP响应并且可以使用同一段代码来处理业务逻辑。处理业务逻辑的能力使Servlet比标准的HTML代码更强大。
现实世界里的应用,一个HTML网页表单包含了要发送给Servlet的参数。Servlet会以某种方式来处理这些参数并且 返回一个客户端能够识别的响应。在对象是HttpServlet的情况下,客户端是web浏览器,响应是web页面。form的 action属性指定了使用哪个Servlet来处理表单里的参数值。
为了获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。
String value1 = req.getParameter("param1");String value1 = req.getParameter("param2");
一旦获取了参数值,它们就会在需要时被处理。对客户端的响应和我们上面部分讨论的一样。我们使用 HttpServletResponse 对象给客户端发送响应。
request和response处理的基本使用可以是这样的:
@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); boolean success = validateUser(username, password); try { // Write some content out.println("<html>"); out.println("<head>"); out.println("<title>LoginServlet</title>"); out.println("</head>"); out.println("<body>"); if(success) { out.println("<h2>Welcome Friend</h2>"); }else{ out.println("<h2>Validate your self again.</h2>"); } out.println("</body>"); out.println("</html>"); } finally { out.close(); }}
为了发送内容给客户端,你需要使用从 HttpServletResponse 里获取的 PrintWriter 对象。任何写到这个对象的内容都会被写进outputstream里,并会把内容发送回给客户端。
- 实现并配置一个简单的Servlet
- Intellij idea13配置tomcat,并实现一个简单的servlet
- 实现一个简单的Servlet容器
- 一个简单的servlet容器实现
- Servlet容器的一个简单实现
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- 一个简单的jsp+servlet实例,实现简单的登录
- ASP.NET WebApi 批量导入数据库
- note 4
- 第二次制作游戏
- 2014-2015icpc 牡丹江 B.Building Fire Stations (二分+树的直径)
- linux下Tomcat+OpenSSL配置单向&双向认证(自签CA)
- 实现并配置一个简单的Servlet
- 生成器
- Mysql安装时报'Install' for product 'MySQL Server xxx' failed
- 关于Element的textarea自适应高度
- fragment详解
- C++——操作符重载
- 用yum下载安装gcc
- 深入理解Java虚拟机(8)
- uiautomator点击不同对话框按钮--正则表达式