Web开发中的Servlet与脚本编程技术
立即解锁
发布时间: 2025-08-23 01:16:46 阅读量: 5 订阅数: 17 

### Web开发中的Servlet与脚本编程技术
#### 1. Servlet基础介绍
在两层Web架构中,应用程序作为Web服务器的一部分运行。一种实现这种架构的方式是将Java程序加载到Web服务器中。Java Servlet规范定义了Web服务器与应用程序之间通信的应用程序编程接口。Java中的HttpServlet类实现了Servlet API规范,用于实现特定功能的Servlet类被定义为该类的子类。通常,“Servlet”一词用于指代实现Servlet接口的Java程序(和类)。
Servlet代码在服务器启动时或服务器收到执行特定Servlet的远程HTTP请求时加载到Web服务器中。Servlet的任务是处理此类请求,这可能涉及访问数据库以检索必要信息,并动态生成HTML页面返回给客户端浏览器。
#### 2. Servlet示例
Servlets常用于为HTTP请求生成动态响应。它们可以访问通过HTML表单提供的输入,应用“业务逻辑”来决定提供何种响应,然后生成HTML输出发送回浏览器。
以下是一个Servlet代码示例,用于实现特定表单功能:
```java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PersonQueryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HEAD><TITLE> Query Result</TITLE></HEAD>");
out.println("<BODY>");
String persontype = request.getParameter("persontype");
String number = request.getParameter("name");
if(persontype.equals("student")) {
// ... code to find students with the specified name ...
// ... using JDBC to communicate with the database ..
out.println("<table BORDER COLS=3>");
out.println(" <tr> <td>ID</td> <td>Name: </td>" +
" <td>Department</td> </tr>");
for(/*... each result ...*/){
// ... retrieve ID, name and dept name
// ... into variables ID, name and deptname
out.println("<tr> <td>" + ID + "</td>" +
"<td>" + name + "</td>" +
"<td>" + deptname + "</td></tr>");
};
out.println("</table>");
}
else {
// ... as above, but for instructors ...
}
out.println("</BODY>");
out.close();
}
}
```
在这个示例中,表单指定使用HTTP get机制传输参数,因此会调用Servlet的doGet()方法。每个请求会在一个新线程中执行,表单菜单和输入字段的值以及cookie会通过为该请求创建的HttpServletRequest对象传递,而对请求的回复则通过HttpServletResponse对象传递。doGet()方法使用request.getParameter()提取参数值,并使用这些值对数据库运行查询,最后将查询结果输出到HttpServletResponse对象中。
#### 3. Servlet会话管理
浏览器与Web服务器之间的交互是无状态的,即每次浏览器向服务器发出请求时,都需要连接服务器、请求信息,然后断开连接。虽然可以使用cookie来识别请求是否来自同一浏览器会话,但cookie是一种底层机制,程序员需要更好的抽象来处理会话。
Servlet API提供了跟踪会话并存储相关信息的方法。调用HttpServletRequest类的getSession(false)方法可以检索发送请求的浏览器对应的HttpSession对象。如果参数值为true,则表示如果请求是新请求,必须创建一个新的会话对象。
当调用getSession()方法时,服务器首先要求客户端返回一个指定名称的cookie。如果客户端没有该名称的cookie,或者返回的值与任何正在进行的会话不匹配,则该请求不是正在进行的会话的一部分。在这种情况下,getSession()将返回null值,Servlet可以将用户定向到登录页面。
登录页面允许用户提供用户名和密码,对应的Servlet可以验证密码是否与用户匹配(例如,通过在数据库中查找认证信息)。如果用户通过认证,登录Servlet将执行getSession(true),返回一个新的会话对象。为了创建新会话,Web服务器会在客户端浏览器设置一个cookie(例如,名为sessionId),并将会话标识符作为关联值,创建一个新的会话对象,并将会话标识符值与会话对象关联。
Servlet代码还可以在HttpSession对象中存储和查找(属性名,值)对,以在会话内的多个请求之间保持状态。例如,用户通过认证并创建会话对象后,登录Servlet可以通过执行以下方法将会话参数存储在会话对象中:
```java
session.setAttribute("userid", userid);
```
如果请求是正在进行的会话的一部分,浏览器会返回cookie值,getSession()将返回相应的会话对象。Servlet可以通过执行以下方法从会话对象中检索会话参数:
```java
session.getAttribute("userid");
```
如果未设置属性userid,该函数将返回null值,表示客户端用户未通过认证。
#### 4. Servlet生命周期
Servlet的生命周期由部署它的Web服务器控制。当客户端请求特定的Servlet时,服务器首先检查该Servlet的实例是否存在。如果不存在,Web服务器将Servlet类加载到Java虚拟机(JVM)中,并创建Servlet类的实例。此外,服务器会调用init()方法来初始化Servlet实例。需要注意的是,每个Servlet实例在加载时只初始化一次。
确保Servlet实例存在后,服务器会调用Servlet的service方法,并将请求对象和响应对象作为参数。默认情况下,服务器会创建一个新线程来执行service方法,因此可以并行处理对Servlet的多个请求,而无需等待早期请求完成执行。service方法会根据情况调用doGet或doPost方法。
当不再需要Servlet时,可以通过调用destroy()方法将其关闭。服务器可以设置为在一段时间内没有对Servlet发出请求时自动关闭Servlet,超时时间是一个可以根据应用程序适当设置的服务器参数。
#### 5. Servlet支持的应用服务器
许多应用服务器提供对Servlet的内置支持。其中最受欢迎的是Apache Jakarta项目的Tomcat服务器。其他支持Servlet的应用服务器包括Glassfish、JBoss、BEA Webl
0
0
复制全文
相关推荐










