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