Java进阶-Filter & Listener & Ajax(十五)

文章目录

一、案例一、过滤非法字符

1.1、案例需求

当用户发出非法言论的时候,提示用户言论非法

1.2、案例效果

在表单中输入含有非法字符的言论,点击提交按钮
在这里插入图片描述
在页面显示
含有非法字符,请重新发表言论

如果不含有非法字符:
在页面显示:你发表的言论是:xxxxxx

1.3、过滤器

1.3.1 为什么要使用过滤器

在工作项目中,我们对访问某些资源的请求需要进条件的筛选、过滤。当这个请求满足特定的情况,才能让这 个请求访问目标资源,如果不满足条件,就不让访问目标资源。比如说:对于访问管理员功能的请求,我们应该对这样的请求进行管理员权限的判断。如果当前用户拥有管理员权限,可以访问。反之不可以。java开发中需要很多这样过滤功能的操作,所以需要知道过滤器。

1.3.2 什么是过滤器

Filter:是Java中预先定义好了的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行

在这里插入图片描述

Servlet 也需要实现一个接口HttpServlet
Filter 需要实现一个接口Filter接口

1.3.3 过滤器应用场景

1.3.3.1 过滤论坛中用户发表内容中的非法字符

当我们上论坛或者贴吧这类的网站浏览信息时,我们发现,很多评论有时候是携带脏词的。而这些脏词不能显示出来,使用**代替了。类似这类的脏词过滤,我们可以通过java中的过滤器,对请求参数中的脏词进行过滤

1.3.3.2 登录权限检查

当客户端浏览器发出一个请求,这个请求在访问到正真的目标资源之前,我们需要进行登录权限的检查。如果已经登录,我们就让这个请求通过,访问资源;如果没有登录,我们不能让请求访问目标资源。这样的操作需要在访问 具体资源进行条件的过滤,我们可以使用过滤器来完成。

1.3.4、入门案例

实现步骤:

  1. 创建一个普通java类, 去实现Filter接口, 重写filter 的方法
  2. 设置过滤的路径

在这里插入图片描述

(1)普通java类(ZhangServlet.java)

package com.zql;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/zhang")
public class ZhangServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决请求和响应乱码问题
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		
		System.out.println("张同学开车回家了。。。。。");

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

(2)过滤器设置(DemoFilter1.java)


package com.zql;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("/*")
public class DemoFilter1 implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		//过滤器
		System.out.println("张同学到达收费站了");
		//放行
		chain.doFilter(request, response);	
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub	
	}
}

启动tomcat显示:http://localhost:8080/filter/zhang

在这里插入图片描述

1.3.5、过滤器的生命周期

  1. 创建: 服务器启动就会创建
  2. 执行(doFilter): 只要请求符合过滤的路径,都会执行doFilter
  3. 销毁(doFilter):服务器重新加载或者服务器正常关闭

1.3.6、单过滤器执行流程

平常生活中我们坐地铁或者火车,登车的时候需要先经过安检,安检通过了才能检票,检票通过了才能登车。安检和检票都相当于我们今天学习的过滤器。

单过滤器的执行流程
在这里插入图片描述

1.3.7 映射路径

1.3.7.1 精确匹配模式(相当于servlet中的完全匹配)

/zhang 只要在访问它的时候才会进行过滤,访问其他的没有效果. 用的比较少

1.3.7.2 模糊匹配模式

整个应用的配置(/) 用户乱码处理(只要你访问整个项目,都会进行过滤)
指定目录下的路径配置(相当于servlet中目录匹配)/aa/bb/
访问资源(管理员页面)
指定后缀名的路径配置(扩展名匹配)*.action

2.5版本的配置

