JavaEE学习笔记 2024-1-18 --模块化Controller层、AJAX与JSON

« 上一篇

个人整理非商业用途,欢迎探讨与指正!!


文章目录

    • 11.模块化Controller层
    • 12.AJAX
      • 12.1使用场景
    • 13.JSON
      • 13.1如何使用后端发送JSON数据


11.模块化Controller层

将对应模块的Servlet写入到一个指定的模块中,模块化编程

使用switch方式

package com.qf.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

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 sun.rmi.transport.proxy.HttpReceiveSocket;

/**
 * Servlet implementation class EmpServlet
 */
@WebServlet("/emp/*")
public class EmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EmpServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		请求的url
		String requestURL = request.getRequestURL().toString();
		System.out.println(requestURL);
		String[] split = requestURL.split("/");
//		System.out.println(Arrays.toString(split));
//		获取到需要执行得Servlet方法
		String method = split[split.length-1];
		switch (method) {
		case "insert":
			insert(request,response);
			break;
		case "delete":
			delete(request,response);
			break;
		default:
			return;
		}
	}

	public void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("我是删除方法");
	}

	public void insert(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("我是添加方法");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

使用反射

@WebServlet("/dept/*")
public class DeptServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public DeptServlet() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String requestURL = request.getRequestURL().toString();
		String[] split = requestURL.split("/");
		String method = split[split.length-1];
		
//		当前类对象
		Class<? extends DeptServlet> clazz = this.getClass();
//		获取当前对象的方法
		try {
//			获取需要执行的方法
			Method declaredMethod = clazz.getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class);
//			启动暴力反射
			declaredMethod.setAccessible(true);
//			方法的反向执行
			declaredMethod.invoke(this, request, response);
		} catch (Exception e) {
			System.out.println("没有对应的方法");
		}
	}
	
	public void insert(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException  {
		System.out.println("添加方法");
	}

	private void delete(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException  {
		System.out.println("删除方法");
	}
	
	private void update(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException  {
		System.out.println("修改方法");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

12.AJAX

异步的JS与XML技术,可以实现JS和服务器之间的异步交互
异步交互:在不刷新网页的前提下,局部代码与服务器进行交互
AJAX不是新技术,也不是编程语言,就是一个使用JS和后端进行交互的技术

AJAX的优点:用户体验非常好;缺点:开发改错困难,不可回退

12.1使用场景

场景1:AJAX验证用户名是否重复

package com.qf.servlet;

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

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

/**
 * Servlet implementation class CheckNameServlet
 */
@WebServlet("/check")
public class CheckNameServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public CheckNameServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
//		模拟从数据库中获取数据
		ArrayList<String> list = new ArrayList<>();
		list.add("张三");
		list.add("李四");
		list.add("王五");
		list.add("tom");
		list.add("jack");
		list.add("rose");
		
//		何如判断name在list中
		boolean contains = list.contains(name);
//		false是可用 true是不可用
//		System.out.println(contains);
//		0不可用 1可用
		response.getWriter().print(contains?0:1);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>title>
	head>
	<body>
		<input type="text" id="username">
		<span id="msg">span>
		<script>
			window.onload = function(){
				let username = document.querySelector("#username");
				let msg = document.querySelector("#msg");
				
				username.onblur = function(){
					// 发送ajax请求
					// 1.创建AJAX对象
					let xhr = new XMLHttpRequest();
					
					// 2.封装AJAX的请求数据(形式为:xxxxServlet?xxxx=xxxx&xxx=xxx)
					xhr.open("GET","check?name="+username.value);
					
					// 3.发送请求
					xhr.send();
					
					// 4.AJAX的请求状态判断
					// readyState
						// 0:ajax创建但未初始化
						// 1:ajax创建完成但未发送请求
						// 2:ajax发送请求到服务器端
						// 3:ajax请求正在被处理
						// 4:ajax请求处理完成,可以使用ajax获取服务器响应的数据
					xhr.onreadystatechange = function(){
						if(xhr.status == 200 && xhr.readyState == 4){
							// 5.获取响应的数据
							let result = xhr.responseText;
							if(result == 0){
								msg.innerHTML = '用户名已存在';
								msg.style.color = 'red';
							}else{
								msg.innerHTML = '√';
								msg.style.color = 'green';
							}
						}
					}
				}
			}
		script>
	body>
html>

13.JSON

配合AJAX进行分离式开发中,数据的交互形式之一
JSON可以实现不同系统,不同语言之间的数据交互
JSON是一种数据格式,类似于JS中的{}对象

语法:
  {
   “key”:“value”,
   “key”:“value”,
   …
  }

数据体量小,可以做为数据传入的载体

13.1如何使用后端发送JSON数据

使用第三方工具(jar、依赖)
Gson
 谷歌发布
Jackson
 Springn内置的
FastJson
 阿里发布的

package com.qf.test;

import java.util.ArrayList;
import java.util.HashMap;

import org.junit.Test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

public class TestJSON {

	@Test
	public void test01() {
		System.out.println("helloworld");
	}
	
	@Test
	public void test02() {
		Gson gson = new Gson();
		
		String json = gson.toJson("helloworld");
		System.out.println(json);
	}
	
	@Test
	public void test03() {
		Gson gson = new Gson();
		
		String json = gson.toJson(new Dog(1,"李四"));
		System.out.println(json);
	}
	
	@Test
	public void test04() {
		ArrayList<Dog> dogs = new ArrayList<>();
		dogs.add(new Dog(1,"1"));
		dogs.add(new Dog(2,"2"));
		dogs.add(new Dog(3,"3"));
		dogs.add(new Dog(4,"4"));
		
		String json = new Gson().toJson(dogs);
		System.out.println(json);
	}
	
	@Test
	public void test05() {
		ArrayList<Dog> dogs = new ArrayList<>();
		dogs.add(new Dog(1,"1"));
		dogs.add(new Dog(2,"2"));
		dogs.add(new Dog(3,"3"));
		dogs.add(new Dog(4,"4"));
		
		int currPage = 10;
		
		HashMap<String,Object> map = new HashMap<>();
		map.put("dogs", dogs);
		map.put("page", currPage);
		
		String json = new Gson().toJson(map);
		System.out.println(json);
	}
	
	@Test
	public void test06() throws Exception {
		Dog dog = new Dog(1,"1");
		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(dog);
		System.out.println(json);
	}
}

你可能感兴趣的:(JavaEE,java-ee,笔记,ajax,json)