Servlet-过滤器

过滤器Filter

概念:

        Filter过滤器,是Web三大组件之一。

        作用是将来访问服务器资源的时候,过滤器可以将请求拦截下来,完成一些特殊的操作之后,再将请求继续放行,完成后续 的功能

        一般可以用来完成一些通用的操作,比如:登录验证、统一的编码处理、敏感字符过滤

使用步骤

        1、导包

        2、编写过滤器

        3、完成过滤后,放行

package com.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ServletFilter")
public class ServletFilter extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.getWriter().write("你好!");
        
        System.out.println("servlet方法执行!");
    }
}
package com.web;

import javax.servlet.*;
import java.io.IOException;

public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化方法!");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("执行过滤的方法!");

        //设置格式
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        //将数据放行
        filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override
    public void destroy() {

        System.out.println("销毁方法!");

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <filter>
    <filter-name>demo1</filter-name>
    <filter-class>com.web.FilterDemo</filter-class>

<!--    //可以初始化配置需要被过滤器拦截的资源,可以配置、后缀、前缀、全路径-->
    <init-param>
      <param-name>excludedPaths</param-name>
      <param-value>*.js,*.css,*.ico</param-value>
    </init-param>

  </filter>

  <filter-mapping>
    <filter-name>demo1</filter-name>
<!--url-pattern    指的是会被过滤器拦截的地址-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

过滤器的生命周期

        1,init方法 : 服务器启动后,会创建Filter对象,调用init 方法,调用一次,用来加载资源

        2,doFilter方法 : 每次请求资源的时候,会执行这个方 法,可以执行多次

        3,destroy方法 : 服务器关闭,Filter对象被销毁执行此方 法,执行一次,用于释放资源

过滤器配置方法

        1,拦截具体资源 : /xxx.jsp 只有访问指定资源才被 过滤

        2,拦截目录:/user/* 只有user目录下的资源被过滤

        3,后缀名拦截: *.jsp 访问所有后缀名为jsp资源的时 候,会被过滤

        4,所有资源拦截 : /*

使用注解的方式配置过滤器

        使用方式 ,直接在类上加上 @WebFilter注解

        写法 :

                1,如果直接写过滤资源,直接在括号中写上资源 路径@WebFilter("/servletDemo01")

                2,如果希望过滤的时候,有不同的过滤方式,可 以加上 dispatcherTypes属性值

                @WebFilter(value = "/servletDemo01",dispatcherTypes = DispatcherType.FORWARD)

                DispatcherType的值 :

                        FORWARD :将来只有转发的请求,才会 被过滤

                        INCLUDE :包含访问资源就被过滤

                        REQUEST :默认值,浏览器的请求会被过 滤

                        ASYNC: 异步访问资源

                        ERROR :错误跳转资源被过滤

过滤器链(多个过滤器)

        执行顺序 :

                如果配置两个过滤器,A和B

                注解方式:服务器会根据过滤器的名称,完成顺序执 行,xml中,会根据filte-mapping的位置,决定执行顺序

                1,执行过滤器A

                2,执行过滤器B

                3,执行请求的资源

                4,执行过滤器B

                5,执行过滤器A

package com.web;

import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;

//@WebFilter(value = "/ServletFilter",dispatcherTypes = DispatcherType.FORWARD)
@WebFilter("/ServletFilter")
public class FilterDemo1 implements Filter {
    public void init(FilterConfig config) throws ServletException {
        System.out.println("初始化方法!");
    }

    public void destroy() {
        System.out.println("销毁方法!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("1、执行过滤器A的前置方法!");

        //设置格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //将数据放行
        chain.doFilter(request, response);

        //后置方法
        System.out.println("2、过滤器A的后置方法!");
    }
}
package com.web;

import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebFilter("/ServletFilter")
public class FilterDemo2 implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {

        System.out.println("3、执行过滤器B的方法!");

        chain.doFilter(request, response);

        System.out.println("4、过滤器B的后置方法!");
    }
}

监听器Listener

        Listener监听器是web的三大组件之一,主要用来监听一些 指定的操作

        事件监听机制 :

                事件 :要监听的某件事

                事件源: 事件发生的位置

                监听器: 就是一个对象

                注册监听 :绑定事件、事件源、监听器,当事件发生 后,完成指定的操作

                监听器的方法:监听器有很多终端,以HttpSessionListener举例

                        sessionCreated :创建session对象触发这个方 法

                        sessionDestroyed :session被销毁触发这个方法

        统计在线人数:

                使用HttpSessionListener完成

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Listener监听器</title>
</head>
<body>

    <h1>当前有
    ${pageContext.request.servletContext.getAttribute("onlineCount")}
        人在线
    </h1>

</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<!--    配置监听器-->
<listener>
    <listener-class>com.web.ListenerDemo1</listener-class>
</listener>

<!--    配置session销毁时间-->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

</web-app>
package com.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebListener
public class ListenerDemo1 implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

    public ListenerDemo1() {
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        /* This method is called when the servlet context is initialized(when the Web application is deployed). */
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        /* This method is called when the servlet Context is undeployed or Application Server shuts down. */
    }

    //Session被创建就会被执行
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        /* Session is created. */
        //先获取session,在通过session获取ServletContext域对象
        ServletContext servletContext = se.getSession().getServletContext();

        //获取域对象中的在线人数,将来在域对象中,会指定一个变量,来存放在线人数
        Integer onlineCount = (Integer) servletContext.getAttribute("onlineCount");

        //如果获取到的数据是null的话,说明没人登录,是第一次访问网站,那么就将在线人数设为1
        if (onlineCount == null){
            onlineCount = new Integer(1);
        }else {
            //已经有人访问网站了,那么onlineCount就不为null
            onlineCount = onlineCount + 1;
        }
        servletContext.setAttribute("onlineCount",onlineCount);

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        /* Session is destroyed. */
        //先获取session,在通过session获取ServletContext域对象
        ServletContext servletContext = se.getSession().getServletContext();

        //获取域对象中的在线人数,将来在域对象中,会指定一个变量,来存放在线人数
        Integer onlineCount = (Integer) servletContext.getAttribute("onlineCount");

        //如果获取到的数据是null的话,
        if (onlineCount == null){
            onlineCount = new Integer(0);
        }else {
            //已经有人访问网站了,那么onlineCount就不为null,人走了数量减1
            onlineCount = onlineCount - 1;
        }
        servletContext.setAttribute("onlineCount",onlineCount);

    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is added to a session. */
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is removed from a session. */
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is replaced in a session. */
    }
}

