34.Servlet,Ajax

一、Servlet

简介

概念

sun公司提供了关于编写网页的技术。JSP&Servlet

是一个javax.servlet 包下的接口, 我们作为java开发程序员,需要写一个类实现该接口。

实现类:GenericServlet, HttpServlet  

作用

servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求

实现方式

实现接口Servlet

继承GenericServlet

继承HttpServlet

第一个Servlet程序

自定义类实现Servlet接口(重写service方法)

	@Override
  	public void service(ServletRequest arg0, ServletResponse arg1)
  			throws ServletException, IOException {
  			System.out.println("servlet 提供服务");
  			arg1.getWriter().write("Hello World");	
  	}

在web.xml中配置servlet的信息和访问路径

<!-- 配置Servlet的基本信息 -->
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>com.yh.HelloServlet</servlet-class>
  </servlet>
  
  <!-- 配置Servlet的访问路径 -->
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

Servlet的执行流程

Servlet的生命周期

  • 构造 servlet,然后使用 init 方法将其初始化。

    • 第一次发送请求的时候。 执行一次

  • 处理来自客户端的对 service 方法的所有调用。

    • 客户端发送一次请求,调用service方法一次。执行多次

  • 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。

    • tomcat服务器关闭的时候,销毁

Servlet访问路径配置

  • 完全路径匹配

    • 以/开头,配置文件中url-pattern怎么写,浏览器就怎么访问(servlet)

  • 目录匹配

    • 以/开头,以*结尾(过滤器)

  • 扩展名匹配

    • 不以/开头,以扩展名结尾 (.do,.action struts2框架)

ServletConfig对象

概念

  • 当前Servlet的配置信息

作用

获取配置信息

String getServletName()//获取Servlet的名称
String getInitParameter(String name)//获取初始化参数
<!-- 配置初始化参数 -->
  	<init-param>
  		<param-name>username</param-name>
  		<param-value>rose</param-value>
  	</init-param>
  	
  	<init-param>
  		<param-name>password</param-name>
  		<param-value>123456</param-value>
  	</init-param>

Enumeration<E>getInitParameterNames() //获取所有初始化参数名

获取ServletContext对象

概念

  • 在web服务器启动后,就为每一个web应用创建该对象,在web应用中包含很多web资源,所有的资源共享一个ServletContext对象,就可以通过ServletContext传递数据。

如何获取该对象

  • 通过getServletConfig().getServletContext()获取

  • 通过getServletContext()获取

作用

获取全局化参数

在web.xml配置全局化参数

<!-- 配置全局化参数 -->
<context-param>
	<param-name>encoding</param-name>
	<param-value>UTF-8</param-value>
</context-param>

在Servlet中获取

 //获取上下文对象
 	ServletContext sc = getServletContext();
 	
 	//获取全局化参数
 	String e = sc.getInitParameter("encoding");
 	
 	//设置resp的编码
 	resp.setCharacterEncoding(e);

作为域对象传递数据

  • 代表的范围是整个应用。

读取资源文件

  • 方法

  • InputStream getResourceAsStream(String path)

    • 传入资源文件的虚拟路径,得到资源文件的流对象

  • public String getRealPath(String path)

    • 传入资源文件的虚拟路径,得到文件的绝对路径

ServletRequest

概述

  • 是一个接口,代表的是客户端发送到服务器端的请求对象

  • 子接口:HttpServletRequest

作用

获取客户端信息

//获取客户端信息
//获取请求的协议
String pro = req.getProtocol();
System.out.println(pro);

//获取服务器名称
---
String serverName = req.getServerName();

//获取服务器端口号
int port = req.getServerPort();
System.out.println(serverName+" "+port);

//获取项目名
String proName = req.getContextPath();
System.out.println(proName);

//获取servlet路径
String path = req.getServletPath();
System.out.println(path);

//获取请求url
String url = req.getRequestURL().toString();

String uri = req.getRequestURI();

System.out.println("url:"+url);
System.out.println("uri:"+uri);

获取请求头信息

获取请求参数

//获取表单中的请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
		
String sex = req.getParameter("sex");
		
String [] likes = req.getParameterValues("likes");
		
System.out.println("用户名是"+username+",密码是"+password+",性别是"+sex);

