cgb2110-day18

一,response响应不同的数据

–1,响应JSON串

package cn.tedu.cgb2110boot03.response;

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

//Servlet充当服务器:接受请求Request + 做出响应Response
// http://localhost:8080/resp/servlet01?id=10&name=张三
@WebServlet("/resp/servlet01")
public class ResponseServlet01 extends HttpServlet {
    //如果是get请求,Servlet会自动调用doGet()
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //TODO 解析请求参数
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        //响应时使用的默认的字符集iso-8859-1,为了防止响应时的中文乱码问题,加以下代码
        response.setContentType("text/html;charset=utf8");
        //响应解析到的数据
        //2.获取字节流--写出数据????
//        ServletOutputStream out = response.getOutputStream();
//        //字节流只能写出字节int.byte[].如果想要写出字符串,必须把字符串变成byte[]---getBytes()
//        out.write(id.getBytes());
//        out.write(name.getBytes());
        //1.获取字符流--写出数据
        PrintWriter out = response.getWriter(); out.write(id);out.write(name);
        //String json= {"id":"10","name":"张三"} ;
        //使用转义符号把"转义成一个普通字符,因为JSON串的key和value必须被"包裹
        //String json= "{"id":"10","name":"张三"}" ;
        //动态拼接字符串--- "+id+"
        String json= "{"id":""+id+"","name":""+name+""}" ;
        out.println(json);//提供了一个换行写出的功能
    }
}

二,重定向

–1,概述

和请求转发的过程有点相似.
过程: 浏览器访问A,A告诉浏览器继续访问B,由B返回结果
特点: 两次请求两次响应, 浏览器的地址栏会变 ,两个request/response , 可以重定向到任何资源
实现: response.sendRedirect(“目标资源的访问规则”)

–2,测试

RedirectServlet

package cn.tedu.cgb2110boot03.response;

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 java.io.IOException;

@WebServlet("/redirect/servlet01")
public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("RedirectServlet...doGet()");
        //特点: 地址栏会变  +  两次请求两次响应两个request/response ???
        request.setAttribute("name","jack");
        //重定向--参数是目标的访问规则(目标资源没有任何要求)
        response.sendRedirect("/redirect/servlet02");
//        response.sendRedirect("http://www.baidu.com/");
    }
}

RedirectServlet02

package cn.tedu.cgb2110boot03.response;

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 java.io.IOException;

@WebServlet("/redirect/servlet02")
public class RedirectServlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("RedirectServlet02...doGet");
        System.out.println( request.getAttribute("name") );//null
    }
}

–3,总结

请求转发和重定向有什么区别???
请求转发: 是request对象的功能, 一次请求一次响应 , 地址栏不变, 同一个request,目的资源必须是同一个项目里的
重定向: 是response对象的功能, 两次请求两次响应 , 地址栏改变, 不同的request,目的资源没有要求

三,综合练习

–1,创建前端网页html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试前后端整合</title>
		<!-- 1.导入vue.js:离线或者在线两种导入方式 
		   <script src="vue.js"></script>
		-->
		<script src="http://unpkg.com/vue/dist/vue.js"></script>
		<script src="http://unpkg.com/axios/dist/axios.min.js"></script>
	</head>
	<body>
		<!-- 2.准备数据渲染区 -->
		<div id="app">
			<button @click="get()">点我获取数据</button>
			<h1>姓名: {{name}}</h1>
			<h1>年龄: {{age}}</h1>
		</div>
		<!-- 3.创建Vue对象 -->
		<script>
			new Vue({
				el:"#app", //挂载点
				data(){ //数据
					return {
						name:"",
						age:0
					}
				}   ,
				methods:{
					//ajax访问Servlet
					get(){
						//get方式传递参数的两种写法:直接拼在地址栏里或者用params描述
						// let url = "http://localhost:8080/test/servlet01?name=tony&age=18";
						// axios.get(url).then(
						let url = "http://localhost:8080/test/servlet01";
						axios.get(url,{ params:{name:'tony',age:18 } }).then(
						//axios.post(url, {name:'tony',age:18 } ).then(
							a => {
								//a保存着servlet程序返回的结果
								console.log(a);
								console.log(a.data);//tony18 ->{name: 'tony', age: '18'}
								//把从Servlet中获取的数据,利用起来
								this.name = a.data.name;
								this.age = a.data.age;
							}
						)
					}
				}
			})
		</script>
	</body>
</html>


–2,创建Servlet

接受请求,解析请求参数,做出响应

package cn.tedu.cgb2110boot03.axios;
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 java.io.IOException;
import java.io.PrintWriter;

