一、什么是servlet喘垂?
servlet是運(yùn)行在服務(wù)器端的java小程序甜刻,是sun公司提供的一套規(guī)范(接口)绍撞,主要用來(lái)處理客戶(hù)端請(qǐng)求、響應(yīng)給瀏覽器的web動(dòng)態(tài)資源得院,實(shí)質(zhì)上就是java代碼傻铣。
二、Servlet快速入門(mén):
1.創(chuàng)建一個(gè)類(lèi)MyFirstServlet實(shí)現(xiàn)Servlet接口祥绞;
2.重寫(xiě)service方法非洲;
3.配置web.xml文件
在實(shí)際開(kāi)發(fā)中,一般情況下是繼承HttpServlet類(lèi)蜕径,然后覆蓋doGet和doPost方法两踏。
package com.zl.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFirstServlet implements Servlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("This is first servlet!!!");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml配置如下:
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.zl.servlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/myFirstServlet</url-pattern>
</servlet-mapping>
三、Servlet的相關(guān)方法:
1.getServletName(): 獲得servlet的name
2.getInitParameter("參數(shù)的name"): 獲得servlet的初始化參數(shù)
3.getServletContext(): 獲得Servletcontext對(duì)象
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
//1兜喻、獲得servlet的name----<servlet-name>abc</servlet-name>
String servletName = config.getServletName();//MyFirstServlet
System.out.println(servletName);
//2梦染、獲得該servlet的初始化的參數(shù)
String initParameter = config.getInitParameter("url");
System.out.println(initParameter);
//3、獲得Servletcontext對(duì)象
ServletContext servletContext = config.getServletContext();
System.out.println(servletContext);
System.out.println("init running !!!");
}
四朴皆、Servket的生命周期:
1.Servlet接口中的方法:
(1)Init(ServletConfig config):
何時(shí)執(zhí)行:創(chuàng)建Servlet對(duì)象時(shí)執(zhí)行
ServletConfig:代表的是該Servlet對(duì)象的配置信息
(2)service(ServletRequest resquest , ServletResponse response):
何時(shí)執(zhí)行:每次請(qǐng)求都會(huì)執(zhí)行
ServletRequest: 代表請(qǐng)求帕识,封裝的是Http請(qǐng)求的信息
ServletResponse: 代表響應(yīng),封裝的是服務(wù)器響應(yīng)的信息
(3)destroy():
何時(shí)執(zhí)行:servlet對(duì)象銷(xiāo)毀的時(shí)候執(zhí)行遂铡,也就是說(shuō)服務(wù)器關(guān)閉的時(shí)候執(zhí)行
2.HttpServlet類(lèi)的方法:
(1)肮疗、init()
(2)、doGet(HttpServletRequest request,HttpServletResponse response)
(3)扒接、doPost(HttpServletRequest request,HttpServletResponse response)
(4)族吻、destroy()
3.Servlet的生命周期:
(1)Servlet何時(shí)創(chuàng)建:
默認(rèn)第一次訪(fǎng)問(wèn)servlet時(shí)創(chuàng)建該對(duì)象
(2)Servlet何時(shí)銷(xiāo)毀:
服務(wù)器關(guān)閉,servlet就銷(xiāo)毀
(3)每次訪(fǎng)問(wèn)必執(zhí)行的方法:
service(ServletResquest resquest 珠增, ServletResponse response)方法
五超歌、Servlet配置:
1.基本配置
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.zl.servlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<url-pattern>/myFirstServlet</url-pattern>
</servlet-mapping>
其中url-pattern的配置方式:
(1)完全匹配 訪(fǎng)問(wèn)的資源與配置的資源完全相同才能訪(fǎng)問(wèn)到:
<url-pattern>/myFirstServlet</url-pattern>
(2)目錄匹配 格式:/虛擬的目錄../* *代表任意:
<url-pattern>/aaa/bbb/ccc/*</url-pattern>
(3)擴(kuò)展名匹配 格式:*.擴(kuò)展名:
<url-pattern>/*.abcd</url-pattern>
2.服務(wù)器啟動(dòng)實(shí)例化配置:
Servlet何時(shí)創(chuàng)建:默認(rèn)第一次訪(fǎng)問(wèn)時(shí)創(chuàng)建
為什么是默認(rèn)?
當(dāng)配置servlet時(shí)加上<load-on-startup>
時(shí),servlet對(duì)象就在服務(wù)器啟東市創(chuàng)建蒂教。
<load-on-startup>3</load-on-startup>
3.缺省的Servlet:
可以將url-pattern配置一個(gè)/巍举,代表該servlet是缺省的servlet。
什么是缺省的servlet凝垛?
當(dāng)你訪(fǎng)問(wèn)資源地址所有的servlet都不匹配時(shí) 懊悯, 缺省的servlet負(fù)責(zé)處理
4.歡迎頁(yè)面:
<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>
六、案例:用戶(hù)登錄
1.首先準(zhǔn)備一個(gè)login.html
頁(yè)面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/WEB13A/login" method="post">
用戶(hù)名:<input type="text" name="username"><br />
密碼:<input type="password" name="password"><br />
<input type="submit" value="登錄"><br />
</form>
</body>
</html>
2.然后編寫(xiě)LoginServlet
類(lèi):
package com.zl.login;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.zl.domain.User;
import com.zl.utils.DataSourceUtils;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.獲取用戶(hù)名和密碼
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.從數(shù)據(jù)庫(kù)中驗(yàn)證該用戶(hù)名密碼是否正確
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from user where username=? and password=?";
User user =null;
try {
user = qr.query(sql, new BeanHandler<User>(User.class), username,password);
} catch (SQLException e) {
e.printStackTrace();
}
//3梦皮、根據(jù)返回的結(jié)果給用戶(hù)不同顯示信息
if(user!=null){
//登錄成功
response.getWriter().write(user.toString());
}else{
//登錄失敗
response.getWriter().write("username or password error!!!");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.寫(xiě)一個(gè)User
實(shí)體類(lèi):
package com.zl.domain;
public class User {
private int id;
private String username;
private String password;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + "]";
}
}
4.在WebContent下的WEB-INF下的lib文件夾導(dǎo)入三個(gè)包:
5.在src根目錄下導(dǎo)入c3p0配置文件:
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">a12345</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web13</property>
</default-config>
</c3p0-config>
其中炭分,web13是數(shù)據(jù)庫(kù)名稱(chēng)。
6.編寫(xiě)DataSourceUtils
類(lèi):
package com.zl.utils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DataSourceUtils {
private static DataSource dataSource = new ComboPooledDataSource();
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
// 直接可以獲取一個(gè)連接池
public static DataSource getDataSource() {
return dataSource;
}
// 獲取連接對(duì)象
public static Connection getConnection() throws SQLException {
Connection con = tl.get();
if (con == null) {
con = dataSource.getConnection();
tl.set(con);
}
return con;
}
// 開(kāi)啟事務(wù)
public static void startTransaction() throws SQLException {
Connection con = getConnection();
if (con != null) {
con.setAutoCommit(false);
}
}
// 事務(wù)回滾
public static void rollback() throws SQLException {
Connection con = getConnection();
if (con != null) {
con.rollback();
}
}
// 提交并且 關(guān)閉資源及從ThreadLocall中釋放
public static void commitAndRelease() throws SQLException {
Connection con = getConnection();
if (con != null) {
con.commit(); // 事務(wù)提交
con.close();// 關(guān)閉資源
tl.remove();// 從線(xiàn)程綁定中移除
}
}
// 關(guān)閉資源方法
public static void closeConnection() throws SQLException {
Connection con = getConnection();
if (con != null) {
con.close();
}
}
public static void closeStatement(Statement st) throws SQLException {
if (st != null) {
st.close();
}
}
public static void closeResultSet(ResultSet rs) throws SQLException {
if (rs != null) {
rs.close();
}
}
}
整體目錄結(jié)構(gòu)如下:
七剑肯、ServletContext:
1.什么是ServletContext捧毛?
ServletContext代表是一個(gè)web應(yīng)用的環(huán)境(上下文)對(duì)象,ServletContext對(duì)象內(nèi)部封裝是該web應(yīng)用的信息,一個(gè)web應(yīng)用只有一個(gè)ServletContext對(duì)象呀忧。
2.ServletContext對(duì)象的生命周期师痕?
創(chuàng)建:該web應(yīng)用被加載(服務(wù)器啟動(dòng)或發(fā)布web應(yīng)用(前提,服務(wù)器啟動(dòng)狀 態(tài)))
銷(xiāo)毀:web應(yīng)用被卸載(服務(wù)器關(guān)閉而账,移除該web應(yīng)用)
3.獲得web應(yīng)用的初始化參數(shù):
首先在web.xml配置<context-param>
:
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
通過(guò)context獲得參數(shù):
//獲取servletcontex對(duì)象
ServletContext context = this.getServletContext();
//1胰坟、獲得初始化參數(shù)
String initParameter = context.getInitParameter("driver");
System.out.println(initParameter);
4.獲得web應(yīng)用中任何資源的絕對(duì)路徑:
方法:String path = context.getRealPath(相對(duì)于該web應(yīng)用的相對(duì)地址);
a.txt
在WebContent
下,b.txt
在WEB-INF
下泞辐,c.txt
在src
下笔横,d.txt
在WEB13A
下。
//2咐吼、獲得a b c d.txt的絕對(duì)路徑
//2.1 獲得a.txt
String realPath_A = context.getRealPath("a.txt");
System.out.println(realPath_A);
//2.2 獲得b.txt
String realPath_B = context.getRealPath("WEB-INF/b.txt");
System.out.println(realPath_B);
//2.3 獲得c.txt
String realPath_C = context.getRealPath("WEB-INF/classes/c.txt");
System.out.println(realPath_C);
//2.4 獲得d.txt----獲取不到
//在讀取src(classes) 下的資源是可以同類(lèi)加載器----專(zhuān)門(mén)加載classes 下的文件的
//getResource() 參數(shù)是一個(gè)相對(duì)地址 相對(duì)classes
String path = ContextServlet.class.getClassLoader().getResource("c.txt").getPath();
System.out.println(path);
5.ServletContext是一個(gè)域?qū)ο?
什么是域?qū)ο蟠档蓿渴裁词怯颍?br>
存儲(chǔ)數(shù)據(jù)的區(qū)域就是域?qū)ο?/p>
ServletContext域?qū)ο蟮淖饔梅秶赫麄€(gè)web應(yīng)用(所有的web資源都可以隨意向servletcontext域中存取數(shù)據(jù),數(shù)據(jù)可以共享)
域?qū)ο蟮耐ㄓ玫姆椒ǎ?/p>
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
案例:統(tǒng)計(jì)登錄次數(shù):
package com.itheima.login;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.itheima.domain.User;
import com.itheima.utils.DataSourceUtils;
public class LoginServlet extends HttpServlet {
@Override
public void init() throws ServletException {
//在Seveltcontext域中存一個(gè)數(shù)據(jù)count
int count = 0;
this.getServletContext().setAttribute("count", count);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//username=zhangsan&password=123
//1汽烦、獲得用戶(hù)名和密碼
String username = request.getParameter("username");
String password = request.getParameter("password");
//2涛菠、從數(shù)據(jù)庫(kù)中驗(yàn)證該用戶(hù)名和密碼是否正確
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where username=? and password=?";
User user = null;
try {
user = runner.query(sql, new BeanHandler<User>(User.class), username,password);
} catch (SQLException e) {
e.printStackTrace();
}
//3、根據(jù)返回的結(jié)果給用戶(hù)不同顯示信息
if(user!=null){
//從servletcontext中取出count進(jìn)行++運(yùn)算
ServletContext context = this.getServletContext();
Integer count = (Integer) context.getAttribute("count");
count++;
//用戶(hù)登錄成功
response.getWriter().write(user.toString()+"---you are success login person :"+count);
context.setAttribute("count", count);
}else{
//用戶(hù)登錄失敗
response.getWriter().write("sorry your username or password is wrong");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Servlet模板:
package ${enclosing_package};
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 ${primary_type_name} extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello haohao...");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}