请求参数中文乱码问题

提交的方式是get:中文不会乱码(tomcat8.0以上的版本 UTF-8)

String username = new String(req.getParameter("username").getBytes("ISO8859-1"),"UTF-8");

提交的方式是post:中文乱码

//设置request缓冲区的编码
request.setCharacterEncoding("UTF-8");

 

ServletResponse

概述

  • 是一个接口,定义辅助 servlet 将响应发送到客户端的对象。

  • 子接口:HttpServletResponse

    • 提供了一系列关于Http协议的相关方法

作用

页面输出内容

方法

  • getWriter()

    • 获取字符输出流对象

resp.getWriter().write("HelloWorld");

getOutputStream()

  • 获取字节输出流对象

//向客户端输出内容
String str = "Hello Wolrd";
		
//将字符串转为字节数组
byte [] by = str.getBytes();
		
//获取字节输出流对象
OutputStream os = resp.getOutputStream();
		
//向字节输出流对象输出字节
os.write(by);

使用字符流输出中文(出现乱码)

//设置response缓冲区的编码
resp.setCharacterEncoding("UTF-8");
//设置客户端相应内容的类型
resp.setContentType("text/html;charset=utf-8");
//使用字符流
resp.getWriter().write("你好");//输出中文客户端出现乱码,设置编码

使用字节流输出中文(出现乱码)

//向客户端输出内容
String str = "你好";
		
//将字符串转为字节数组
byte [] by = str.getBytes("UTF-8");
		
//获取字节输出流对象
OutputStream os = resp.getOutputStream();

//设置客户端相应内容的类型,字符集
resp.setContentType("text/html;charset=utf-8");
//向字节输出流对象输出字节
os.write(by);

重定向

原理图

案例

  • 需求:用户在登陆界面输入用户名和密码,后台的servlet进行判断,如果用户名和密码都是admin,跳转到成功页面,否则跳转到登录失败页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>登陆页面</h3>
<form action="/ServletTest/login" method="get">
	用户名:<input type="text" name="username"/><br/>
	
	密码:<input type="text" name="password"/>
	<input type="submit" value="登陆"/>
</form>
</body>
</html>

 

package com.login;

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 LoginServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取用户名和密码
		String username = req.getParameter("username");
		
		String password = req.getParameter("password");
		
		//判断
		if("admin".equals(username) && "admin".equals(password)){
			//跳转到成功页面
			resp.sendRedirect("/ServletTest/succ.html");
		}else{
			//跳转到失败页面
			resp.sendRedirect("/ServletTest/fail.html");
		}
		
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}
}

转发与重定向区别

  • 转发的地址栏不会发生改变,但是重定向会发生改变

  • 转发是一次请求和一次响应,但是重定向是两次请求和两次响应

  • 转发可以使用request域对象传递数据,但是重定向不可以

  • 转发发生在服务器内部,转发的资源不需要携带项目名,重定向可以重定到任何资源。

二、Ajax

  • Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

异步与同步

  • 异步:使用XMLHttpRequest对象完成异步操作,和服务器进行数据的交互

    • 不是提交整个页面,而是提交向服务器一部分数据,得到服务器的相应后,做局部刷新;如果服务器没有响应,那么可以操作页面其他内容

  • 同步:使用表单或者超链接提交数据

    • 需要把表单数据提交到后台服务器,页面发生跳转,需要等待服务器作出相应,如果服务器没有做出相应,需要等待,不能操作页面其他内容

异步的使用场景

  • 百度输入框

  • 验证用户名收是否存在

  • 异步分页

传输数据类型

  • 异步

    • 字符串

    • xml:前台得到的是一个document对象

    • json:特殊的数据格式,获取的是字符串,需要使用eval函数执行一次,得到json对象

  • 同步

    • 响应的都是以整个HTML页面

请求示例:

发起AJAX请求

  1. 创建XMLHttpReq对象
  2. 调用open方法设置参数
  3. 调用send方法发送请求
  4. 在send方法前绑定onreadystatechange事件,处理请求完成后操作