登录权限判断案例

        项目中,用户登录之后,才能进入某些指定的页面,如 果用户没登录,或者注销之后,就不能继续访问有权限的页 面

         login.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>

    <h1>登录页面</h1>
    <form action="/test/loginServlet" method="post">
        用户名:<input type="text" name="username">
        <br>
        <br>
        密  码:<input type="password" name="password">
        <br>
        <input type="submit" value="登录">

    </form>

</body>
</html>

error.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>登录失败</title>
</head>
<body>

    <h1>你还没有登录,没有访问权限</h1>
    <a href="login.jsp">去登录</a>

</body>
</html>

success.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
    <h1>这是主页,登录之后才能访问</h1>
    <h1>${user},欢迎你</h1>
    <h1><a href="/test/logoutServlet">注销</a></h1>
</body>
</html>

ServletLogin

package com.web.login;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/loginServlet")
public class ServletLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //获取前端请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("admin".equals(username) && "123456".equals(password)) {
            //登录成功
            request.getSession().setAttribute("user", username);
            response.sendRedirect("/test/success.jsp");
        } else {
            response.sendRedirect("/test/error.jsp");
        }
    }
}

ServletLogout

package com.web.login;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

import static javax.swing.text.html.CSS.getAttribute;

@WebServlet("/logoutServlet")
public class ServletLoginOut extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //注销
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");

        if (user != null){
            //如果有用户信息移除,跳转到登录页面
            session.removeAttribute("user");
            response.sendRedirect("/test/login.jsp");
        }else {
            response.sendRedirect("/test/login.jsp");
        }
    }
}

LoginFilter

