对servlet的简单了解

来源:互联网 发布:psvita 电池 淘宝 编辑:程序博客网 时间:2024/04/30 12:57

1.servlet的简介

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建。

2.servlet的生命周期

(1)init()方法

只被调用一次,该方法简单的创建或加载一些数据,这些数据被用于servlet的整个生命周期当中。

(2)service()方法

执行实际任务的主要方法。servlet容器调用service()方法来处理来自客户端的请求,并把格式化的响应写回给客户端。

每次服务器收到一个servlet请求时,服务器会产生一个线程调用服务,servlet检查http请求类型,并调用相应的方法(doPost、doGet、doDelete等)

public void service(ServletRequest request,ServletResponse response) throws ServletExceeption,IOException{      }

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重载 doGet() 或 doPost() 即可。

doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。

doGet()方法get请求来自于一个正常的url请求,或者来自于一个未指定method的html表单,它由doGet()方法来处理。

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{    }

doPost()方法

来自于一个指定了method为post的html表单

public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{    }

(3)destory()方法

只被调用一次,在servlet生命周期结束之后被调用,在调用该方法之后,servlet对象呗标记为垃圾回收。

3.一个简单的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 HelloWorld extends HttpServlet{/** *  */private static final long serialVersionUID = 1L;private String message;public void init() throws ServletException{message="hello world";}public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{//设置响应类型内容response.setContentType("text/html");//实际的逻辑是在这里PrintWriter writer=response.getWriter();writer.println("<h1>"+message+"</h1>");}public void destory(){}}
在web.xml文件中进行相应的配置

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>HelloWorld</servlet-name><servlet-class>HelloWorld</servlet-class></servlet><servlet-mapping><servlet-name>HelloWorld</servlet-name><url-pattern>/HelloWorld</url-pattern></servlet-mapping></web-app>
启动tomcat,在浏览器中输入地址即可得到相应的结果,如下:


4.servlet表单数据

GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示:

http://localhost:8080/servletTest/HelloWorld?city=bj&id=11223

Get 方法默认的从浏览器向web服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中,如果传递的是比较机密性的东西,请不要使用Get,,且Get方法有大小限制,请求字符串中最多只能有1024个字符。

Post方法是一个向后台传递信息的比较可靠的方法,适合用于传递一些保密性的信息。

一些常用的读取表单数据的方法

--getParameter():调用request.getParameter()方法来获取表单参数的值

--getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,如复选框

--getParameterNames():获取请求中所有参数的完整列表

下面是一个post的简单实例

<!DOCTYPE html><html><head><meta charset="utf-8"><title>简单的学习</title></head><body><form action="HelloForm" method="POST">网站:<input type="text" name="name"><br />链接:<input type="text" name="url" /><input type="submit" value="提交" /></form></body></html>
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 HelloForm extends HttpServlet {/** *  */private static final long serialVersionUID = 1L;public void init() {}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String title = "使用 POST 方法读取表单数据";//如果表单中提交的数据有中文,在这儿需要进行转码String name = new String(request.getParameter("name").getBytes("ISO8859-1"), "UTF-8");String docType = "<!DOCTYPE html> \n";out.println(docType + "<html>\n" + "<head><title>" + title+ "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n"+ "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n"+ "  <li><b>网站</b>:" + name + "\n" + "  <li><b>链接</b>:"+ request.getParameter("url") + "\n" + "</ul>\n"+ "</body></html>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
最后的展示结果如下:



5.servlet客户端http请求

下面的方法可用在 Servlet 程序中读取 HTTP 头。这些方法通过 HttpServletRequest 对象可用。

序号方法 & 描述1Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。2Enumeration getAttributeNames()
返回一个枚举,包含提供给该请求可用的属性名称。3Enumeration getHeaderNames()
返回一个枚举,包含在该请求中包含的所有的头名。4Enumeration getParameterNames()
返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。5HttpSession getSession()
返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。6HttpSession getSession(boolean create)
返回与该请求关联的当前 HttpSession,或者如果没有当前会话,且创建是真的,则返回一个新的 session 会话。7Locale getLocale()
基于 Accept-Language 头,返回客户端接受内容的首选的区域设置。8Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。9ServletInputStream getInputStream()
使用 ServletInputStream,以二进制数据形式检索请求的主体。10String getAuthType()
返回用于保护 Servlet 的身份验证方案的名称,例如,"BASIC" 或 "SSL",如果JSP没有受到保护则返回 null。11String getCharacterEncoding()
返回请求主体中使用的字符编码的名称。12String getContentType()
返回请求主体的 MIME 类型,如果不知道类型则返回 null。13String getContextPath()
返回指示请求上下文的请求 URI 部分。14String getHeader(String name)
以字符串形式返回指定的请求头的值。15String getMethod()
返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。16String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。17String getPathInfo()
当请求发出时,返回与客户端发送的 URL 相关的任何额外的路径信息。18String getProtocol()
返回请求协议的名称和版本。19String getQueryString()
返回包含在路径后的请求 URL 中的查询字符串。20String getRemoteAddr()
返回发送请求的客户端的互联网协议(IP)地址。21String getRemoteHost()
返回发送请求的客户端的完全限定名称。22String getRemoteUser()
如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。23String getRequestURI()
从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。24String getRequestedSessionId()
返回由客户端指定的 session 会话 ID。25String getServletPath()
返回调用 JSP 的请求的 URL 的一部分。26String[] getParameterValues(String name)
返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。27boolean isSecure()
返回一个布尔值,指示请求是否使用安全通道,如 HTTPS。28int getContentLength()
以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。29int getIntHeader(String name)
返回指定的请求头的值为一个 int 值。30int getServerPort()
返回接收到这个请求的端口号。获取http头的信息相关的代码如下:

import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class displayHeader extends HttpServlet {public void init() {}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String title = "HTTP Header 请求实例 ";String docType = "<!DOCTYPE html> \n";out.println(docType + "<html>\n"+ "<head><meta charset=\"utf-8\"><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 headerNames=request.getHeaderNames();while(headerNames.hasMoreElements()){String paramName=(String) headerNames.nextElement();out.print("<tr><td>" + paramName + "</td>\n");String paramValue=request.getHeader(paramName);out.println("<td> " + paramValue + "</td></tr>\n");}out.println("</table>\n</body></html>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


0 0