<filter>
  		<filter-name>filter</filter-name>
  		<filter-class>com.zql.filter.DemoFilter1</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>filter</filter-name>
  		<!-- 精确匹配 -->
  		<!-- <url-pattern>/demo</url-pattern> -->
  		<!-- 整个应用的配置 -->
  		<url-pattern>/*</url-pattern>
  		<!-- 目录匹配 -->
  		<url-pattern>/aa/bb/*</url-pattern>
  		<!-- 后缀名匹配 -->
  		<url-pattern>*.action</url-pattern>
  </filter-mapping>

1.3.8 拦截方式

有了上面学习的映射路径,我们可以控制过滤器过滤指定的内容,但是我们在访问资源的时候,有时是直接访问到 指定资源的,有时是以转发的方式访问到的,这就需要我们要让过滤器可以区分不同的访问资源的方式,有不同的拦截方式。

1.3.9.1 request

request是默认的拦截方式:浏览器发出的请求都会进行拦截(包括重定向)。

1.3.9.2 forward(只拦截请求转发)

按照过滤器默认的拦截方式(request),我们只能拦截浏览器对服务器的之间访问,但是,如果是服务器资源之间使用转发的方式,就无法访问了,因此,我们还有一种forward拦截方式:当前拦截方式表示只有在进行请求转发时,才会拦截请求进行过滤。

结论:

  1. 如果只想拦截拦截浏览器发出的请求, 不用设置(默认)
  2. 如果你只想拦截请求转发, 你需要配置
  3. 如果既想拦截请求转发又想拦截重定向.需要配置以下拦截方式

1.3.9 过滤器链的执行流程

过滤器链:

再次回到我们生活中坐地铁或者火车的例子 , 登车的时候需要先经过安检,安检通过了才能检票,检票通过了才能登车 , 其中任意一个没有通过都是登不了车的 , 并且这两个过滤是有顺序。
同样,我们java代码中,有时需要对同一个请求,进行多次不同业务的过滤,所以我们java代码中需要多个过滤器。只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行 请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体我们称为过滤器链。而且,过滤器链中的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。

在这里插入图片描述
过滤器链的执行顺序:

2.5版本: 过滤器的执行顺序和在web.xml中配置的顺序有关,(配置越靠前,越先执行)
3.0版本: 过滤器的执行顺序和类名的首字母的大小或者顺序有关(越小越先执行)

1.4 过滤非法字符案例实现

(1)案例结构:
在这里插入图片描述
a.txt(内含贬义词的文本文件)

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<form action="/speech/speech" method="post">
			请发表您的言论:<input type="text" name="uname"/><br/>
			<input type="submit" value="提交"/>
		</form>
</body>
</html>

SpeechServlet.java

package com.zql.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/speech")
public class SpeechServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String uname = request.getParameter("uname");
		
		response.getWriter().write("您发表的言论为"+uname);	
	}
}

SpeechFilter.java


package com.zql.filter;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**

* author:Daniel

* version:1.0

*/