package com.web.login;

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/success.jsp")
public class FilterLogin implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //过滤请求
        //方法中的参数是ServletRequest,获取session要使用HttpServletRequest
        //要做一个转换
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            //如果用户为null,表示未登录,就跳转到错误界面
            resp.sendRedirect("/test/error.jsp");
        }
        //放行
        chain.doFilter(req,resp);
    }


    }

AJAX+JSON

AJAX

概念:

        AJAX = Asynchronous JavaScript And XML. 异步的 JavaScript和XML

        AJAX 并非编程语言。

        AJAX 仅仅组合了:

                浏览器内建的 XMLHttpRequest 对象(从 web 服务器请 求数据)

                 JavaScript 和 HTML DOM(显示或使用数据)

                Ajax 是一个令人误导的名称。Ajax 应用程序可能使用 XML 来传输数据,但将数据作为纯文本或 JSON 文本传输 也同样常见。

                Ajax 允许通过与场景后面的 Web 服务器交换数据来异步更 新网页。这意味着可以更新网页的部分,而不需要重新加载 整个页

        异步和同步的概念 :

                指的是建立在客户端和服务器相互通信的基础上

                ajax指的是无需重新加载整个网页,就能够实现网页更 新的技术

        实现方式:

        原生JS实现

                使用XMLHttpRequest 对象

                所有现代浏览器都支持 XMLHttpRequest 对象。

          XMLHttpRequest对象方法
方法描述
new XMLHttpRequest()创建新的 XMLHttpRequest 对象。
abort()取消当前请求。
getAllResponseHeaders()返回头部信息。
getResponseHeader()返回特定的头部信息。
open(methodurlasyncuserpsw)

规定请求。

  • method:请求类型 GET 或 POST
  • url:文件位置
  • async:true(异步)或 false(同步)
  • user:可选的用户名
  • psw:可选的密码
send()向服务器发送请求,用于 GET 请求。
send(string)向服务器发送请求,用于 POST 请求。
setRequestHeader()将标签/值对添加到要发送的标头。
    XMLHttpRequest 对象属性 
属性描述
onload定义接收到(加载)请求时要调用的函数。
onreadystatechange定义当 readyState 属性发生变化时调用的函数。
readyState

保存 XMLHttpRequest 的状态。

  • 0:请求未初始化
  • 1:服务器连接已建立
  • 2:请求已收到
  • 3:正在处理请求
  • 4:请求已完成且响应已就绪
responseText以字符串形式返回响应数据。
responseXML以 XML 数据返回响应数据。
status

返回请求的状态号

  • 200: "OK"
  • 403: "Forbidden"
  • 404: "Not Found"

如需完整列表请访问 Http 消息参考手册

statusText返回状态文本(比如 "OK" 或 "Not Found")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="text">

<button onclick="fun()">
    点击发送请求
</button>

</body>
<script>
    function fun(){

        // 创建 XMLHttpRequest 对象
        const xhttp = new XMLHttpRequest();

        // 定义回调函数
        // xhttp.onload = function() {
        //     // 您可以在这里使用数据
        // }

        // 发送请求
        xhttp.open("GET", "/test/ajaxServlet?username=jack",false);
        xhttp.send();

        //拿到响应的数据
        xhttp.onreadystatechange = function (){
            //表示有响应,且成功响应
            if (this.readyState == 4 && this.status == 200){
                //拿到响应的数据
                var text = this.responseText;
                alert(text);
            }
        }

    }




</script>
</html>
package com.web.ajax;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ajaxServlet")
public class ServletAjax extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String username = request.getParameter("username");
        System.out.println("后台接收到发送过来的Ajax:" + username);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        response.getWriter().write("hello.ajax");
    }
}

表单数据提取

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    用户名:<input type="text" name="username">

    <button onclick="fun()">
        点击发送请求
    </button>

</body>
<script>
    function fun(){

        // 创建 XMLHttpRequest 对象
        const xhttp = new XMLHttpRequest();
       let inputElement = document.querySelector("input");
       var username = inputElement.value;

        // 定义回调函数
        // xhttp.onload = function() {
        //     // 您可以在这里使用数据
        // }

        // 发送请求
        xhttp.open("GET", "/test/ajaxServlet?username="+username,true);
        xhttp.send();

        //拿到响应的数据
        xhttp.onreadystatechange = function (){
            //表示有响应,且成功响应
            if (this.readyState == 4 && this.status == 200){
                //拿到响应的数据
                var text = this.responseText;
                alert(text);
            }
        }

    }




