简介
概念
sun公司提供了关于编写网页的技术。JSP&Servlet
是一个javax.servlet 包下的接口, 我们作为java开发程序员,需要写一个类实现该接口。
实现类:GenericServlet, HttpServlet
实现方式
实现接口Servlet
继承GenericServlet
继承HttpServlet
@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,然后使用
init
方法将其初始化。-
第一次发送请求的时候。 执行一次
-
-
处理来自客户端的对
service
方法的所有调用。-
客户端发送一次请求,调用service方法一次。执行多次
-
-
从服务中取出 servlet,然后使用
destroy
方法销毁它,最后进行垃圾回收并终止它。-
tomcat服务器关闭的时候,销毁
-
-
-
以/开头,配置文件中url-pattern怎么写,浏览器就怎么访问(servlet)
-
-
目录匹配
-
以/开头,以*结尾(过滤器)
-
-
扩展名匹配
-
不以/开头,以扩展名结尾 (.do,
-
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>
<E>
获取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)
-
传入资源文件的虚拟路径,得到文件的绝对路径
-
概述
-
是一个接口,代表的是客户端发送到服务器端的请求对象
-
作用
获取客户端信息
//获取客户端信息
//获取请求的协议
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");
概述
-
是一个接口,定义辅助 servlet 将响应发送到客户端的对象。
-
子接口:HttpServletResponse
-
提供了一系列关于Http协议的相关方法
-
作用
页面输出内容
方法
-
getWriter()
-
获取字符输出流对象
-
resp.getWriter().write("HelloWorld");
//向客户端输出内容
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
-
-
不是提交整个页面,而是提交向服务器一部分数据,得到服务器的相应后,做局部刷新;如果服务器没有响应,那么可以操作页面其他内容
-
-
同步:使用表单或者超链接提交数据
-
-
-
验证用户名收是否存在
-
传输数据类型
-
-
字符串
-
xml:前台得到的是一个document对象
-
json:特殊的数据格式,获取的是字符串,需要使用eval函数执行一次,得到json对象
-
-
同步
-
请求示例:
发起AJAX请求
- 创建
XMLHttpReq
对象 - 调用
open
方法设置参数 - 调用
send
方法发送请求 - 在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);
});
});
概述
-
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解析数据
注意:本文归作者所有,未经作者允许,不得转载