@WebFilter("/*")
public class SpeechFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
			//解决请求和响应乱码问题
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html;charset=utf-8");
			String uname = request.getParameter("uname");
			//判断言论是否含有非法字符
			if(uname != null && !"".equals(uname)) {
				for (String str : list) {//遍历list集合
					
					if(uname.indexOf(str) != -1) {//检索出来的字符是否出现过
						
						response.getWriter().write("不好意思,您输入的信息中含有非法字符");
						return;
					}
				}
			}
			
			chain.doFilter(request, response);
	}
	
	
	
	//先创建list集合
	List<String> list = new ArrayList<String>(); 
	
	public void init(FilterConfig filterConfig) throws ServletException {
		try {
		//读取a.txt不健康文件
		File file = new File("D:\\develop\\eclipse\\eclipse-workspace\\speech\\src\\a.txt");
			
		BufferedReader br = new BufferedReader(new FileReader(file));
		
		String str = null;
		
			while((str=br.readLine())!= null) {
				list.add(str);
			}
			System.out.println(list);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}

输入正确显示(http://localhost:8080/speech/index.jsp):

在这里插入图片描述

输入含有非法字符显示:

在这里插入图片描述

二、案例二:解决全站乱码

2.1案例需求

浏览器发出的任何请求,通过过滤器统一处理中文乱码。

2.2案例效果

在这里插入图片描述

2.3 案例实现

(1)在webContent下面创建index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/sFilter/demo1" method="post">
	
		用户名:<input type="text" name="uname"><br/>
		
		<input type="submit" value="提交">
		
		<hr/>
		
		用户名:<input type="text" name="uname1"><br/>
		<input type="submit" value="提交">
	</form>
</body>
</html>

(2) 创建DemoServlet1.java

package com.zql.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/demo1")
public class DemoServlet1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决请求和响应乱码问题(可移动到过滤其中统一处理)
		//request.setCharacterEncoding("UTF-8");
		//response.setContentType("text/html;charset=utf-8");
		
		String name = request.getParameter("uname");
		
		System.out.println(name);
		
		String name1 = request.getParameter("uname1");
		
		System.out.println(name1);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

(3)创建DemoFilter1.java 过滤器统一处理乱码问题


package com.zql.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**

* author:Daniel
* version:1.0
*/
@WebFilter("/*")
public class DemoFilter1 implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//解决请求和响应乱码问题
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;chaset=utf-8");
		chain.doFilter(request, response);	
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

访问输入:http://localhost:8080/sFilter/index.jsp
在这里插入图片描述
后台显示:
在这里插入图片描述

三、监听器(了解,后面会详细总结)

3.1 什么是监听器

在实际生活着,我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。同样,在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。这就需要用到java中的监听器。
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如
ServletContext,HttpSession,ServletRequest的创建和销毁等。可以在某些动作前后增加处理,实现监控

在这里插入图片描述

3.2 监听器的创建

在这里插入图片描述

3.3 第一类监听器(监听域对象的创建和销毁)

3.4 第二类监听器

专门用来监听三大域对象中属性变更(添加、替换、删除)

ServletContextAttributeListener 监听ServletContext对象的属性变更
HttpSessionAttributeListener 监听HttpSession对象的属性变更
ServletRequestAttributeListener 监听Request对象的属性变更

3.5 第三类监听器

作用:

HttpSession中特殊JavaBean的状态改变。

事件源:特殊JavaBean
事件: 状态改变事件
监听器:实现HttpSessionBindingListener/ HttpSessionActivationListener接口即可
特殊JavaBean
绑定监听器: 特殊JavaBean实现接口后,自己在监听自己
HttpSessionBindingListener 监听HttpSession中特殊JavaBean的绑定/解绑状态

四、Ajax

4.1 什么是Ajax

在这里插入图片描述

在这里插入图片描述

1.同步与异步区别

在这里插入图片描述
在这里插入图片描述
2.局部更新

资源跳转方式: 请求转发 重定向 (整体更新)

应用场景:

① .购物时需要对商品的数量和白条进行局部更新

在这里插入图片描述

②.内容自动补全

在这里插入图片描述

③.用户登录失败的提示信息

在这里插入图片描述

4.2 ajax的实现方式

ajax的实现:

JS的ajax:出现最早。使用一个对象XmlHttpRequest对象。专门用于进行ajax请求发送,和响应的接收

核心对象:

在这里插入图片描述
在这里插入图片描述
同步异步请求

(1)导入 原生js实现ajax.html

异步:
在这里插入图片描述

同步:

在这里插入图片描述

使用ajax发请求,使用ajax接收响应(难),使用JS进行页面刷新。

  1. 若使用JS的AJAX技术,为了实现简单功能,就需要书写大量复杂代码。(滑动的效果)
  2. JS的AJAX代码,浏览器兼容性比较差。

JQ的ajax:底层封装了JS的ajax代码,做了浏览器的兼容性。
程序员仅需要调用简单的JQ的AJAX方法,就可以实现复杂的AJAX功能。

  1. 少量代码,实现复杂功能
  2. 浏览器兼容性好,一处编写,处处执行

4.3 jQuery框架的ajax

4.3.1 jQuery框架的ajax简介

jquery是一个优秀的js框架,自然对js原生的ajax进行了封装,封装后的ajax的操 作方法更简洁,功能更强大,与ajax操作相关的jquery方法有如下几种,但开发中 经常使用的有三种:

请求方式语法
GET请求$.get(url, [data], [callback], [type])
POST请求$.post(url, [data], [callback], [type])
A JAX请求$.ajax([settings])
GET请求$.get([settings])
POST请求$.post([settings])

4.3.2 GET请求方式

4.3.2.1 Get请求方式概述

通过远程 HTTP GET 请求载入信息。这是一个简单的 GET 请求功能,如需复杂的ajax参数设置请使用$.ajax

4.3.2.2 Get请求方式语法

jQuery.get(url, [data], [callback], [type])

其中,参数说明如下:

参数名称解释
url请求的服务器url地址
data发送给服务器端的请求参数,格式可以是key=value,也可以是js对象
callback当请求成功后回掉函数,可以在函数体中编写我们的逻辑代码
type预期的返回数据的类型,取值可以是xml,html,json,text等

发请求时使用:

url : 请求路径。 向某个路径发送请求。
data : 发送请求时的参数列表。
写法格式:
{“属性名1”:”属性值1” , ”属性名2”:”属性值2”}
callback : 响应成功之后调用函数, 称为回调函数。
ajax局部刷新发生在回调函数中。
该回调函数仅在响应成功并且响应状态码200时,才会调用
Function(data){
Alert(data)
}

type : 设置响应体的类型。(要求,服务器不设置响应体类型)【可以忽略】
type默认值:html
type常用值:text、html、json

4.3.2.3 Get请求方式代码

4.3.3 POST请求方式

4.3.3.1 Post请求方式概述

通过远程 HTTP POST 请求载入信息。这是一个简单的 POST 请求功能,如需复杂的ajax参数设置请使用$.ajax

4.3.3.2 Post请求方式语法

jQuery.post(url, [data], [callback], [type])

其中,参数说明如下:

参数名称解释
url请求的服务器url地址
data发送给服务器端的请求参数,格式可以是key=value,也可以是js对象
callback当请求成功后回掉函数,可以在函数体中编写我们的逻辑代码
type预期的返回数据的类型,取值可以是xml,html,json,text等
4.3.3.3 Post请求方式代码

4.3.4 Ajax请求方式

4.3.4.1 ajax请求方式概述

通过 HTTP 请求加载远程数据。jQuery 底层 A JAX 实现。简单易用的高层实现见get和post方法。$.ajax()方法可以更加详细的设置底层的参数。

4.3.4.2 ajax请求方式语法

jQuery.ajax({[settings]})
其中,settings是一个js字面量形式的对象,格式是{name:value,name:value },

常用的name属性名如下:

属性名称解释
url请求服务器端url地址
async(默认:true)默认设置下,所有请求均为异步请求,如果需要发送同步请求,请将此选项设置为false
data发送到服务器的数据,可以是键值对形式,也可以是js对象形式
type(默认:“GET”)请求方式(“POST”或“GET”),默认为“GET”
dataType预期的返回数据的类型,取值可以是xml,html,script,json,text,_default等
success请求成功后的回调函数
error请求失败时调用此函数

五、JSON

5.1、json简述

在这里插入图片描述

JSON(JavaScript Object Notation) JavaScript对象表示法。

是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。
易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

在这里插入图片描述

Ajax方式:
浏览器将数据传递给服务器,JSON
服务器将数据传回浏览器,JSON

5.2、json语法格式

JSON自定义格式:
写法格式: 由键值对组成, 其中键和值中间以”:” 隔开 键与键之间使用逗号隔开
表现形式:
{“k1”:”v1” , “k2”:”v2”}
{“k1”:”v1”}键可以不加双引号,但是值必须加双引号(整数类型除外)

JSON数组格式:

JSON复合形式:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
		
		//自定义json格式
		/* var arr = {"name":"Daniel","age":10};
		alert(arr.name); */
		//json数组格式:
		/* var arr =["a","b","b","深圳"];
		alert(arr[3]); */
		//json复合形式:
		var list = [{"name":"Daniel","age":10},{"name":"Jenny","age":23}];
		alert(list[1].age);

</script>
</head>
<body>
</body>
</html>

5.3、json数据和java对象的相互转换

在这里插入图片描述

5.3.1.使用jsonlib转换

(1).单个JavaBean转json

(2)Map集合转json

(3)数组转json

(4)将list集合转json

实现步骤:

  1. 导包
    在这里插入图片描述

  2. 先创建一个User.java


package com.zql.json;

import java.io.Serializable;

/**

* author:Daniel

* version:1.0

*/

public class User implements Serializable{
	
	private String name;
	private int age;
	private String addr;
	
	
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public User(String name, int age, String addr) {
		super();
		this.name = name;
		this.age = age;
		this.addr = addr;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", addr=" + addr + "]";
	}
}
  1. Jsonlib.java

package com.zql.json;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**

* author:Daniel

* version:1.0
 * @param <>

*/

public class Jsonlib {
	
	//(1).单个JavaBean转json
	@Test
	public void test1() {
		User user = new User();
		user.setName("Daniel");
		user.setAge(12);
		user.setAddr("深圳");
		JSONObject object = JSONObject.fromObject(user);
		System.out.println(object);
		
	}
	//(2)Map集合转json
	@Test
	public void test2() {
		Map map = new HashMap();
		map.put("name", "kendra");
		map.put("age", 22);
		map.put("addr", "上海");
		JSONObject object = JSONObject.fromObject(map);
		System.out.println(object);
		
		
	}
	//(3)数组转json
	@Test
	public void test3() {
		
		String[] arr = {"Wendy","33","甘肃"};
		
		JSONArray array = JSONArray.fromObject(arr);
		
		System.out.println(array);
		
	}
	
	//(4)将list<JavaBean>集合转json
	@Test
	public void test4() {
		
		User user1 = new User("Daniel",12,"shenzhen");
		User user2 = new User("Amy",11,"nanshan");
		User user3 = new User("Nancy",11,"futian");
		
		List list = new ArrayList();
		
		list.add(user1);
		list.add(user1);
		list.add(user1);
		
		JSONArray array = JSONArray.fromObject(list);
		
		System.out.println(array);
		
	}
}

运行结果看下面

运行结果分别显示:
(1).单个JavaBean转json

{“addr”:“深圳”,“age”:12,“name”:“Daniel”}

(2)Map集合转json

{“name”:“kendra”,“addr”:“上海”,“age”:22}

(3)数组转json

[“Wendy”,“33”,“甘肃”]

(4)将list集合转json

[{“addr”:“shenzhen”,“age”:12,“name”:“Daniel”},{“addr”:“shenzhen”,“age”:12,“name”:“Daniel”},{“addr”:“shenzhen”,“age”:12,“name”:“Daniel”}]

5.3.2.使用jackson转换

JackSon.java(运行转换结果看下面)


package com.zql.json;


import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**

* author:Daniel

* version:1.0

*/

public class JackSon {
	
		//(1). 单个JavaBean转json
		@Test
		public void test1() throws Exception {
			
			User user = new User();
			
			user.setName("Daniel");
			user.setAge(12);
			user.setAddr("shenzhen");
			
			ObjectMapper mapper = new ObjectMapper();
			
			String json = mapper.writeValueAsString(user);
			
			System.out.println(json);
		}
		//(2).Map集合转json
		@Test
		public void test2() throws Exception {
			
			Map<String,String> map = new HashMap();
			
			map.put("name", "Daniel");
			map.put("age", "12");
			map.put("addr", "深圳");
			
			ObjectMapper mapper = new ObjectMapper();
			
			String json = mapper.writeValueAsString(map);
			
			System.out.println(json);
			
			
		}
		
		//(3)将list<JavaBean>集合转json
		@Test
		public void test3() throws IOException {
			
			ArrayList<User> list = new ArrayList<User>();
			
			User user1 = new User("Daniel",12,"深圳");
			User user2 = new User("Wendy",22,"上海");
			User user3 = new User("Kendra",21,"上海");
			User user4 = new User("Guog",3,"兰州");
			
			list.add(user1);
			list.add(user2);
			list.add(user3);
			list.add(user4);
			
			ObjectMapper mapper = new ObjectMapper();
			
			String json = mapper.writeValueAsString(list);
			
			System.out.println(json);
						
		}
}

(1). 单个JavaBean转json

{“name”:“Daniel”,“age”:12,“addr”:“shenzhen”}

(2).Map集合转json

{“name”:“Daniel”,“addr”:“深圳”,“age”:“12”}

(3)将list集合转json

[{“name”:“Daniel”,“age”:12,“addr”:“深圳”},{“name”:“Wendy”,“age”:22,“addr”:“上海”},{“name”:“Kendra”,“age”:21,“addr”:“上海”},{“name”:“Guog”,“age”:3,“addr”:“兰州”}]

5.3.3.Json数据格式转java对象

(一般很少于,不需要手动转,有工具)

六、案例一:检测用户名是否已被注册

6.1 分析流程:

在这里插入图片描述

6.2 案例实现

(1)案例结构:

在这里插入图片描述
(2)sql:

CREATE DATABASE jsonu;
USE jsonu;
CREATE TABLE USER(
 uid VARCHAR(32) PRIMARY KEY,
 username VARCHAR(100),
 PASSWORD VARCHAR(100)
);
INSERT INTO USER VALUES ('001','Daniel','123'),('002','Andy','123');

(3) demo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript">

	function checkUsername(obj) {
		
		var val = obj.value;
		
		//alert(val);
		
		var url = "${pageContext.request.contextPath}/check";
		
		var param = {"username":val}
		
		$.post(url,param,function(data){
			
			if(data == true){
				
				//alert("此号已被注册");
				
				$("#usernameInfo").html("<font color='red'>此号已被注册</font>"); 
			}
			if(data == false){
				
				//alert("此未注册");
				
				$("#usernameInfo").html("<font color='green'>此号可以使用</font>");
			}
			
		},"json");
		
	} 

</script>
</head>
<body>
	<div>
		<font>会员注册</font>USER REGISTER
		<form class="form‐horizontal" style="margin‐top: 5px;">
			用户名<input type="text" name="username" onblur="checkUsername(this)"
			placeholder="请输入用户名">
			<span id="usernameInfo" style="color:red"></span><br/>
			密码<input type="password" placeholder="请输入密码"><br/>
			<input type="submit" value="注册"/>
		</form>
	</div>
</body>
</html>

(4) 编写实体类 User.java


package com.zql.pojo;

import java.io.Serializable;

/**

* author:Daniel

* version:1.0

*/

public class User implements Serializable{
	
	private String username;
	
	private String password;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
	
}

(5) 编写UserServlet.java

package com.zql.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zql.pojo.User;
import com.zql.service.UserService;

@WebServlet("/check")
public class UserServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决请求和响应乱码问题
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		//获得前台传过来的数据
		//1.获得数据
		String username = request.getParameter("username");
		
		//System.out.println(username);
		//2.业务处理
		UserService us = new UserService();
		
		User user = us.checkByUsername(username);
	
		String str = "";
		
		if(user != null) {
			
			//System.out.println(111);
			str = "true";
		}else {
			
			str = "false";
		}
		
		response.getWriter().write(str);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

(6)编写UserService.java


package com.zql.service;

import com.zql.dao.UserDao;
import com.zql.pojo.User;

/**

* author:Daniel

* version:1.0

*/

public class UserService {

	public User checkByUsername(String username) {
		
		UserDao ud = new UserDao();
		
		User user = ud.checkByUsername(username);
		
		return user;
	}

}

(7)编写UserDao.java


package com.zql.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.zql.pojo.User;
import com.zql.utils.C3P0Utils;

/**

* author:Daniel

* version:1.0

*/

public class UserDao {

	public User checkByUsername(String username) {
		
		try {
		
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
	
		String sql = "select * from user where username=?";

		User user =  qr.query(sql, new BeanHandler<User>(User.class),username);
		
		return  user;
		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

运行结果:
数据库已有显示:
在这里插入图片描述

数据库没有显示:
在这里插入图片描述

七、案例二:内容自动补全

(1)结构类似案例六,表中随意加几个字段
(2)demo2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">	
<style type="text/css">
.content{
width:643px;
margin:200px auto;
text‐align: center;
}
input[type='text']{
width:530px;
height:40px;
font‐size: 14px;
}
input[type='button']{
width:100px;
height:46px;
background: #38f;
border: 0;
color: #fff;
font‐size: 15px
}
.show{
position: absolute;
width: 535px;
border: 1px solid #999;
border‐top: 0;
display: block;
};
</style>
<script type="text/javascript" src="js/jquery-1.11.3.min.js">
<script type="text/javascript">
function searchWord(obj) {
	
	//alert(111)
	
	var word = obj.value;
	
	if(word != "" || word != null){
		
		return;
	}
	
	$.post("${pageContext.request.contextPath}/search",{"word":word},function(data){
		
		var content ="";
		for (var i = 0; i < data.length; i++) {
			
			content+="<div>"+data[i].username+"</div>"
		}
		
		$("#show").html(content).show;
	
	},"json");
}
</script>
<title>Insert title here</title>

</head>

<body>
	<div class="content">

		<img src="img/logo.jpg" alt="" width="300px" height="160px"/><br/>
		<input type="text" name="word" id="tid" onchange="searchWord(this)"/>
		<input type="button" value="搜索一下"/>
	<div class="show" id="show"></div>
	</div>

</body>
</html>

(3) User.java


package com.zql.pojo;

import java.io.Serializable;

/**

* author:Daniel

* version:1.0

*/

public class User implements Serializable{
	
	private String uid;
	
	private String username;
	
	private String password;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String uid, String username, String password) {
		super();
		this.uid = uid;
		this.username = username;
		this.password = password;
	}

	public String getUid() {
		return uid;
	}

	public void setUid(String uid) {
		this.uid = uid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [uid=" + uid + ", username=" + username + ", password=" + password + "]";
	}
}

(4)SearchServlet.java

package com.zql.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.zql.pojo.User;
import com.zql.service.SearchService;


@WebServlet("/search")
public class SearchServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决请求和响应乱码问题
				request.setCharacterEncoding("UTF-8");
				response.setContentType("text/html;charset=utf-8");
				
				String word = request.getParameter("word");
				
				System.out.println(word);
				
				SearchService ss = new SearchService();
				
				List<User> list = ss.searchWord(word);
				
				//System.out.println(list);
				
				//List<javabean>转为json
				
				ObjectMapper mapper = new ObjectMapper();
				
				String json = mapper.writeValueAsString(list);
				
				System.out.println(json);
				
				response.getWriter().write(json);
	}
}

(5)SearchService.java


package com.zql.service;

import java.util.List;

import com.zql.dao.SearchDao;
import com.zql.pojo.User;

/**

* author:Daniel

* version:1.0

*/

public class SearchService {

	public List<User> searchWord(String word) {
		
		SearchDao sd = new SearchDao();
		
		List<User> list = sd.searchWord(word);
		return list;
	}
}

(6)SearchDao.java


package com.zql.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.zql.pojo.User;
import com.zql.utils.C3P0Utils;

/**

* author:Daniel

* version:1.0

*/

public class SearchDao {

	public List<User> searchWord(String word) {
		
		try {
		
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		
		String sql = "select * from user where username like ?";
		
		Object[] param = {"%"+word+"%"};
		
		
		List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
		
		return list;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

最总显示为(http://localhost:8080/day19/demo2.jsp):

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel521-Spark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值