</script>
</html>

多数据提取

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!--    用户名:<input type="text" name="username">-->
用户名:<input type="text" class="username"><br>
密码:<input type="password" class="password">

    <button onclick="fun()">
        点击发送请求
    </button>

</body>
<script>
    function fun(){

        // 创建 XMLHttpRequest 对象
        const xhttp = new XMLHttpRequest();
       let userNameEle = document.querySelector(".username");
       let passwordEle = document.querySelector(".password");
       var username = userNameEle.value;
       var password = passwordEle.value;

        // 定义回调函数
        // xhttp.onload = function() {
        //     // 您可以在这里使用数据
        // }

        // 发送请求
        xhttp.open("GET", "/test/ajaxServlet?username="+username+"&password="+password,true);
        xhttp.send();

        //拿到响应的数据
        xhttp.onreadystatechange = function (){
            //表示有响应,且成功响应
            if (this.readyState == 4 && this.status == 200){
                //拿到响应的数据
                var text = this.responseText;
                alert(text);
            }
        }

    }




</script>
</html>

package com.web.ajax;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/ajaxServlet")
public class ServletAjax extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("后台接收到发送过来的Ajax" );
        System.out.println("用户名:"+username);
        System.out.println("密码::"+password);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        response.getWriter().write("hello.ajax");
    }
}

通过JQuery实现

        实现语法:

                $.ajax({

                        url:请求地址

                        type:请求方法 get/post

                        data:表示请求的数据{"键":"值","键":"值"}

                        success:function(resp){

                                请求成功后,返回的数据

                        },

                        error:function(){

                        },

                        dataType:响应的数据类型“JSON”

                })

语法2:

        $.get(

        url:待载入页面的URL地址

        data:待发送 Key/value 参数。

        callback:载入成功时回调函数。

        type:返回内容格式,xml, html, script, json, text, _default。

        )

语法3:post请求

        $.post(

        url:待载入页面的URL地址

        data:待发送 Key/value 参数。

        callback:载入成功时回调函数。

        type:返回内容格式,xml, html, script, json, text, _default。

        )

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 用户名:<input type="text" class="username">
 密码: <input type="password" class="password">
 <button onclick="fun()">发送请求</button>
 <div></div>
</body>
<script src="./js/jquery-3.3.1.js"></script>
<script>
 function fun(){
 //document.querySelector(".username").value;
 var username = $(".username").val(); //
 var password = $(".password").val();
 /**
 $.ajax({
 url:"ajaxServlet", //请求资源地址
 type:"get", //请求的方法
 data:{"username":username,"password":password},//携带的数据
 success:function (resp){ //resp表示响应的结果
 //document.querySelector("div").innerHTML = resp;
 $("div").html(resp);
 }
 })
 */
 /**$.get("ajaxServlet",
 {"username":username,"password":password},
 function (resp){ //resp表示响应的结果
 //document.querySelector("div").innerHTML = resp;
 $("div").html(resp);
 })
 */
 $.post("ajaxServlet",
 {"username":username,"password":password},
 function (resp){ //resp表示响应的结果
 //document.querySelector("div").innerHTML = resp;
 $("div").html(resp);
 })
 }
</script>
</html

JSON

JSON: JavaScript Object Notation(JavaScript 对象标记 法)。 JSON 是一种存储和交换数据的语法。 JSON 是通过 JavaScript 对象标记法书写的文本。

交换数据

        当数据在浏览器与服务器之间进行交换时,这些数据只能是 文本。

         JSON 属于文本,并且我们能够把任何 JavaScript 对象转换 为 JSON,然后将 JSON 发送到服务器。

        我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。

        以这样的方式,我们能够把数据作为 JavaScript 对象来处 理,无需复杂的解析和转译。

        

         为什么使用 JSON?

                因为 JSON 格式仅仅是文本,它能够轻松地在服务器浏览器 之间传输,并用作任何编程语言的数据格式。

                JavaScript 提供內建函数把以 JSON 格式写的字符串转换为 原生 JavaScript 对象:

转换方法

JSON.stringify()         将js对象转为JSON格式字符串