function ajaxRequest() {
 // 1、我们首先要创建XMLHttpRequest 
var xmlhttprequest = new XMLHttpRequest();
  //2、调用open方法设置请求参数
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) {
	alert("收到服务器返回的数据:" + xmlhttprequest.responseText);
	var jsonObj = JSON.parse(xmlhttprequest.responseText);
	// 把响应的数据显示在页面上
	document.getElementById("div01").innerHTML = "编号:" + jsonObj.id + " , 姓名:" + jsonObj.name;
		}
}
 // 3、调用send方法发送请求
	xmlhttprequest.send();

类AjaxServlet代码(用于响应AJAX请求)

protected void javaScriptAjax(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("Ajax请求过来了");
    Person person = new Person(1, "张三");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // json格式的字符串
    Gson gson = new Gson();
    String personJsonString = gson.toJson(person);

    resp.getWriter().write(personJsonString);
}

jQuery中的AJAX请求

$.ajax 方法
url 表示请求的地址
type 表示请求的类型 GET 或 POST 请求
data 表示发送给服务器的数据
格式有两种:

一: name=value&name=value

二: {key:value}
success 请求成功, 响应的回调函数
dataType 响应的数据类型
常用的数据类型有:
text 表示纯文本
xml 表示 xml 数据
json 表示 json 对象

// ajax请求
$("#ajaxBtn").click(function(){
	$.ajax({
		url:"http://localhost:8080/json/ajaxServlet",
		//调用servlet方法
		// data:"action=jQueryAjax",			
		data:{action:"jQueryAjax"},
		type:"GET",
		success:function (data) {
			// alert("服务器返回的数据是:" + data);
			// var jsonObj = JSON.parse(data);
			$("#msg").html(" ajax 编号:" + data.id + " , 姓名:" + data.name);
		},
		//返回数据的格式
		dataType : "json"
	});
});

$.get 方法和 $.post 方法

  • url 请求的 url 地址
  • data 发送的数据
  • callback 成功的回调函数
  • type 返回内容格式,xml, html, script, json, text, _default。
// ajax--get请求
$("#getBtn").click(function(){

	$.get("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGet",function (data) {
		$("#msg").html(" get 编号:" + data.id + " , 姓名:" + data.name);
	},"json");
	
});

$.getJSON 方法

  • url 请求的 url 地址
  • data 发送给服务器的数据
  • callback 成功的回调函数
// ajax--getJson请求
$("#getJSONBtn").click(function(){
	$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQueryGetJSON",function (data) {
		$("#msg").html(" getJSON 编号:" + data.id + " , 姓名:" + data.name);
	});
});

表单序列化 serialize()

  • serialize()可以把表单中所有表单项的内容都获取到, 并以 name=value&name=value 的形式进行拼接。
// ajax请求
$("#submit").click(function(){
	// 把参数序列化,通过requst请求发送过去
	$.getJSON("http://localhost:8080/16_json_ajax_i18n/ajaxServlet","action=jQuerySerialize&" + $("#form01").serialize(),function (data) {
		$("#msg").html(" Serialize 编号:" + data.id + " , 姓名:" + data.name);
	});
});

 

JSON数据封装和解析

概述

  • js提供的一种数据交换的格式,一般情况,都是再后台拼接json数据,响应前台.前台使用js代码就可以方便操作json

数据规范

  • 定义json数据

    • 格式必须使用{}包括起来,当做对象来使用,对象包含属性和值,如果是属性,必须使用双引号括起来,属性与值之间使用冒号,属性与属性之间使用逗号

  • 获取json数据的方式

    • 对象名.属性名

  • var person = {}
<script type="text/javascript">
	
	// 定义json数据格式的数据
	var person = {"name":"张三","age":18};
	// 使用对象.属性 获取值
	// alert(person.name);
	// alert(person.age);
	
	// 还可以定义数组这种格式的数据
	var person2 = [{"name":"赵四","age":19},{"name":"王五","age":20}];
	// 解析数据
	// alert(person2[0].name);
	// alert(person2[1].name);
	
	var person3 = {"stu":[{"name":"老六","age":21}]};
	// alert(person3.stu[0].name);
	
</script>

常用的使用方式:从后台发送json数据格式的数据,再前台使用js解析数据

 


已有 0 条评论

    欢迎您,新朋友,感谢参与互动!