10- 【JavaWeb】Tomcat、Servlet基础
1. Mac OS配置Tomcat服务器教程
Mac OS配置Tomcat服务器教程
2. Servlet 基础
1. 创建 Servlet
Servlet 是一个扩展服务器功能的 Java 类,主要用于处理 HTTP 请求。以下是一个简单的 Servlet 示例:
import java.io.IOException;
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("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().write("你好,世界!");
}
}
它的作用是在接收到特定 HTTP 请求时返回一段简单的 HTML 内容。“@WebServlet(”/hello")" 注解将该 Servlet 与 URL 映射关联起来。以下是详细解释:
-
@WebServlet(“/hello”):
- 这是一个注解,用于将
HelloServlet
类映射到/hello
URL 路径。 - 当用户访问
http://<服务器地址>/hello
时,服务器会调用这个 Servlet 来处理请求。
- 这是一个注解,用于将
-
public class HelloServlet extends HttpServlet:
- 这是定义 Servlet 的类,它继承了
HttpServlet
,用于处理 HTTP 请求。 HttpServlet
是一个专门用来处理 HTTP 请求的抽象类,通常需要重写其中的doGet()
或doPost()
方法来处理请求。
- 这是定义 Servlet 的类,它继承了
-
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response):
- 这是重写
HttpServlet
类的doGet()
方法,用于处理 HTTP GET 请求。 HttpServletRequest
对象包含请求的信息,例如 URL 参数、请求头等。HttpServletResponse
对象用于构建和发送响应给客户端。
- 这是重写
-
response.setContentType(“text/html”):
- 设置响应的内容类型为 “text/html”,表示返回的是 HTML 格式的内容。
- 服务器会根据内容类型告诉浏览器如何处理返回的数据。
-
response.getWriter().write(“你好,世界!”):
- 通过
getWriter()
获取一个输出流,然后使用write()
方法将字符串内容写入响应。 - 当用户访问
/hello
时,浏览器会显示 “你好,世界!” 这段文字。
- 通过
2. 注册和使用 Servlet
在现代 Java Web 开发中,我们使用 @WebServlet
注解来注册一个 Servlet。URL 映射 (/hello
) 定义了 Servlet 响应的 URL。除了注解,还可以通过 web.xml
文件来配置。
- 注解方式(如上示例代码)
- web.xml 方式:
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
1. 标签:
- HelloServlet:定义该 Servlet 的名字。这里使用了
HelloServlet
,但可以根据需要设置其他名称。这在复杂项目中有助于区分不同的 Servlet。 - com.example.HelloServlet:指定 Servlet 的完整类名(包括包名)。这个类需要继承自
HttpServlet
,并且负责处理请求。
2. 标签:
- HelloServlet:将这个 Servlet 映射到先前定义的
HelloServlet
名字上。通过这种方式,web.xml
可以找到并正确定位 Servlet 类。 - /hello:定义了该 Servlet 对应的 URL 路径。当用户访问
/hello
时,服务器会调用com.example.HelloServlet
类来处理请求。
工作原理:
- 当用户访问
http://<服务器地址>/hello
时,服务器通过web.xml
文件找到 URL 模式/hello
对应的 Servlet。 - 服务器根据
servlet-mapping
中的servlet-name
找到对应的HelloServlet
类。 - 最终,服务器将请求交给
com.example.HelloServlet
类处理。
通过 web.xml
文件配置的方式,可以更灵活地管理和维护多个 Servlet,特别是在需要使用不同的 URL 映射时。在早期的 Java Web 应用开发中,web.xml
是主要的配置方式。
3. Servlet 接口的实现
Servlet
接口定义了三个核心的生命周期方法:
init()
: 初始化方法。service()
: 每次请求时调用。destroy()
: 在 Servlet 被销毁前执行清理操作。
大多数 Servlet 继承自 HttpServlet
,它提供了 service()
的默认实现,并将请求分派给 doGet()
、doPost()
等方法。
4. @WebServlet 注解详解
@WebServlet
用于将 Servlet 映射到特定的 URL,它支持多个参数:
@WebServlet(
name = "HelloServlet",
urlPatterns = {"/hello", "/welcome"},
loadOnStartup = 1,
initParams = {
@WebInitParam(name = "param1", value = "value1")
}
)
- name: Servlet 的可选名称。
- urlPatterns: 指定该 Servlet 的 URL 模式。
- loadOnStartup: 表示该 Servlet 的加载优先级。如果设置为 1 或更高值,则会在服务器启动时加载。
- initParams: 提供初始化参数。
5. 使用 POST 请求实现登录
以下是使用 POST 请求进行登录验证的示例:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 简单验证
if("admin".equals(username) && "password".equals(password)) {
response.sendRedirect("welcome.html");
} else {
response.sendRedirect("login.html");
}
}
}
6. 文件上传和下载
- 文件上传:Servlet 可以使用
MultipartConfig
处理多部分表单数据。
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
filePart.write("upload/" + fileName);
response.getWriter().write("文件上传成功!");
}
}
- 文件下载:
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = "example.pdf";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 读取文件并将其发送到输出流的代码
}
}
7. 使用 XHR 请求数据
下面是一个使用 XMLHttpRequest(XHR)从 Servlet 请求数据的示例。
const xhr = new XMLHttpRequest();
xhr.open("GET", "dataServlet", true);
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
};
xhr.send();
Servlet 处理 XHR 请求的示例:
@WebServlet("/dataServlet")
public class DataServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.getWriter().write("{\"message\":\"来自Servlet的数据\"}");
}
}
8. 重定向与请求转发
-
重定向:
response.sendRedirect("anotherPage.jsp");
-
请求转发:
RequestDispatcher dispatcher = request.getRequestDispatcher("anotherPage.jsp"); dispatcher.forward(request, response);
9. ServletContext
ServletContext
允许多个 Servlet 之间共享信息,并与服务器环境交互。
public class ContextServlet extends HttpServlet {
@Override
public void init() throws ServletException {
ServletContext context = getServletContext();
context.setAttribute("appName", "我的应用");
}
}
其他 Servlet 可以访问共享信息:
ServletContext context = getServletContext();
String appName = (String) context.getAttribute("appName");
10. 初始化参数
Servlet 可以通过注解或 web.xml
接收初始化参数。
-
注解示例:
@WebServlet(value = "/initServlet", initParams = { @WebInitParam(name = "dbUrl", value = "jdbc:mysql://localhost:3306/test") }) public class InitServlet extends HttpServlet { @Override public void init() { String dbUrl = getServletConfig().getInitParameter("dbUrl"); } }
-
web.xml 示例:
<servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>com.example.InitServlet</servlet-class> <init-param> <param-name>dbUrl</param-name> <param-value>jdbc:mysql://localhost:3306/test</param-value> </init-param> </servlet>