JSON.parse()         将JSON格式字符串,转为js对象

JSON语法规则

JSON 语法衍生于 JavaScript 对象标记法语法:

数据在名称/值对中

数据由逗号分隔

花括号容纳对象

方括号容纳数组

有效的数据类型

在 JSON 中,值必须是以下数据类型之一:

字符串         { "name":"Bill" }

数字         { "age":30 }

对象        (JSON 对象) {"employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" }}

数组         {"employees":[ "Bill", "Steve", "David" ]}

布尔         { "sale":true }

Null         { "middlename":null }

json数据格式的几种常用写法 :

//普通的java对象转为json字符串的格式
 let user = {"username":"jack","password":"123456"};
 let username12 = user.username;
 console.log(username);
 //java中list集合的写法
 var users = [
 {"username":"jack","password":"123456"},
 {"username":"tom","password":"11111"},
 {"username":"lucy","password":"33333"}
 ]
 var username1 = users[0].username;
 for (let i = 0; i < users.length; i++) {
 let user = users[i];
 console.log(user.username)
 }
 //java中map转为json的写法
 var usermap = {
 "user1":{"username":"jack","password":"123456"},
 "user2":[
 {"username":"jack","password":"123456"},
 {"username":"tom","password":"11111"},
 {"username":"lucy","password":"33333"}
 ]
 }
 var username2 = usermap.user1.username;
 var username2 = usermap.user2[0].username;

JSON和JAVA对象的转换

        使用JSON解析器 :jsonlib、fastjson(阿里巴巴)、 jackson(spring)

        在Java中将对象、集合 转为JSON

json转java对象

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
 <version>2.9.8</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jac
 <dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-core</artifactId>
 <version>2.9.8</version>
 </dependency>

        1,导入jar包依赖 jackson相关

         2,创建核心对象 ObjectMapper

        3,调用ObjectMapper对象方法,进行转换

//先定义json字符串
 String userJson = "{\"username\":\"jack\",\"password\":\"123456\
 //2,创建核心对象 ObjectMapper
 ObjectMapper objectMapper = new ObjectMapper();
 //3,调用ObjectMapper对象方法,进行转换
 User user = objectMapper.readValue(userJson, User.class);

JAVA对象转Json字符串

        1,导入jar包依赖 jackson相关

        2,创建核心对象 ObjectMapper

        3,调用ObjectMapper对象方法,进行转换

                核心方法 writeValue

                        参数 : File :将对象转成的json字符串,保 存在指定的文件中

                                Writer:将对象转成json字符串,并 将json字符串读取到字符输出流                                 outputStream : 将对象转成json字 符串,并将json字符串读取到字节输出流                                 writeValueAsString(object) : 将对象直 接转为json字符串

                对象常用注解

                // @JsonFormat(pattern = "yyyy-MM-dd") 格式化日期类型

                @JsonIgnore 忽略某个属性,加了之后, 将来json字符串中,不显示这个属性

