Javaweb05-Ajax


1、基于jQuery的Ajax

1.1 基本Ajax

参数 说明
url 请求地址
type 请求类型
data 请求参数
dataType 返回参数
success 成功处理函数
error 错误处理函数
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.4.1.min.js" ></script>
<script type="text/javascript">
	$(function(){
        //强调:基于javascript实现的ajax用法,比较繁琐,不需要掌握
        //需要掌握的是基于jQuery方式使用的Ajax
        //当用户登录,输入用户名后,失去焦点,校验登录用户名再系统中是否被使用
        $("#uname").blur(function(){
            //alert($(this).val());
            //获取输入的用户名,并实现非空校验
            var userName = $(this).val();
            if(userName == null || userName == ""){
                alert("用户名不能为空");
                return;
            }

            //基于jAuery的Ajax用法-基本用法
            $.ajax({
                "url" : "<%=request.getContextPath()%>/checkUserName",
                "type" : "post",
                "data" : {"userName" : userName},
                "dataType" : "text",
                "success" : function(data){
                    //alert(JSON.parse(data));
                    if(JSON.parse(data)){
                        $("#showMsg").html("用户名存在").css({"color":"red"});
                    }else{
                        $("#showMsg").html("用户名可用").css({"color":"#2ceb0a"});
                    }
                },
                "error" : function(){
                    $("#showMsg").html("未知错误");
                }
            }); 
</script>

1.2 get提交Ajax

语法:$.get(url,params,success);

//基于JQuery的Ajax用法-扩展用法1,简写Get方,Ajax请求
//语法:$.get(url,params,success)
$.get("<%=request.getContextPath()%>/checkUserName",{"userName":serName},function(data){
    if(JSON.parse(data)){
        $("#showMsg").html("用户名存在get").css({"color":"red"});
    }else{
        $("#showMsg").html("用户名可用get").css({"color":"#2ceb0a"});
    }
}); 

1.3 post提交Ajax

语法:$.post(url,params,success);

//基于JQuery的Ajax用法-扩展用法1,简写Get方,Ajax请求
//语法:$.post(url,params,success)
$.post("<%=request.getContextPath()%>/checkUserName",{"userName" : userName},function(data){
    if(JSON.parse(data)){
        $("#showMsg").html("用户名存在post").css({"color":"red"});
    }else{
        $("#showMsg").html("用户名可用post").css({"color":"#2ceb0a"});
    }
});

1.4 请求处理

checkUserName 对应的处理代码;通过Response返回结果,前端接收到结果并进行处理;

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //后台接收用户名,校验是否重复
    //获取用户参数
    String userName = req.getParameter("userName");
    System.out.println("AjaxServlet userName=>>"+userName);

    //定义返回的结果
    boolean result= false;

    //模拟调用业务,查询当前用户名再数据中是否有记录
    List userNames = Arrays.asList("kh96","kgc","Ajax");
    if(userNames.contains(userName)) {
        result = true;
    }

    //异步请求响应结果,注意println不可以用,返回的结果会带\n
    System.out.println("AjaxServlet result==>"+result);
    resp.getWriter().println(result);
}

2、登录请求处理,并展示数据

2.1 登录页面

loginAnime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>



登录页面



	
欢迎登录课工场KH96动漫管理系统
用户名:
用户密码:
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.4.1.min.js" ></script> <script type="text/javascript"> $(function(){ $("#uname").blur(function(){ //异步请求校验用户名 //基于jAuery的Ajax用法-基本用法 $.post("<%=request.getContextPath()%>/checkUserName",{"userName" :$("#uname").val()},function(data){ if(JSON.parse(data)){ $("#showMsg").html("用户名存在").css({"color":"#2ceb0a"}); }else{ $("#showMsg").html("用户名不存在").css({"color":"red"}); } }); }); $("form").submit(function(){ //用户名非空校验 var userName = $("#uname").val(); //alert(userName); if(userName == null || userName == ""){ alter("用户名不能为空"); //submi事件,接收false结果,会自动取消表单的提交 return false; } //密码非空 var userPwd = $("#upwd").val(); //alert(userPwd); if(userPwd == null || userPwd == ""){ alter("用户密码不能为空"); //submi事件,接收false结果,会自动取消表单的提交 return false; } //异步提交登录请求,如果交谈用户信息输入正确,提示登录成功,宁跳转到动漫管理首页,否则提示登录失败 $.post("<%=request.getContextPath()%>/loginAnime",{"userName" : userName,"userPwd":userPwd},function(data){ if(JSON.parse(data)){ alert("登录成功"); //请求后台获取动漫列表数据 //location.href = "<%=request.getContextPath()%>/animes"; //请求列表页面,使用Ajax解析json数据 location.href = "animeListJson.jsp"; }else{ alert("登录失败"); } }); //由于使用了Ajax进行了异步登录请求,此处表单就不能再提交,否者表达再提交会出错 return false; }); }); </script>

注意:再使用Ajaz提交表单时,一定要返回false,要不然表单会再提交一次;

2.2 存放数据

2.2.1 通过request域转递数据

AnimeServlet

public class AnimeServlet extends HttpServlet {

	private static final long serialVersionUID = -4726403189879316484L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 模拟从数据库获取动漫列表
		List animes = new ArrayList<>();
		animes.add(new Animes(961, "玄幻", "斗破苍穹", "土豆", "萧炎", "玄机科技", "2019-08-04"));
		animes.add(new Animes(962, "玄幻", "完美世界", "辰东", "石昊", "福煦影视", "2020-08-05"));
		animes.add(new Animes(963, "言情", "狐妖小红娘", "小新", "白月初", "腾讯动漫", "2021-08-06"));
		animes.add(new Animes(964, "言情", "秦时明月", "温世仁", "天明", "玄机科技", "2022-08-04"));
		animes.add(new Animes(965, "热血", "镇魂街", "许辰", "曹焱兵", "卢李工作室", "2018-08-04"));
		animes.add(new Animes(966, "热血", "雾山五行", "林魂", "闻人翊悬", "六道无鱼", "2018-08-04"));

				
		//将动漫集合放入request作用域
		req.setAttribute("animes", animes);
		
		//转发到动漫列表页面
		req.getRequestDispatcher("web5AjaxAndJquery/animeList.jsp").forward(req, resp);
		
	}	
}

2.2.2 将数据转成json格式响应

public class AnimeJsonServlet extends HttpServlet {

	private static final long serialVersionUID = -4726403189879316484L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 模拟从数据库获取动漫列表
		List animes = new ArrayList<>();
		animes.add(new Animes(961, "玄幻", "斗破苍穹", "土豆", "萧炎", "玄机科技", "2019-08-04"));
		animes.add(new Animes(962, "玄幻", "完美世界", "辰东", "石昊", "福煦影视", "2020-08-05"));
		animes.add(new Animes(963, "言情", "狐妖小红娘", "小新", "白月初", "腾讯动漫", "2021-08-06"));
		animes.add(new Animes(964, "言情", "秦时明月", "温世仁", "天明", "玄机科技", "2022-08-04"));
		animes.add(new Animes(965, "热血", "镇魂街", "许辰", "曹焱兵", "卢李工作室", "2018-08-04"));
		animes.add(new Animes(966, "热血", "雾山五行", "林魂", "闻人翊悬", "六道无鱼", "2018-08-04"));

		//将集合数据,转换为json字符串,返回给前端
		//阿里巴巴的fasejson,将集合转换为json字符串
		String animesJson = JSON.toJSONString(animes);
		
		System.out.println(animesJson);
		
		//响应
		resp.setContentType("text/html;charset=UTF-8");
		resp.setCharacterEncoding("UTF-8");
		resp.getWriter().print(animesJson);
		
	}	
}

3、获取并展示数据

3.1 通过EL表达式取出request域域中的数据

animeList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


	
		
		动漫主页
	
	
		

课工场KH96班动漫管理系统

名称: 作者: 分类:

style = "background-color: pink;" >
动漫详情列表
欢迎:  退出登录
编号 分类 名称 作者 主角 出品 时间 操作
${anime.animeId } ${anime.animeCategory } ${anime.animeNaem } ${anime.animeAuthor } ${anime.animeActor } ${anime.animeProduce } ${anime.animeTime } 修改    |    删除
   首页 |  <<上一页 |  下一页>> |  尾页 |  共 6 条  每页 10 条 当前第 1 页 / 共 1 页

3.2 直接通过jQuery添加子标签

animeListJson.jsp

//tbody部分

    



//处理成功返回的数据部分
"success": function(data){
    //确定数据动态显示的位置
    var $tbody = $("tbody");
    //alert(data);
    //数据解析

    // 隔行变色
    var count = 1;

    // 数据解析
    $(data).each(function(){
        // 定义颜色
        var bgColor = count % 2 == 0 ? "style='background-color:#ddd;'" : "";
        $("tbody").append(
            ""
            + "" + this.animeId + ""
            + "" + this.animeCategory + ""
            + "" + this.animeName + ""
            + "" + this.animeAuthor + ""
            + "" + this.animeActor + ""
            + "" + this.animeProduce + ""
            + "" + this.animeTime + ""
            + "修改  删除"
            + ""
        );
        count++;
    });
}

展示效果: