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);
}
}