public class User {
 private String username;
 private String password;
// @JsonFormat(pattern = "yyyy-MM-dd")
 @JsonIgnore
 private Date birthday;
 public User() {
 }
 public User(String username, String password) {
 this.username = username;
 this.password = password;
 }
 public User(String username, String password, Date birthday) {
 this.username = username;
 this.password = password;
 this.birthday = birthday;
 }
 @Override
 public String toString() {
 return "User{" +
 "username='" + username + '\'' +
 ", password='" + password + '\'' +
 ", birthday=" + birthday +
 '}';
 }
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
//先定义java对象
 User user1 = new User("jack", "123");
 //2,创建核心对象 ObjectMapper
 ObjectMapper objectMapper = new ObjectMapper();
 //3,调用ObjectMapper对象方法,进行转换
 //{"username":"jack","password":"123"}
 String s = objectMapper.writeValueAsString(user1);
 System.out.println(s);
 //使用objectMapper将list转为json字符串
 ArrayList<User> userList = new ArrayList<>();
 userList.add(new User("jack", "123"));
 userList.add(new User("tom", "123456"));
 userList.add(new User("lucy", "55555"));
 //创建ObjectMapper
// ObjectMapper objectMapper = new ObjectMapper();
// //调用方法
// String s = objectMapper.writeValueAsString(userList);
// System.out.println(s);
 HashMap<String, Object> map = new HashMap<>();
 map.put("user",new User("jack", "123"));
 map.put("userList",userList);
 //转换格式
 ObjectMapper objectMapper = new ObjectMapper();
 String s = objectMapper.writeValueAsString(map);
 System.out.println(s);

将list中的用户信息,通过ajax展示到表格中

@WebServlet("/servletUser")
public class ServletUser extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse re
 ArrayList<User> userList = new ArrayList<>();
 userList.add(new User("jack", "123",new Date()));
 userList.add(new User("tom", "123456",new Date()));
 userList.add(new User("lucy", "55555",new Date()));
 ObjectMapper objectMapper = new ObjectMapper();
 //调用方法
 String s = objectMapper.writeValueAsString(userList);
 response.getWriter().write(s);
 }
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse
 this.doGet(request, response);
 }
}
<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="UTF-8">
 <title>Title</title>
 </head>
 <body>
 <table border="1px" cellspacing="0" cellpadding="10px">
 <tr>
 <th>用户名</th>
 <th>密码</th>
 <th>生日</th>
 </tr>
 </table>
 <button>点击获取数据</button>
 </body>
 <script src="./js/jquery-3.3.1.js"></script>
 <script>
 $(function (){
 //通过jquery添加点击事件
 // $("button").click(function (){
 $.ajax({
 url: "servletUser",
 type: "get",
 success:function (resp) {
 //先把响应的JSON字符串,转为JS对象
 let users = JSON.parse(resp);
 //遍历转换过后的js对象
 for (let i = 0; i < users.length; i++) {
 console.log(users[i]);
 //创建一个tr节点,并将需要展示的内容写在tr的td中
 var trele = $("<tr>\n" +
 " <td>"+ users[i].username +"</td>\n"
 " <td>"+ users[i].password +"</td>\n"
 " <td>"+ users[i].birthday +"</td>\n"
 " </tr>")
 //通过表格节点添加tr节点
 $("table").append(trele);
 }
 }
 })
 // })
 })
 </script>
</html>

异步验证用户名信息

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 <h1>修改密码</h1>
 <form action="registerServlet" method="post">
 用户名:<input type="text" name="username" placeholder="请输入用户名"
 原密码: <input type="password" name="oldpassword"> <span></span> <b
 新密码: <input type="password" name="password"> <span></span> <br>
 重复密码: <input type="password" name="repassword"> <span></span> <
 <input type="submit" value="注册">
 </form>
</body>
<script src="./js/jquery-3.3.1.js"></script>
<script>
 //用户名提交的失去焦点事件
 $("input[name='username']").blur(function (){
 //获取输入框的用户名
 var username = $("input[name='username']").val();
 console.log(username);
 $.ajax({
 url:"registerServlet",
 type:"post",
 data:{"username":username},
 success:function (response){
 // console.log(response);
 if (response.userExist){
 $(".usernameText").html(response.userInfo + "√");
 $(".usernameText").css("color","green");
 }else {
 $(".usernameText").html(response.userInfo + "×");
 $(".usernameText").css("color","red");
 }
 },
 dataType:"json"
 })
 })
</script>
</html>
@WebServlet("/registerServlet")
public class ServletRegister extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse re
 request.setCharacterEncoding("utf-8");
 response.setContentType("application/json;charset=utf-8");
 //获取请求数据
 String username = request.getParameter("username");
 System.out.println(username);
 //创建一个map用来存放响应消息
 HashMap<String, Object> map = new HashMap<>();
 if (username == "" || username ==null){
 map.put("userExist",false);
 map.put("userInfo","请输入用户名");
 }else {
 //逻辑判断
 if ("jack".equals(username)){
 map.put("userExist",true);
 map.put("userInfo","用户名存在");
 }else {
 map.put("userExist",false);
 map.put("userInfo","用户名不存在");
 }
 }
 //将map响应回去
 ObjectMapper objectMapper = new ObjectMapper();
 //直接传入Writer和map参数响应即可
 objectMapper.writeValue(response.getWriter(),map);
 }
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse
 this.doGet(request, response);
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值