1.servlet技术
1.什么是servlet
- javaEE规范,规范即接口,就像jdbc
- 运行在服务器上小程序,接收请求,并响应
web.xml
配置servlet
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.xiyan.servlet.HelloServlet</servlet-class>
<!--定义返回的消息-->
<init-param>
<param-name>msg</param-name>
<param-value>hello world</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
HelloServlet
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy.....");
}
}
2.servlet生命周期
- 构造方法
- init初始化方法,利用web.xml配置的参数初始化
- service方法
- destroy方法
3.servlet通过继承HttpServlet
实现
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
4.servlet继承体系
5.ServletConfig类
- 获取servlet别名
- 初始化参数init-param
- 获取ServletContext对象
HelloServlet.java
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
msg=servletConfig.getInitParameter("msg");
}
6.ServletContext类
- 表示Servlet上下文对象
- 一个web工程只有一个ServletContext对象实例
- 它是一个域对象
- 随着web工程部署时启动,web工程停止时销毁
作用
- 获取web.xml配置的context-param
- 获取当前工程路径
- 获取工程部署在服务器的绝对路径
- 存取数据
7.HttpServletRequest类
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息
req.setCharacterEncoding("UTF-8");
//如果是post请求需要设置编码
String username = req.getParameter("username");
String password = req.getParameter("password")
8.请求的转发
- 转发是服务器行为,地址也是服务器解析的
- 一个request,一次请求
- 不能访问工程外的资源
req.getRequestDispatcher("/").forward(req,resp);
9.web中的路径
- /如果是浏览器解析的
http://ip:port/
- 链接跳转
- 重定向,将地址交给浏览器解析
- location.href
- 如果是服务器解析的
http://ip:port/工程路径
<url-pattern>/servlet1</url-pattern>
servletContext.getRealPath(“/”);
- 转发
request.getRequestDispatcher(“/”);
10.HttpServletResponse
响应信息
getOutputStream()
字节流,用于下载getWriter()
字符流,回传字符串
注意:两个流只能用一个
resp.setContentType("text/html; charset=UTF-8");
//设置响应头类型一定要在获取流之前
PrintWriter writer = resp.getWriter();
writer.println("欢迎"+username);
11.重定向
- 两次请求
- 可以访问工程外数据
- 浏览器解析地址
resp.sendRedirect("http://localhost:8080");
12.监听器
监听器就是实时监视一些事物状态的程序,我们称为监听器。
ServletContextListener
public class ServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("工程启动............");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("工程结束.............");
}
}
配置监听器web.xml
<!--配置监听器-->
<listener>
<listener-class>com.xiyan.listener.ServletContextListenerImpl</listener-class>
</listener>
2.cookie
服务器通知客户端保存数据
- cookie保存在客户端里
1.cookie创建
//创建cookie
Cookie cookie = new Cookie("username",username);
resp.addCookie(cookie);
2.cookie查找
//cookie查找
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if("username".equals(cookie.getName())){
System.out.println("cookievalue:"+cookie.getValue());
}
}
3.cookie修改
cookie.setValue("newValue");
// 调用response.addCookie()通知客户端保存修改
resp.addCookie(cookie);
4.cookie生命周期控制
setMaxAge()
-
正数,表示在指定的秒数后过期
-
负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
-
零,表示马上删除Cookie
cookie.setMaxAge(60 * 60); // 设置Cookie 一小时之后被删除。无效
resp.addCookie(cookie);
3.session
session是客户端和服务器之间的会话,存储在服务器
1.session的存取
2.session的生命周期
session超时:客户端两次请求最大间隔时长
设置所有session超时时长,默认是30min
<session-config>
<session-timeout>20</session-timeout>
</session-config>
//设置超时时长
setMaxInactiveInterval(int interval);
//让当前session超时
invalidate();
3.session技术内幕
session底层其实是基于cookie实现的
4.Filter过滤器
对请求和响应进行过滤
- 登陆过滤器
- 编码过滤器
1.过滤器使用
web.xml
<!--配置过滤器-->
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.xiyan.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
LoginFilter.java
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession session = request.getSession();
String username= (String) session.getAttribute("username");
String password = (String)session.getAttribute("password");
//如果没有登陆则跳转
if("admin".equals(username)&&"123456".equals(password)){
System.out.println("没有登陆");
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
2.Filter的生命周期
-
构造方法
-
init初始化方法
前两步在web工程启动时执行
doFilter()
方法- destroy销毁
停止工程时候会执行
3.过滤器链
4.filter的路径匹配
- 精准匹配
- 目录匹配
- 后缀名匹配
<url-pattern>/target.jsp</url-pattern>
<!--目录-->
<url-pattern>/admin/*</url-pattern>
<url-pattern>*.html</url-pattern>
filter只关心请求地址是否匹配不关心请求资源是否存在
5.JSON和AJAX
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。用于前后端数据交互。
var obj={
"username":"xiyan",
"password":"123456",
"age":17
}
josn本身是个对象
常用方法
JSON.stringify();//将json对象转换成json字符串
var jsonObjString = JSON.stringify(obj);
JSON.parse();//将json字符串转换成json对象
通过jackson可以实现javabean和json互转
AJAX是是指一种创建交互式网页应用的网页开发技术。
- 异步刷新
- 地址栏不会变化
- AJAX
不是新的编程语言
,而是一种使用现有标准的新方法。
1.原生AJAX
步骤:
-
创建
XMLHttpRequest
对象,即创建一个异步调用对象. -
创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
-
设置响应HTTP请求状态变化的函数.
-
发送HTTP请求.
-
获取异步调用返回的数据.
-
使用JavaScript和DOM实现局部刷新.
1.创建对象
var xmlHttpRequest; //定义一个变量,用于存放XMLHttpRequest对象
createXMLHttpRequst(); //调用创建对象的方法
//创建XMLHttpRequest对象的方法
function createXMLHttpRequest(){
if(window.ActiveXObject) {//判断是否是IE浏览器
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");//创建IE的XMLHttpRequest对象
}else if(window.XMLHttpRequest){//判断是否是Netscape等其他支持XMLHttpRequest组件的浏览器
xmlHttpRequest = new XMLHttpRequest();//创建其他浏览器上的XMLHttpRequest对象
}
}
2.创建http请求
XMLHttpRequest.open(method,URL,flag,name,password);
- method:该参数用于指定HTTP的请求方法,一共有get、post、head、put、delete五种方法,常用的方法为get和post。
- URL:该参数用于指定HTTP请求的URL地址,可以是绝对URL,也可以是相对URL。
- flag:该参数为可选,参数值为布尔型。该参数用于指定是否使用异步方式。true表示异步、false表示同步,默认为true。
- name:该参数为可选参数,用于输入用户名。如果服务器需要验证,则必须使用该参数。
- password:该参数为可选,用于输入密码。若服务器需要验证,则必须使用该参数。
3.设置响应HTTP请求状态变化的函数
- 未初始化状态。在创建完XMLHttpRequest对象时,该对象处于未初始化状态,此时XMLHttpRequest对象的readyState属性值为0。
- 初始化状态。在创建完XMLHttpRequest对象后使用open()方法创建了HTTP请求时,该对象处于初始化状态。此时XMLHttpRequest对象的readyState属性值为1。
- 发送数据状态。在初始化XMLHttpRequest对象后,使用send()方法发送数据时,该对象处于发送数据状态,此时XMLHttpRequest对象的readyState属性值为2。
- 接收数据状态。Web服务器接收完数据并进行处理完毕之后,向客户端传送返回的结果。此时,XMLHttpRequest对象处于接收数据状态,XMLHttpRequest对象的readyState属性值为3。
- 完成状态。XMLHttpRequest对象接收数据完毕后,进入完成状态,此时XMLHttpRequest对象的readyState属性值为4。此时接收完毕后的数据存入在客户端计算机的内存中,可以使用responseText属性或responseXml属性来获取数据。
//设置当XMLHttpRequest对象状态改变时调用的函数
xmlHttpRequest.onreadystatechange = function (){
//判断XMLHttpRequest对象的readyState属性值是否为4,如果为4表示异步调用完成
if(xmlHttpRequest.readyState == 4) {
//设置获取数据的语句
}
}
4.获取数据并刷新
if(xmlHttpRequst.status == 200) {
document.write(xmlHttpRequest.responseText);//将返回结果以字符串形式输出
//document.write(xmlHttpRequest.responseXML);//或者将返回结果以XML形式输出
}
5.发送请求
// 3、调用send 方法发送请求
xmlhttprequest.send();
总体流程
function ajaxRequest() {
// 1、我们首先要创建XMLHttpRequest
var xmlhttprequest = new XMLHttpRequest();
// 2、调用open 方法设置请求参数
//XMLHttpRequest.open(method,URL,flag,name,password);
xmlhttprequest.open("GET","http://localhost:8080/16_json_ajax_i18n/ajaxServlet?action=javaScriptAjax",true)
// 4、在send 方法前绑定onreadystatechange 事件,处理请求完成后的操作。
xmlhttprequest.onreadystatechange = function(){
if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200) {
var jsonObj = JSON.parse(xmlhttprequest.responseText);
// 把响应的数据显示在页面上
document.getElementById("div01").innerHTML = "编号:" + jsonObj.id + " , 姓名:" +
jsonObj.name;
}
}
// 3、调用send 方法发送请求
xmlhttprequest.send();
}
2.Jquery
-
url 表示请求的地址
-
type 表示请求的类型GET 或POST 请求
-
data 表示发送给服务器的数据
-
格式有两种:
一:name=value&name=value
二:{key:value} -
success 请求成功,响应的回调函数
-
dataType 响应的数据类型
常用的数据类型有:
text 表示纯文本
xml 表示xml 数据
json 表示json 对象
$("#ajaxBtn").click(function(){
$.ajax({
url:"http://localhost:8080/16_json_ajax_i18n/ajaxServlet",
// data:"action=jQueryAjax",
data:{action:"jQueryAjax"},
type:"GET",
success:function (data) {
// alert("服务器返回的数据是:" + data);
// var jsonObj = JSON.parse(data);
$("#msg").html("编号:" + data.id + " , 姓名:" + data.name);
},
dataType : "json"
});
});
$("#getBtn").click(function () {
$.get("http://localhost:8080/16_json_ajax_i18n/ajaxServlet", "action=jQueryGet", function (data) {
$("#msg").html(" get 编号:" + data.id + " , 姓名:" + data.name);
}, "json");
});
// ajax--post 请求
$("#postBtn").click(function () {
$.post("http://localhost:8080/16_json_ajax_i18n/ajaxServlet", "action=jQueryPost", function (data) {
$("#msg").html(" post 编号:" + data.id + " , 姓名:" + data.name);
}, "json");
});
$("#getJSONBtn").click(function () {
$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet", "action=jQueryGetJSON", function (data) {
$("#msg").html(" getJSON 编号:" + data.id + " , 姓名:" + data.name);
});
});