1.ServletConfig
package com.hxuner.web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
ServletConfig
代表當前Servlet在web.xml中的配置信息
1.概念:
當web容器加載一個Servlet的類時,會掃描web.xml中對該Servlet的配置,創建一個ServletConfig對象,封裝這些配置信息,
並在調用該Servlet實例的init()方法時,將ServletConfig對象傳入.
2.獲取ServletConfig對象:
Servlet接口定義了5個抽象方法,其中2個方法:
init(ServletConfig config) getServletConfig()
GenericServlet對這兩個方法提供了實現:
1. GenericServlet聲明瞭一個實例成員 ServletConfig config
2. GenericServlet實現了init(ServletConfig config){ this.config=config;},使用方法傳入的config對象給自己的實例成員賦值
3. GenericServlet實現了getServletConfig(){return this.config}, 返回自身的實例成員config
3.用途:獲取web.xml中該Servlet配置的初始化參數
注意:這樣配置的初始化參數,僅對當前Servlet有效
3.1配置當前Servlet
web.xml
<servlet>
<!--配置當前Servlet的初始化參數 ServletConfig -->
<init-param>
<param-name>name</param-name>
<param-value>張三</param-value>
</init-param>
</servlet>
注意:如果有多個初始化參數,可添加多對<init-param>
3.2獲取ServletConfig對象
this.getServletConfig()
3.3通過Servletconfig對象獲取初始化參數
.getInitParameter("參數名")
*/
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletConfig01
public class ServletConfig01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//request請求亂碼-Post
request.setCharacterEncoding("utf-8");
//response應答亂碼-不管字符還是字節流
response.setContentType("text/html;charset=utf-8");
//1.獲取ServletConfig對象,該對象代表了當前Servlet在web.xml的配置信息
//this.getServletConfig();
ServletConfig config=this.getServletConfig();
//2.通過config對象獲取初始化參數
//.getInitParameter()
String namevalue=config.getInitParameter("name");
String agevalue=config.getInitParameter("age");
//需求:每次用戶訪問時,返回今天值班的人的姓名
response.getWriter().write("今天是"+namevalue+"值班,他的年齡是"+agevalue);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.hxuner.web;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
ServletConfig
代表當前Servlet在web.xml中的配置信息
1.概念:
當web容器加載一個Servlet的類時,會掃描web.xml中對該Servlet的配置,創建一個ServletConfig對象,封裝這些配置信息,
並在調用該Servlet實例的init()方法時,將ServletConfig對象傳入.
2.獲取ServletConfig對象:
Servlet接口定義了5個抽象方法,其中2個方法:
init(ServletConfig config) getServletConfig()
GenericServlet對這兩個方法提供了實現:
1. GenericServlet聲明瞭一個實例成員 ServletConfig config
2. GenericServlet實現了init(ServletConfig config){ this.config=config;},使用方法傳入的config對象給自己的實例成員賦值
3. GenericServlet實現了getServletConfig(){return this.config}, 返回自身的實例成員config
3.用途:獲取web.xml中該Servlet配置的初始化參數
注意:這樣配置的初始化參數,僅對當前Servlet有效
3.1配置當前Servlet
web.xml
<servlet>
<!--配置當前Servlet的初始化參數 ServletConfig -->
<init-param>
<param-name>name</param-name>
<param-value>張三</param-value>
</init-param>
</servlet>
注意:如果有多個初始化參數,可添加多對<init-param>
3.2獲取ServletConfig對象
this.getServletConfig()
3.3通過Servletconfig對象獲取初始化參數
.getInitParameter("參數名")
*/
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletConfig01
public class ServletConfig01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//request請求亂碼-Post
request.setCharacterEncoding("utf-8");
//response應答亂碼-不管字符還是字節流
response.setContentType("text/html;charset=utf-8");
//1.獲取ServletConfig對象,該對象代表了當前Servlet在web.xml的配置信息
//this.getServletConfig();
ServletConfig config=this.getServletConfig();
//2.通過config對象獲取初始化參數
//.getInitParameter()
String namevalue=config.getInitParameter("name");
String agevalue=config.getInitParameter("age");
//需求:每次用戶訪問時,返回今天值班的人的姓名
response.getWriter().write("今天是"+namevalue+"值班,他的年齡是"+agevalue);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.ServletContext
package com.hxuner.web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
需求:
需要在web.xml中配置一個變量,可以在整個web應用中所有組件中,都能訪問到該變量,比如整個項目使用的字符集
ServletConfig做不到
解決:
ServletContext不適合存放每個用戶特有的數據,適合存放通用的數據,比如全局的字符編碼
問題:ServletContext作用域是否可以替代request作用域
----------------------?????----------------------------
*/
/*
* ServletContext
每一個web應用加載完成後都會創建一個ServletContext對象唯一代表該web應用
1.概念:
作用範圍:
整個web應用
生命週期:
當服務器啓動web應用加載後立即創建代表這個web應用的ServletContext對象,一直駐留在內存中,唯一的代表這個web應用;
直到服務器關閉或web應用被移除出容器時,隨着web應用的銷燬,ServletContext對象銷燬。
2.獲取ServletContext
2.1this.getServletContext()
->GenericServlet提供的方法,方法內部其實是調用了下面這個方法
2.2this.getServletConfig().getServletContext()
->通過ServletConfig對象獲取ServletContext對象
3.ServletContext作用
---------------ServletContext作用1:獲取web應用的初始化參數----------------
1.配置當前web應用
<context-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</context-param>
<servlet>
</servlet>
2.獲取ServletContext對象
this.getServletContext();
this.getServletConfig().getServletContext();
3.通過ServletContext獲取初始化信息
.getInitParameter("參數名")
*/
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext01
public class ServletContext01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1獲取ServletContext的API
//1.1GenericServlet中提供了便捷的getServletContext()
ServletContext sc1=this.getServletContext(); //內部其實是this.getServletConfig().getServletContext();
//1.2在ServletConfig對象身上提供了getServletContext()方法可以用來獲取ServletContext對象。
ServletContext sc2=this.getServletConfig().getServletContext();
System.out.println(sc1==sc2); //輸入true,兩種方法獲取的ServletContext是同一個
//2.獲取初始化信息 getInitParameter("encode")
String code=sc1.getInitParameter("encode");
System.out.println(code);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.hxuner.web;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//---------------ServletContent作用2:作爲作用域對象----------------
/*
1.ServletContext作用域也稱爲application作用域
2.作用範圍:
整個web應用
生命週期:
當服務器啓動web應用加載後立即創建代表這個web應用的ServletContext對象,一直駐留在內存中,唯一的代表這個web應用;
直到服務器關閉或web應用被移除出容器時,隨着web應用的銷燬,ServletContext對象銷燬。
3.作用
共享一些通用的配置
4.API
與其他作用域的api是一致的
*/
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext02
public class ServletContext02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* -------------------獲取總的訪問次數---------------------------------------
//獲取存儲在ServletContext作用域中的count變量
Integer count=(Integer) this.getServletContext().getAttribute("count"); //第一次訪問可能是null,int包裝類對象Integer是對象可以是null,而int不能爲null
if(count==null){ //第一次訪問
count=1;
}else{
count++; //訪問次數加+1
}
System.out.println("訪問次數count="+count);
//將新的count變量存入ServletContext作用域
this.getServletContext().setAttribute("count", count);
*/
//-----------------獲取ServletContext作用域中所有變量的name--------------------------
// 獲取ServletContext作用域中所有變量的name
Enumeration<String> names=this.getServletContext().getAttributeNames();
// 遍歷輸出ServletContext作用域中所有的鍵值對
while(names.hasMoreElements()){
String name=names.nextElement();
System.out.println("name="+name+",value="+this.getServletContext().getAttribute(name));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.hxuner.web;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//---------------ServletContent作用3:獲取一個文件的真實路徑----------------
/*
*
*/
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext03
public class ServletContext03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//希望獲取配置文件config.xml的絕對路徑
/*
* 路徑難問題:
在web環境中讀取資源時,如果寫的是相對路徑,則在tomcat/bin目錄下尋找資源。
如果寫的是絕對路徑,則在tomcat所在目錄的根目錄下尋找資源。
如果寫的是盤符開始的絕對路徑可以正確找到資源,但是一旦改變了發佈環境路徑很可能是錯的。
我們發現無論怎麼寫路徑都有問題。
*/
//如果寫的是絕對路徑,則在tomcat所在目錄的根目錄下尋找資源
File file1=new File("/config.xml");
System.out.println(file1.getAbsolutePath()); //輸出E:\config.xml
//如果寫的是相對路徑,則在tomcat/bin目錄下尋找資源。
File file2=new File("config.xml");
System.out.println(file2.getAbsolutePath()); //輸出E:\ChenXun\Tomcat\tomcat7\bin\config.xml
//-------------ServletContext獲取資源的絕對路徑---------------------------------------
/*
ServletContext.getRealPath("xxxx");
這個方法會在傳入的路徑前拼接當前web應用的硬盤路徑,從而拼接出資源的硬盤路徑,從而可以找到資源。
這種方式沒有將web應用的硬盤路徑寫死,所以即使換了一個發佈環境,路徑也是正確的
*/
ServletContext sc=this.getServletContext();
//返回一個文件的絕對路徑,方法參數中param傳入的路徑是相對於WebRoot根目錄的路徑
String path=sc.getRealPath("/WEB-INF/classes/config.xml"); //例如src文件夾下放了一個config.xml
//該文件在MyEclipse部署應用時,會被放入classPath下
//web應用的classpath實際上指的是WEB-INF/classes
//因此獲取該文件的絕對路徑-sc.getRealPath("/WEB-INF/classes/config.xml")
System.out.println(path); //輸出E:\ChenXun\Tomcat\tomcat7\webapps\day011JavaWebServlet_Ajax\WEB-INF\classes\config.xml
//----------------補充:沒有ServletContext的情況下,通過classloader獲取資源的絕對路徑-----------------
/*
可以通過類加載器ClassLoader去獲取 this.getClass().getClassLoader();
classLoader.getResouce("資源名稱").getPath(), 該方法默認從classpath下開始尋找->web應用默認是WEB-INF/classes
*/
//通過當前對象獲取classloader對象
ClassLoader loader=this.getClass().getClassLoader();
//getResource()方法可以根據資源的名稱找到對應的資源
//是從classpath下去找對應的資源,web應用默認是WEB-INF/classes
String path2=loader.getResource("config.xml").getPath();
System.out.println(path2); //輸出/E:/ChenXun/Tomcat/tomcat7/webapps/day011JavaWebServlet_Ajax/WEB-INF/classes/config.xml
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.AJAX
package com.hxuner.web;
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 AJAX extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
AJAX 異步JS And XML
1.概念:
通過1.瀏覽器實現異步請求+2.應答結果局部刷新的解決方案
通過js來實現發送異步請求,接收應答內容,將應答內容通過局部刷新的方式在瀏覽器上顯示
xml用來承載應答返回的結構化的數據. 目前這一功能在逐步被json取代 異步JS And Json->AJAJ->AJ
2.同步請求和異步請求
2.1同步請求:當瀏覽器發出一次請求後,在收到服務器的應答之前,瀏覽器處於阻塞狀態,不能進行任何的操作
2.2異步請求:當發送一次請求後,瀏覽器可以繼續操作,甚至再次發送多個請求
優勢:1. 增加了用戶體驗
2. 由於可以實現局部刷新,所以服務器只需要返回一部分內容即可,降低了服務器應答的帶寬壓力
劣勢:1. 用戶可能發送多次請求,增加了服務器響應用戶請求的壓力
2. 不是所有的場景都適用,比如支付時,就必須使用同步請求
3.基於javaScript實現AJAX請求(瞭解)4步
3.1 獲取XMLHttpRequest對象
var xmlHttp = ajaxFunction();
3.2.建立連接
xmlHttp.open(method, url, async);
method: 請求方式, 可以是GET或POST
url: 所要訪問的服務器中資源的路徑 如: /Day10/servlet/AServlet
async: 是否爲異步傳輸, true 表示爲異步傳輸 一般都是true
xmlHttp.open("POST", "${ pageContext.request.contextPath }/servlet/AjaxTestServlet", false);
3.3發送請求
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //通知服務器發送的數據是請求參數
xmlHttp.send("i="+(++i)); //注意, 如果不給參數可能會造成部分瀏覽器無法發送請求
> 參數:
如果是GET請求, 可以是null, 因爲GET提交參數會拼接在url後面
如果是POST請求, 傳入的就是請求參數 "username=張飛&psw=123"
3.4註冊監聽
>在XMLHttpRequest對象的一個事件上註冊監聽器:
onreadystatechange
一共有五個狀態:(xmlHttp.readyState)
0狀態: 表示剛創建XMLHttpRequest對象, 還未調用open()方法
1狀態: 表示剛調用open()方法, 但是還沒有調用send()方法發送請求
2狀態: 調用完了send()方法了, 請求已經開始
3狀態: 服務器已經開始響應, 但是不代表響應結束
4狀態: 服務器響應結束!(通常我們只關心這個狀態)
> 獲取xmlHttp對象的狀態:
var state = xmlHttp.readyState;//可能得到0, 1, 2, 3, 4
> 獲取服務器響應的狀態碼
var status = xmlHttp.status;
> 獲取服務器響應的內容
var data = xmlHttp.responseText;//得到服務器響應的文本格式的數據
xmlHttp.onreadystatechange = function(){
//當服務器已經處理完請求之後
if(xmlHttp.readyState == 4){
if( xmlHttp.status == 200 ){
//獲取響應數據
var result = xmlHttp.responseText;
result = xmlHttp.responseXML;
}
}
}
xmlHttp.onreadystatechange = function(){
//時刻監聽服務器處理請求的過程(狀態), 但是我們只關心爲4的狀態
if(xmlHttp.readyState == 4){
//如果請求處理成功了才獲取響應結果
if(xmlHttp.status == 200){
//獲取響應結果
var result = xmlHttp.responseText;
if(result == "true"){
setMsg("username", "用戶名已存在");
}else{
setMsg("username", "恭喜, 用戶名可以使用");
}
}
}
}
4.jQuery實現AJAX
4.1 load方法
$(selector).load(url,data,callback);
selector -- 選擇器, 將從服務器獲取到的數據加載到指定的元素中
url -- 發送請求的URL地址
data -- 可選, 向服務器發送的數據 key/value數據 如:{"username" : "張飛", "psw" : "123"}
callback -- 可選, load方法完成後所執行的函數
示例:
$("#username_msg").load("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username});
特點1:如果添加data,就是post請求,不加data,就是get請求
特點2:服務器返回的數據會直接添加到selector選擇的組件內部
4.2 $.get方法
$.get(url, [data], [callback]);
url -- 發送請求的URL地址
data -- 可選, 向服務器發送的數據
callback -- 可選, 請求成功後所執行的函數
示例:
$.get("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username}, function(result){
$("#username_msg").html("<font style='color:red'>"+result+"</font>");
});
4.3 $.ajax方法
$.ajax(url, [data], [async], [callback]);
url -- 發送請求的URL地址
data -- 可選, 發送至服務器的key/value數據
async -- 可選, 默認爲true, 表示異步交互
type -- 可選, 請求方式 , 默認爲"GET"。
success -- 可選, 請求成功後執行的函數, 函數參數:
result -- 服務器返回的數據
示例:
$.ajax({
"url" : "<%= request.getContextPath() %>/AjaxCheckUsernameServlet",
"data" : {"username": username},
"async" : true,
"type" : "POST",
"success" : function(result){
$("#username_msg").html("<font style='color:red'>"+result+"</font>")
}
});
*/
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
//爲username輸入框添加輸入鼠標焦點的事件
$("input[name='username']").blur(function(){
//執行非空驗證
var flag=formObj.checkNull("username","用戶名不能爲空");
//flag爲true,說明用戶名不爲空,執行AJAX請求
if(flag){
var url="/AjaxCheckUsernameServlet";
//獲取當前input框中的值
var name=$(this).val();
//1.$(selector).load 會將返回的內容直接添加到選擇器
//$(selector).load(url,data,callback);
/*
$(selector).load(url,data,callback);
selector -- 選擇器, 將從服務器獲取到的數據加載到指定的元素中
url -- 發送請求的URL地址
data -- 可選, 向服務器發送的數據 key/value數據 如:{"username" : "張飛", "psw" : "123"}
callback -- 可選, load方法完成後所執行的函數
特點1:如果添加data,就是post請求,不加data,就是get請求
特點2:服務器返回的數據會直接添加到selector選擇的組件內部
*/
//$("#msg_username").load(url,{"username":name});
//2.
/*
$.get方法
$.get(url, [data], [callback]);
url -- 發送請求的URL地址
data -- 可選, 向服務器發送的數據
callback -- 可選, 請求成功後所執行的函數
*/
//function就是callback,當頁面收到服務器返回的應答後,會自動調用
// function方法,其參數result,就是服務器返回的內容
$.get(url,{"username":name},function(result){
$("#msg_username").html(result);
});
}
});
});
package com.hxuner.web;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hxuner.util.JDBCUtils;
public class AjaxCheckUsernameServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取全局的字符集編碼
String encode=this.getServletContext().getInitParameter("encode");
// 1. 處理亂碼
// 請求亂碼 post
// req.setCharacterEncoding(encode);
// 應答亂碼
response.setContentType("text/html;charset="+encode);
// 2. 獲取請求參數
String username=request.getParameter("username");
// 手動編解碼處理get請求亂碼
username=new String(username.getBytes("iso8859-1"),encode);
// 3. 表單驗證(略)
// 4. 執行邏輯
String sql="select * from user where username=?";
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtils.getConn();
ps=conn.prepareStatement(sql);
ps.setString(1, username);
rs=ps.executeQuery();
if(rs.next()){
// 數據庫中存在該用戶名
// 5. 根據執行結果,返回應答內容
response.getWriter().write("很抱歉,用戶名已存在");
}else{
response.getWriter().write("恭喜您,用戶名可以使用");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.close(conn, ps, rs);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}