//接受请求,解析请求参数,做出响应
@WebServlet("/test/servlet01")
public class ServletDemo extends HttpServlet {
    //处理get请求
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //放行 js访问后端Servlet程序 的请求
        response.setHeader("Access-Control-Allow-Origin","*");
        //1,解析请求参数
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        //2,给浏览器做出响应
        PrintWriter out = response.getWriter();
//        out.write(name+age); //这种格式不对,前后端交互数据的格式必须组织成json串才行!!
        //3,把name和age拼接成json串给前端返回
//        name=tony&age=18
//        {"name":"tony","age":"18"}
//        "{"name":"tony","age":"18"}"
        //在把name和age的值,动态拼接字符串
        String json= "{"name":""+name+"","age":""+age+""}" ;
        out.write(json);
    }
}


–3,测试

在这里插入图片描述

四,过滤器Filter

–1,概述

对资源访问时可以添加拦截的条件. 如果满足条件 才能访问 目标资源.如果不满足条件,目标资源将不允许被访问.
开发步骤:
1, 实现Filter接口,并用注解开发
2, 重写三个抽象方法,init() / destroy() / doFilter()核心方法
3, 配置过滤器的条件

–2,入门案例

package cn.tedu.cgb2110boot03.filter;

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

@WebFilter("/*")
public class Filter1 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter1...doFilter");
        chain.doFilter(req, resp);//放行请求,有这行代码就可以访问目标资源
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

–3,总结

在这里插入图片描述

–4,生命周期

package cn.tedu.cgb2110boot03.filter;

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

@WebFilter("/*") //所有请求,都会触发过滤器
public class Filter1 implements Filter {
    //生命周期三大阶段:初始化  服务   销毁
    //关闭服务器时,会自动触发, 只调用一次
    public void destroy() {
        System.out.println("Filter1...destroy");
    }
    //核心方法,主要用来配置过滤器的过滤规则,可以判断是否放行
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter1...doFilter");
        chain.doFilter(req, resp);//放行请求,有这行代码就可以访问目标资源
    }
    //启动项目时,就被主动加载了所有的过滤器, 只调用一次
    public void init(FilterConfig config) throws ServletException {
        System.out.println("Filter1...init");
    }
}

–5,过滤器的匹配规则

package cn.tedu.cgb2110boot03.filter;

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

//@WebFilter("/a/*")//按照指定的前缀来匹配
//@WebFilter("*.html")//按照指定的后缀来匹配
//@WebFilter("/1.html")//必须访问指定文件
@WebFilter("/*")//访问啥资源,都会触发过滤器
public class Filter2 implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤器2已经生效~");
        chain.doFilter(req, resp);
    }
    public void init(FilterConfig config) throws ServletException {

    }

}

–6,使用Filter的场景

//核心方法,主要用来配置过滤器的过滤规则,可以判断是否放行
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Filter1...doFilter");
        //Filter用处: 解决了所有Servlet的共性需求---处理中文乱码!!!(权限.缓存.日志..)
        //在访问所有Servlet前,先来把中文乱码问题解决一下
        resp.setContentType("text/html;charset=utf8");

        chain.doFilter(req, resp);//放行请求,有这行代码就可以访问目标资源
    }

五,扩展:Vue的钩子函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 Vue的生命周期</title>
		<script src="http://unpkg.com/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<h1>{{msg}}</h1>
		</div>
		<script>
			let vm = new Vue({
				el:"#app",
				data(){
					return{
						msg:'hello vue!'
					}
				},
				//vue生命周期的初始化阶段的钩子函数:
				beforeCreate(){//还没new Vue时触发的
					console.log('beforeCreate..');
				},
				created(){//刚new完Vue时触发的
					console.log('created..');
				} ,
				//vue生命周期的服务阶段的钩子函数:(挂载,更新beforeUpdate/updated)
				beforeMount(){//还没有解析插值表达式
					console.log('beforeMount..');
					console.log(this.$el);//获取el对应的dom节点的内容
				} ,
				mounted(){//刚解析插值表达式
					console.log('mounted..');
					console.log(this.$el);
				} ,
				//vue生命周期的销毁阶段的钩子函数:(销毁)
				//需要在浏览器的控制台输入vm.$destroy()才会执行销毁阶段
				beforeDestroy(){
					console.log('beforeDestroy..');
				},
				destroyed(){
					console.log('destroyed..');
				}
			})
		</script>
	</body>
</html>

六,复习

–1,数据库重点

事务 : 概念 / 四大特性
外键约束
多表联查( 笛卡尔积 / 连接查询!!! / 子查询!!! )
索引/视图(概念,分类,语法,执行计划/执行性能explain,优缺点)
SQL优化的方案

–2,前端重点!!!

Vue框架(概念, 特点, 指令, 组件化 , axios的语法/优缺点 , vue-cli , vue项目)
json串 / js对象 / js函数(传参,有返回值,调用)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>