一、案例一、过滤非法字符
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、入门案例
实现步骤:
- 创建一个普通java类, 去实现Filter接口, 重写filter 的方法
- 设置过滤的路径
(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、过滤器的生命周期
- 创建: 服务器启动就会创建
- 执行(doFilter): 只要请求符合过滤的路径,都会执行doFilter
- 销毁(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.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进行页面刷新。
- 若使用JS的AJAX技术,为了实现简单功能,就需要书写大量复杂代码。(滑动的效果)
- JS的AJAX代码,浏览器兼容性比较差。
JQ的ajax:底层封装了JS的ajax代码,做了浏览器的兼容性。
程序员仅需要调用简单的JQ的AJAX方法,就可以实现复杂的AJAX功能。
- 少量代码,实现复杂功能
- 浏览器兼容性好,一处编写,处处执行
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
实现步骤:
-
导包
-
先创建一个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 + "]";
}
}
- 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):