【Web】Servlet基本概念
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,具有獨立於平臺和協議的特性,主要功能在於互動式地瀏覽和生成資料,生成動態Web內容。
Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。
Servlet 三大域物件
物件型別 | 物件名稱 | 範圍 | 備註 |
---|---|---|---|
HttpServletRequest | request | 一次請求內有效 | servlet的域物件 |
HttpSession | session | 一次會話範圍內有效 | servlet的域物件 會話(開啟瀏覽器訪問伺服器,直到關閉瀏覽器) |
ServletContext | application | 整個web工程範圍內都有效 | servlet的域物件 工程(只要web工程不停止,資料都在) |
注意:只關閉標籤頁的話,session狀態是還在的。要完全關閉瀏覽器後,重新開啟才會啟用新的session。
session有自身的生命週期,如一定的時間內不再啟用的話就會過期,被伺服器登出。
Servlet 容器
servlet 容器(tomcat)中有很多 servlet 程式
Java Servlet(Java伺服器小程式)是一個基於 Java 技術的 Web 元件,執行在伺服器端,它由 Servlet 容器所管理,用於生成動態的內容,Servlet 是平臺獨立的 Java 類,編寫一個 Servlet,實際上就是按照 Servlet 規範編寫一個 Java 類。Servlet 被編譯為平臺獨立的位元組碼,可以被動態地載入到支援 Java 技術的 Web 伺服器中執行。 Servlet沒有 main() 方法,不能獨立執行,它必須被部署到 Servlet 容器中,由容器來例項化和呼叫 Servlet 的方法(如 doGet() 和 doPost()),Servlet 容器在 Servlet 的生命週期內包容和管理 Servlet。
Servlet 容器也叫做 Servlet 引擎,是 Web 伺服器或應用程式伺服器的一部分,用於在傳送的請求和響應之上提供網路服務,解碼基於 MIME 的請求,格式化基於 MIME 的響應。
Tomcat 是一個免費的開放原始碼的 Servlet 容器,目前比較流行的 Web 伺服器。
servlet 是小伺服器程式,寫後端伺服器端用的;而 JSP 是模板引擎,顯示前端用的。
其實,Tomcat 訪問任何的資源都是在訪問 Servlet!當然了,JSP 也不例外!JSP 本身就是一種 Servlet。為什麼我說 JSP 本身就是一種 Servlet 呢?其實 JSP 在第一次被訪問的時候會被編譯為 HttpJspPage 類(該類是 HttpServlet 的一個子類)
JSP 是為了簡化 Servlet 的工作出現的替代品,Servlet 輸出 HTML 非常困難,JSP 就是替代 Servlet 輸出 HTML 的。
jsp 就是在 html 裡面寫 java 程式碼,servlet 就是在 java 裡面寫 html 程式碼…其實 jsp 經過容器解釋之後就是 servlet。只是我們自己寫程式碼的時候儘量能讓它們各司其職,jsp 更注重前端顯示,servlet 更注重模型和業務邏輯。不要寫出萬能的 jsp 或 servlet 來即可。
Servlet 應用
servlet 主要就是處理頁面傳過來的表單資料,頁面上的 form 的 action 指向到 web.xml 中,然後在 XML 中對稱節點中找到對應的 servlet 類去執行你的處理方法.
servlet 中使用 HttpServletRequest 和 HttpServletResponse 來接受和返回資料
這個類要繼承一個 HttpServlet 類然後重寫他的 doGet 和 doPost 方法,一般在 doGet 裡 this.doPost(req,resp); 然後具體的程式碼在 doPost() 方法中執行。
Servlet
一個登陸的小例子,這個是 Servlet.
package com.wangchao.action;
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;
import com.wangchao.bo.AdminBO;
import com.wangchao.service.SfInfoService;
import com.wangchao.service.SfInfoServiceImpl;
public class LoginAction extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
String name = "";
String pass = "";
SfInfoService loginser;
AdminBO bo;
boolean istrun;
PrintWriter pw;
public LoginAction(){
loginser = new SfInfoServiceImpl();
bo = new AdminBO();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
name = req.getParameter("username");
pass = req.getParameter("password");
bo.setName(name);
bo.setPassword(pass);
istrun = loginser.userLogin(bo);
pw = resp.getWriter();
if(istrun){
req.setAttribute("name", name);
req.setAttribute("pass", pass);
req.getRequestDispatcher("admin/user_info.jsp").forward(req, resp);
// resp.sendRedirect("admin/MyJsp.jsp");
}else{
pw.print("<h3>使用者名稱或密碼錯誤,點選<a href='admin/index.jsp'>返回</a></h3>");
pw.flush();
}
}
}
web.xml
下面是 web.xml
在 web.xml 中配置 servlet 的對映。
要配置 servlet 的名稱以及對應的類,還有名稱以及對應的url樣式對映。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.wangchao.action.LoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
</web-app>
JSP
以下為 JSP 頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<div align="center">
<form action="login.do" method="post">
使用者名稱:<input type="text" name="username" style="color: red"><br><br>
密 碼:<input type="password" name="password" style="color: green"><br><br>
<div align="center">
<input type="submit" value="登陸"> <input type="reset" value="重填">
</div>
</form>
</div>
</body>
</html>