目录
servlet的部署、创建与运行
JSP(Java Server Pages)和Servlet是Java Web开发中常用的技术,下面介绍它们的部署、创建与运行。
部署:
1. 安装Java环境:在部署JSP和Servlet之前,需要先安装Java环境。
2. 安装Web服务器:JSP和Servlet需要运行在Web服务器上,常用的Web服务器有Tomcat、Jetty、WebLogic等。
3. 部署应用程序:将编写好的JSP和Servlet程序打包成war包,然后将war包放到Web服务器的webapps目录下,Web服务器会自动解压并启动应用程序。
创建:
1. 创建JSP文件:使用文本编辑器或IDE工具创建JSP文件,并编写JSP代码。
2. 创建Servlet类:使用文本编辑器或IDE工具创建Servlet类,并编写Servlet代码。
3. 配置web.xml文件:将JSP和Servlet类配置到web.xml文件中,以便Web服务器能够正确地加载和运行它们。
运行:
1. 启动Web服务器:启动Web服务器,访问应用程序的URL地址。
2. 请求JSP页面:在浏览器中输入JSP页面的URL地址,Web服务器会将JSP页面编译成Servlet并执行。
3. 请求Servlet:在JSP页面中使用表单或超链接等方式请求Servlet,Web服务器会调用Servlet类中的doGet或doPost方法处理请求,并返回处理结果。
servlet的工作原理
Servlet是Java编写的服务器端程序,用于处理客户端的HTTP请求并生成相应的HTTP响应。下面是Servlet的工作原理:
1. 客户端发送HTTP请求到Web服务器。
2. Web服务器接收到请求后,将其转发给Servlet容器(例如Tomcat)。
3. Servlet容器根据请求的URL映射找到对应的Servlet。
4. 如果Servlet对象尚未实例化,容器会创建Servlet实例并调用其`init()`方法进行初始化。
5. 一旦Servlet实例化并初始化完成,容器会调用`service()`方法,将HTTP请求和响应对象作为参数传递给该方法。
6. 在`service()`方法中,Servlet可以根据请求的类型(GET、POST等)执行相应的逻辑处理。
7. Servlet可以通过HTTP请求对象(`HttpServletRequest`)获取请求的参数、头信息等,并通过HTTP响应对象(`HttpServletResponse`)生成响应内容。
8. Servlet可以访问数据库、调用其他Java类等进行更复杂的业务逻辑处理。
9. 处理完成后,Servlet将生成的HTTP响应发送回Web服务器。
10. Web服务器将HTTP响应发送给客户端浏览器,展示在用户界面上。
需要注意的是,Servlet是多线程的,容器可能会为每个请求创建一个新的线程来处理,以便同时处理多个请求。此外,Servlet还具有生命周期方法(`init()`、`service()`、`destroy()`),可以在初始化和销毁阶段执行特定的操作。
servlet 对象的生命周期
servlet由Tomcat服务器负责创建并完成初始化工作。当多个用户请求一个servlet时,服务器为每个用户启动一个线程。
一个servlet的生命周期主要有下列三个过程组成:
(1) servlet第一次被请求加载时,服务器创建servlet,servlet调用init方法完成必要的初始化工作。
(2) 新诞生的servlet再调用service方法响应用户的请求。
(3) 当服务器关闭时,调用destroy方法销毁servlet。
init方法只被调用一次。当后续的用户请求servlet服务时,Tomcat服务器将启动一个新的线程,在该线程中,servlet调用service方法。也就是说,每个用户的每次请求都导致service方法被调用执行,其执行过程分别运行在不同的线程中。
通过JSP页面访问servlet
通过JSP页面访问Servlet是一种常见的Java Web开发模式。以下是通过JSP页面访问Servlet的基本步骤:1. 创建一个Servlet类:首先,您需要创建一个继承自javax.servlet.http.HttpServlet的Java类,该类将处理与JSP页面的交互。确保在类中重写doGet()或doPost()方法,以处理来自JSP页面的请求。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 处理GET请求的逻辑
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 处理POST请求的逻辑
}
}
2. 配置web.xml文件:接下来,您需要在web.xml文件中配置Servlet类和URL映射。打开位于您的Web应用程序的WEB-INF目录下的web.xml文件,并添加以下代码:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
这将把URL模式"/servlet"映射到名为"MyServlet"的Servlet类。
3. 创建一个JSP页面:现在,您可以创建一个JSP页面,它将包含与Servlet的交互逻辑。在Web应用程序的Web内容目录中创建一个新的JSP文件,例如index.jsp,并添加以下代码:
<html>
<body>
<form action="servlet" method="post">
<!-- 在这里添加表单元素和其他内容 -->
<input type="submit" value="Submit">
</form>
</body>
</html>
此JSP页面包含一个表单,其中的action属性设置为"servlet",这与web.xml文件中的URL模式相匹配。
-
启动Web服务器:将您的Web应用程序部署到一个Java Web服务器,例如Apache Tomcat。
-
访问JSP页面:启动Web服务器后,在浏览器中访问您的JSP页面。您可以通过URL直接访问该页面,例如:http://localhost:8080/yourwebapp/index.jsp。
-
提交表单:当您在JSP页面上填写表单并点击"Submit"按钮时,表单数据将被提交到指定的Servlet。Servlet将处理请求并返回响应。
共享变量
Servlet类是HttpServlet的一个子类,在编写子类时就可以声明某些成员变量,那么,请求servlet的用户将共享该servlet的成员变量。
■service方法可能被多次的调用。也就是说,当后续的用户请求该servlet时,Tomcat服务器将启动一个新的线程,在该线程中servlet调用service方法响应用户的请求,即每个用户的请求都导致service方法被调用执行,调用过程运行在不同的线程中,互不干扰。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他线程的service方法中的局部变量。
doPost和doGet方法
在JSP页面中,您可以使用<form>
元素将数据提交到服务器。当提交表单时,可以选择使用POST方法或GET方法。在JSP中,可以使用以下方法处理POST和GET请求:
1.doPost()方法:当使用POST方法提交表单时,服务器会调用JSP页面中的doPost()方法来处理请求。在该方法中,您可以获取表单数据、执行相应的操作,并生成响应。以下是一个示例:
<%@ page language="java" %>
<%@ page import="java.io.*, java.util.*" %>
<%@ page import="javax.servlet.*, javax.servlet.http.*" %>
<% // 设置响应的内容类型
response.setContentType("text/html"); // 获取表单数据
String username = request.getParameter("username"); String password = request.getParameter("password");
// 执行其他操作,例如验证用户信息、处理数据等
// 生成响应
PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("Welcome, " + username + "!");
out.println("</body>"); out.println("</html>");
%>
2.doGet()方法:当使用GET方法提交表单或直接访问JSP页面时,服务器会调用JSP页面中的doGet()方法来处理请求。在该方法中,您可以执行相应的操作,并生成响应。以下是一个示例:
<%@ page language="java" %> <%@ page import="java.io.*, java.util.*" %>
<%@ page import="javax.servlet.*, javax.servlet.http.*" %>
<% // 设置响应的内容类型
response.setContentType("text/html");
// 执行其他操作,例如处理数据等 // 生成响应
PrintWriter out = response.getWriter(); out.println("<html>");
out.println("<body>"); out.println("Hello, World!");
out.println("</body>"); out.println("</html>");
%>
在上述示例中,无论使用POST还是GET方法提交表单,服务器都会调用相应的方法来处理请求。您可以根据需要在doPost()和doGet()方法中编写逻辑来处理请求和生成响应。
重定向与转发
1.sendRedirect方法
重定向方法void sendRedirect(String location)
将用户重新定向到另一个JSP页面或servlet。重定向方法仅仅是将用户从当前页面或servlet定向到另一个JSP页面或servlet,但不能将用户对当前页面或servlet的请求(HttpServletRequest对象)转发给所定向的资源。即重定向的目标页面或servlet无法使用request获取用户提交的数据。
执行sendRedirect方法(重定向,也见4.2.3)时,Tomcat服务器还是要把当前的servlet代码执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前servlet代码的执行效果。如果在执行sendRedirect(URL url)方法后,servlet紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前servlet的执行。
2.forward方法
⑴
RequestDispatcher dispatcher =
request.getRequestDispatcher(JSP页面的URL或servlet的url-pattern);
例如:
RequestDispatcher dispatcher = request.getRequestDispatcher("target.jsp");
⑵ 转发。在步骤(1)中获取的RequestDispatcher对象调用
void forward(ServletRequest request,ServletResponse response) throws ServletException,ava.io.IOException
方法可以将用户对当前JSP页面或servlet的请求转发给RequestDispatcher对象所指定的JSP页面或servlet,例如:
dispatcher.forward (request,response);
把用户对当前JSP页面或servlet的请求转变为对转发到的JSP页面或servlet的请求。
RequestDispatcher对象可以把用户对当前JSP页面或servlet的请求转发给另一个JSP页面或servlet,而且将用户对当前JSP页面或servlet的请求传递给转发到的JSP页面或servlet。也就是说,当前页面所转发到的标页面或servlet可以使用request获取用户提交的数据。
使用session
在JSP中,您可以使用`session`对象来管理会话数据,以便在不同的页面之间共享和保持用户信息。以下是在JSP中使用`session`对象的示例:
1. 在JSP页面中获取`session`对象:
<%@ page session="true" %>
通过上述指令,您可以启用`session`对象,并在JSP页面中使用它。2. 在JSP页面中设置和获取`session`属性:
<%
// 设置session属性
session.setAttribute("username", "John");
// 获取session属性
String username = (String) session.getAttribute("username");
%>
在上述示例中,我们使用`session.setAttribute()`方法设置了一个名为`username`的属性,并将其值设置为"John"。然后,我们使用`session.getAttribute()`方法获取该属性的值。
3. 在JSP页面中销毁`session`:
<%
// 销毁session
session.invalidate();
%>
通过调用`session.invalidate()`方法,您可以销毁当前会话,从而清除所有会话数据。在JSP中,`session`对象是一个`HttpSession`类型的对象,它提供了一些其他有用的方法来管理会话数据。您可以使用这些方法来获取会话ID、设置会话超时时间、移除属性等。以下是一些示例:
<%
// 获取会话ID
String sessionId = session.getId();
// 设置会话超时时间(以秒为单位)
session.setMaxInactiveInterval(1800); // 设置为30分钟
// 移除session属性
session.removeAttribute("username");
%>
通过上述方法,您可以在JSP页面中使用`session`对象来管理会话数据,使其在不同的页面之间共享和保持。