后台开发学习——Servlet
目录:
1、什么是Servlet?
2、任务:
3、生命周期:
4、我用过的一些servlet的web.xml配置:
5、Servlet表单数据:
1、什么是Servlet?
答:Servlet为创建基于web的应用程序提供了基本组件,独立于平台的方法,可以不受CGI程序的性能限制。Servlet有权访问所有的Java API,包括访问企业级数据库的jdbc API。
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
2、任务:
答:Servlet 执行以下主要任务:
读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
3、生命周期:
答:(1)初始化:init方法,init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
(2)处理客户的请求:service方法,每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。
(3)终止:destroy方法,destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
(4)在eclipse中操作:
①将web工程从IDE下面的servers按钮中加入到tomcat中
②启动tomcat
③默认时在浏览器地址栏输入:localhost:8080/工程名/Java类名查看运行结果
(5)代码示例:
Web.xml配置源代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LearnWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ServletLearn1</servlet-name>
<servlet-class>com.remoa.servlet.ServletLearn1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletLearn1</servlet-name>
<url-pattern>/ServletLearn1</url-pattern>
</servlet-mapping>
</web-app>
ServletLearn1.java源代码:
package com.remoa.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 ServletLearn1 extends HttpServlet{
private static final long serialVersionUID = 1L;
private String message;
public void init()throws ServletException{
//执行必须的初始化
message = "Hello world";
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容类型
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy(){
}
}
运行结果:
图3.1 运行结果
4、我用过的一些servlet的web.xml配置:
答:servlet元素必须出现在所有servlet-mapping元素之前。
①Servlet:在向servlet或jsp页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。
②Servlet-mapping:服务器一般为servlet提供一个缺省的URL,http://host/webAppPrefix/servlet/ServletName。但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
5、Servlet表单数据:
答:(1)get方法:get方法向页面请求已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔。
请求字符串中最多只能有1024个字符。
(2)post方法:把信息作为一个单独的消息。消息以标准输出的形式传递到后台程序,后台再进行解析。
(3)使用servlet读取表单数据:
①getParameter方法:获取表单参数的值。
②getParameterValues方法:参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
③getParameterNames方法:得到当前请求中所有参数的完整列表。
DoGet方法代码示例1:
package com.remoa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
private static final long serialVersionUID = 1L;
public HelloForm() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置相应内容类型
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String title = "使用GET方法读取表单数据";
String docType = "<!DOCTYPE HTML> \n";
out.println(docType +
"<html> \n" +
"<head><title>" + title + "</title></head>\n" +
"<body style='background-color:#F0F0F0'>\n" +
"<h1 style='text-align:center'>" + title + "</h1>\n" +
"<ul>\n" +
"<li>用户名: " +
request.getParameter("name") + "</li>\n" +
"<li>密码:" +
request.getParameter("password") + "</li>\n" +
"</ul>\n" +
"</body>\n" +
"</html>"
);
}
}
运行结果:
图5.1 截图1
DoGet方法代码示例2:
Html页面代码:
<!DOCTYPE html>
<html>
<head>
<span style="white-space:pre"> </span><meta charset="UTF-8">
<span style="white-space:pre"> </span><title>Insert title here</title>
</head>
<body>
<form action="HelloForm" method="get">
用户名:<input type="text" name="name"/>
<br />
密码:<input type="text" name="password" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
Java程序代码:
package com.remoa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
private static final long serialVersionUID = 1L;
public HelloForm() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置相应内容类型
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String title = "使用GET方法读取表单数据";
String docType = "<!DOCTYPE HTML> \n";
out.println(docType +
"<html> \n" +
"<head><title>" + title + "</title></head>\n" +
"<body style='background-color:#F0F0F0'>\n" +
"<h1 style='text-align:center'>" + title + "</h1>\n" +
"<ul>\n" +
"<li>用户名: " +
request.getParameter("name") + "</li>\n" +
"<li>密码:" +
request.getParameter("password") + "</li>\n" +
"</ul>\n" +
"</body>\n" +
"</html>"
);
}
}
运行结果:
图5.2 截图2
图5.3 截图3
DoPost方法示例:
Java代码示例:
package com.remoa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/PostTest")
public class PostTest extends HttpServlet {
private static final long serialVersionUID = 1L;
public PostTest() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String title = "Post获取表单数据";
String username = new String(request.getParameter("userName").getBytes("ISO8859-1"),"utf-8");
String doctype = "<!DOCTYPE HTML>\n";
out.println(doctype + "<html>\n" + "<head>\n" + "<title>" + title + "</title>\n" + "</head>" + "<body>\n" + "<h3>用户名:" + username +
"</h3>\n" + "<h3>密码:" + request.getParameter("password") + "</h3>\n" + "</body>\n" + "</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Html页面代码:
<!DOCTYPE html>
<html>
<head>
<span style="white-space:pre"> </span><meta charset="UTF-8">
<span style="white-space:pre"> </span><title>Insert title here</title>
</head>
<body>
<form action="PostTest" method="post">
用户名:<input type="text" name="userName" />
<br />
密码:<input type="text" name="password" />
<br />
<input type="submit" value="提交"/>
</form>
</body>
</html>
运行结果:
图5.4 截图4
图5.5 截图5
读取复选框数据代码示例:
package com.remoa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/CheckboxTest")
public class CheckboxTest extends HttpServlet {
private static final long serialVersionUID = 1L;
public CheckboxTest() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String title = "读取复选框数据";
String doctype = "<!DOCTYPE HTML>\n";
out.println(doctype + "<html>\n" + "<head>\n" + "<title>" + title + "</title>\n" + "</head>" + "<body>\n" + "<h3>计算机网络:" +
request.getParameter("net") + "</h3>\n" + "<h3>计算机组成原理:" + request.getParameter("theory") + "</h3>\n" + "<h3>计算机操作系统:"
+ request.getParameter("system") + "</h3>\n" + "</body>\n" + "</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Html页面代码:
<!DOCTYPE html>
<html>
<head>
<span style="white-space:pre"> </span><meta charset="UTF-8">
<span style="white-space:pre"> </span><title>Insert title here</title>
</head>
<body>
<form action="CheckboxTest" method="post">
请选出你最喜欢的科目:
<input type="checkbox" name="net" />计算机网络
<input type="checkbox" name="theory" />计算机组成原理
<input type="checkbox" name="system" />计算机操作系统
<input type="submit" value="提交" />
</form>
</body>
</html>
运行结果:
图5.6 截图6
图5.7 截图7
得到表单的全部数据代码示例:
package com.remoa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ReadParams")
public class ReadParams extends HttpServlet {
private static final long serialVersionUID = 1L;
public ReadParams() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String title = "得到所有表单的数据";
String doctype = "<!DOCTYPE HTML>\n";
out.println(doctype + "<html>\n" + "<head>\n" + "<title>" + title + "</title>\n" + "</head>" + "<body>\n" +
"<table style=\"border:1px solid\">" + "<tr>" + "<th>参数值</th><th>参数值</th>\n" + "</tr>\n");
Enumeration params = request.getParameterNames();
while(params.hasMoreElements()){
String paramName = (String)params.nextElement();
out.println("<tr><td>" + paramName + "</td>\n");
String[] paramValues = request.getParameterValues(paramName);
if(paramValues.length == 1){
String paramValue = paramValues[0];
if(paramValue.length() == 0){
out.println("<td>没有值</td>");
}else{
out.println("<td>" + paramValue + "</td>");
}
}else{
out.println("<td><ul>");
for(int i = 0; i < paramValues.length; i++){
out.println("<li>" + paramValues[i] + "</li>");
}
out.println("</ul></td>");
}
out.print("</tr>");
}
out.println("</table></body></html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Html代码:
<!DOCTYPE html>
<html>
<head>
<span style="white-space:pre"> </span><meta charset="UTF-8">
<span style="white-space:pre"> </span><title>Insert title here</title>
</head>
<body>
<form action="ReadParams" method="post" target="_blank">
请选出你最喜欢的科目:
<input type="checkbox" name="net" checked="checked"/>计算机网络
<input type="checkbox" name="theory" />计算机组成原理
<input type="checkbox" name="system" />计算机操作系统
<input type="checkbox" name="structure" />计算机系统结构
<input type="submit" value="提交" />
</form>
</body>
</html>
运行结果:
图5.8 截图8
图5.9 截图9