0


1月19号-Request和Response

二. 内容回顾

2.1 Servlet概述

  1. Servlet是一个java程序(动态资源), 运行在web服务器上面
  2. 接收浏览器请求,获取浏览器提交的请求数据(Servlet里面的request)浏览器---------------------->服务器端
  3. 响应数据给浏览器(Serlvet里面的response)浏览器<--------------------服务器端

2.2 Servlet体系结构

  • 顶层接口: Servlet
  • 抽象类: GenericServlet
  • 抽象类: HttpServlet
  • 关系: HttpServlet—>GenericServlet---->Servlet
  • 结论: 1. 在开发时,自定义servlet有三种方式.2. 浏览器发送的是http请求,推荐使用HttpServlet

2.3 HttpServlet

源码分析: HttpServlet的service方法内部的思路

  1. 获取浏览器的请求方式
  2. 根据请求方式的不同,去执行对应的doGet(req,resp)和doPost(req,resp)//1.获取请求方式: request请求对象,当然获取请求数据String method = request.getMethod();//2.if判断: 请求方式=="get",这样写不合理if(method.equals("Get")){this.doGet(request,response)}elseif(method.equals("Post")){this.doPost(request,response)}--------
  • 结论继承HttpServlet以后,重写doGet和doPost方法

三. 请求对象

3.1请求对象概述以及作用

  • 请求过程: 从浏览器到服务器的过程,称之请求过程浏览器-------请求过程: 提交请求数据------------------->服务器端
  • 请求数据: 使用请求对象request来处理
  • 请求对象的类型:HttpServletRequest(引用类型) request

3.2请求对象常用的方法

  • 第一类: 获取请求数据方法名称作用getParameter(“name属性的值”)获取单个输入框的值getParameterValues(“name属性的值”)获取复选框的值getParameterMap()获取的表单里面的所有数据Map<String,String[]> map = request.getParameterMap()map的key: name的属性值,比如: username, psw, lovemap的value: 用户输入的数据(用户名和密码)以及用户选择的数据(单选按钮,复选框)

前台代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>request parameter page</title>
</head>
<body>
        <!--
            form表单的方式提交数据
            http协议提交数据时: key=value的形式.
            所以form中的输入项必须得有name属性
            输入项没有name属性, 就不能提交数据到后台,所以后台获取的是null
        -->
        <form action="paramMapServlet" method="get">
            用户名: <input type="text" name="username"/>
            <br/>
            密&nbsp;&nbsp;&nbsp;码: <input type="password" name="psw"/>
            <br/>
            爱&nbsp;&nbsp;&nbsp;好:
            <input type="checkbox" name="love" value="comment">爱评论
            <input type="checkbox" name="love" value="study">爱学习
            <input type="checkbox" name="love" value="16k"/>拿高薪
            <input type="submit" value="提交数据"/>
        </form>
</body>
</html>

后台代码

package com.tedu.web;

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.util.Arrays;

/**
 * 1. 定义类ParamServlet 继承HttpServlet的方式
 *    作用: 获取浏览器提交的数据,以及响应数据给浏览器
 * 2. doGet方法: request,response
 *    request请求对象: 在服务器端,获取浏览器提交的请求数据的
 *    response响应数据: 响应数据到浏览器的
 *3. doPost方法: request,response
 *     request请求对象: 在服务器端,获取浏览器提交的请求数据的
 *     response响应数据: 响应数据到浏览器的
 */
@WebServlet("/paramServlet")//注意 : 路径必须加/, 不加/ tomcat启动就报错了
public class ParamServlet extends HttpServlet {
    /**
     * 作用: 接收浏览器发送的get
     * @param request: 获取请求数据,浏览器----->服务器
     * @param response: 响应数据,   浏览器<-----服务器
     * @throws ServletException
     * @throws IOException
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.根name的属性获取用户输入的用户名: username=jack
        // 因为name="username" 是写死的,但是用户名可以随意输入的值
        String userValue = request.getParameter("username");
        System.out.println("请求的用户名:"+userValue);
        //2.根据psw=1111
        String pswValue = request.getParameter("psw");
        System.out.println("请求的密码:"+pswValue);
        //3.love  多个值
        String[] loves = request.getParameterValues("love");
        System.out.println("请求的爱好:"+ Arrays.toString(loves));
        //1.获取表单提交的所有数据
        Map<String, String[]> map = request.getParameterMap();
        //2.遍历map
        //2.1 获取所有key
        Set<String> keys = map.keySet();
        //2.2遍历 set:  快捷键iter
        for (String key : keys) {
             //2.3 获取map的值
            String[] strings = map.get(key);
            System.out.println(key+":"+ Arrays.toString(strings));
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}
  • 第二类: 处理请求中文的乱码问题- 分析会出现请求中文的乱码问题?浏览器提交的中文数据的编码格式------>tomcat服务器的编码格式不一样比如: 小伙伴(意见)------不同-------->老师(方式)- 常见的编码格式, 推荐使用UTF-81.支持中文的编码格式: GBK​ 特点: 支持中文.不支持日文,韩文等等1. 万能的编码格式: utf-8 (UTF-8)特点: 支持所有字符,比如中文,韩文,日文,等等2. 西欧编码: ISO8859-1特点: 只支持欧美国家的字符,肯定不支持中文,韩文,日文等等- 解决乱码请求方式不一样,提交的请求数据的形式就不一样,所以根据不同的请求方式来处理乱码.1. get请求的中文:tomcat8版本以上: 自动处理了get请求的中文乱码问题.tomcat8版本以下: 代码处理get请求的中文乱码问题​ String vule = new String(​ “用户数据”.getBytes(“iso8859-1”),​ “utf-8”​ );2. post请求的中文:request.setCharacterEncoding(“utf-8”);注意: 上面的代码 必须放在方法的第一行.

3.3 案例: 常用的方法

  1. 获取请求参数的值的方法- 获取一个输入框的用户数据String value = request.getParameter(“name属性值”);- 获取复选框用户选择的数据String[] values = request.getParameterValues(“name属性值”);- 获取form表单提交的所有数据Map<String,String[]> map = getParameterMap();- 处理post请求的中文乱码问题(tomcat8以上不用处理get请求中文)request.setCharacterEncoding(“支持中文的编码格式,utf-8”);

四 响应对象

4.1 响应对象概述以及作用

  • 响应过程: 从服务器到浏览器响应数据的过程,就是响应过程web服务器------响应: 响应数据------>浏览器
  • 作用:主要处理响应数据以及重定向(稍后讲)
  • 类型HttpServletResponse(类型) response(对象)

4.2 常用方法

  • 字符流和字节流回顾- 字符流把c盘的图片文件拷贝到D盘?​ 答案: 不行, 字符流只能进行字符串的读写操作.- 字节流把c盘的图片文件拷贝到D盘?​ 答案: 可以的.- 将c盘的 文本文件,比如 a.txt 拷贝 到D盘推荐使用字符流, 字节流也可以- 结论:字符流只能进行字符串的读写操作, 字节流可以操作任意类型的文件
  • 第一类方法:响应数据方法(服务器—响应数据:与浏览器绑定的输出流–>浏览器)- 字符输出流的方式PrintWriter out = response.getWriter();out.writer(“字符串数据”); //out.println(“字符串数据”);- 字节输出流的方式ServletOutputStream out = response.getOutputStream();out.write(字节数据); //out.println(字节数据);
/**
 *  注解中:
 *  value特权属性: 当注解中,有且仅有一个value属性时,
 *                 value可以省略不写.
 */
@WebServlet(urlPatterns = "/demo2")
public class Demo2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //字节输出流响应数据
        //1. 获取字节输出流对象
        //OutputStream        out1 = response.getOutputStream();//多态写法
        ServletOutputStream out2 = response.getOutputStream();
        //2. 写方法, 响应数据
        String str = "hello 11111";//字符串
        byte[] bytes = str.getBytes();//字节数据
        out2.write(bytes);//字节数据
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  • 第二类方法: 处理响应中文数据的乱码问题- 处理字符流响应数据的乱码问题比如: response.setContentType(“text/html;charset=utf-8”);​ 服务器向浏览器响应文本数据, 文本的编码格式是utf-8比如: response.setContentType(“application/json;charset=utf-8”);​ 服务器向浏览器响应的json数据, json数据编码格式是utf-8- text/html(固定写法,不唯一):字符输出流向浏览器响应的文本或者html网页数据application/json(固定写法,不唯一):字符输出流向浏览器响应的json数据- charset = utf-8 (utf-8编码格式,不固定的, 推荐使用)注意: 放在方法的第一行- 代码如下:/** * 名为 [com.tedu.web.Demo2Servlet]和 [com.tedu.web.Demo2ServletEncode] 的servlet * 不能映射为一个url模式(url-pattern) [/demo2] * 原因: 一个访问路径 对应两个不同的servlet */@WebServlet(urlPatterns ="/code1")publicclassDemo1ServletEncodeextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{//1.处理响应中文的乱码问题// 字符输出流 resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("<a href='http://www.tedu.cn'>hello 字符流</a>");}}

第三类方法: 重定向方法

  • 重定向: 从一个资源跳转到另一个资源(比如:点击超链接跳转)
  • 方法:response.sendRedirect(“路径”);路径书写:绝对路径的书写方式
  • 需求一: 站外跳转从我们自己的网站重定向到达内官网
  • 需求二: 站内跳转从我们自己的网站重定向到自己网站的资源
package com.tedu.redirect;

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;

/**
* 需求一: 站外跳转
* 从我们自己的网站重定向到达内官网
* 1. 访问自己网站资源:http://localhost:8080/case2_response/outer
* 2. 代码内部: 重定向, 跳转到 "http://www.tedu.cn"
*/
@WebServlet("/outer")
public class ServletRedirectOuter extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1.处理响应中文的乱码问题
       response.setContentType("text/html;charset=utf-8");
       //2.重定向: 绝对路径
       String outerUrl = "http://www.tedu.cn";
       response.sendRedirect(outerUrl);
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request, response);
   }
}

4.3 案例

案例: 企业级项目用户管理平台,实现登录功能.

  • 步骤一: 创建一个web项目: UserSystem(usermanagerment)
  • 步骤二: 在web目录下面, 创建一个登录页面login.html
  • 步骤三: 创建一个LoginServlet,处理登录请求
  • 总结:login.html------->LoginServlet判断: 用户名和密码正确,重定向到main.html​ 用户名或者密码错误,提示用户错了,重新登录
  • 前端代码
main.html
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>index</title></head><body><!--http://localhost:8080/usersystem/index.html--><h1>欢迎您: 访问我的网站</h1></body></html>
============================
login.html登录页面
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>login page</title></head><body><divstyle="margin:auto;text-align: center;border: 1px solid blue;width: 500px;"><formaction="LoginServlet"method="post">
        用户名:<inputtype="text"name="username"/><br/>
        密 &nbsp;&nbsp;&nbsp;码<inputtype="password"name="psw"/><br/><inputtype="submit"value="登录"/></form></div></body></html>
  • 后端代码packagecom.tedu.web;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;/** * 实现登录功能: 获取用户输入的用户名和密码, 判断是否正确 */@WebServlet(urlPatterns ="/LoginServlet")publicclassLoginServletextendsHttpServlet{protectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{//1.处理请求中文的乱码问题 request.setCharacterEncoding("utf-8");//2.处理响应中文的乱码问题 response.setContentType("text/html;charset=utf-8");//3.获取用户输入的数据: 用户名和密码String user = request.getParameter("username");//用户名String password = request.getParameter("psw");//密码//4.进行判断,//4.1 如果用户名= admin , 密码= 111, 表示登录成功if(user.equalsIgnoreCase("admin")&& password.equals("111")){//成功以后,跳转到主页面, 使用重定向String indexUrl ="http://localhost:8080/usersystem/main.html";//url response.sendRedirect(indexUrl);//重定向跳转}else{//4.3 不正确, 表示登录失败,让用户重新登录,显示登录连接String info ="用户名或者密码错误,请重新登录!";String loginUrl ="http://localhost:8080/usersystem/login.html"; info+="<br/>";//第一层: 拼接换行 info+="<a href='"+loginUrl+"'>点击,重新登录</a>";//第二层: 拼接超链接 response.getWriter().println(info);}}}

五. Filter(理解)

5.1Filter概述

  • 实际生活过滤和拦截场景1. 场景: 渔网去捕鱼.​ 渔网的作用: 过滤水, 拦截鱼儿2. 场景: 高速公路的收费站​ 收费站的作用: 先拦截,交钱,放行​ 一般情况下: 北京—香港高速路, 很多个收费站北京高速<------------>收费站1<--------------收费站2<------------>香港高速1. 经过收费站时: 北京—>香港交钱了合理请求,放行2.经过收费站: 香港---->北京交钱了合理请求,放行3. 场景: 交警晚上查酒驾​ 交警的作用: 拦截小汽车,喝酒了,去局子做做,没有喝酒,放行
  • 过滤器介绍它是web开发的三大组件之一,它的主要作用: 对浏览器访问的资源进行拦截和放行- 拦截: 浏览器访问资源时-------->Filter: 拦截----->服务器的资源拦截: 静态资源和动态资源.- 放行:在过滤器里面进行判断,如果合理请求,就放行,如果非法请求,就不放行- 实际开发中:浏览器<--------->Filter1<------------>Filter2<----------->服务器1. 浏览器访问服务器的资源时,经过多个过滤器2. 浏览器向服务器发送请求; 请求过程,过滤器拦截3. 服务器向浏览器响应数据; 响应过程,过滤器拦截- 企业级开发,过滤器的场景1. 全局的post请求的中文乱码处理(案例)2. 进行敏感词汇过滤(案例) :浏览器—Filter:评论内容过滤---->服务器保存3. 进行权限校验浏览器—Filter:判断用户有没有权限---->服务器资源4. 等等在这里插入图片描述

5.2 Filter入门

  • 步骤一: 在创建的web项目,自定义一个类, 实现Filter接口
  • 步骤二: 在自定义类里面配置拦截路径
  • 步骤三: 在浏览器访问资源,进行测试packagecom.tedu;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;/** * 1. implements Filter 自定义一个过滤器 * 2. 拦截和放行 * 配置拦截路径: @WebFilter() */@WebFilter(urlPatterns ="/home.html")publicclassDemoFilter1implementsFilter{/** * 拦截和放行方法 * @param servletRequest: 请求对象 * @param servletResponse: 响应对象 * @param filterChain: 过滤器链, 可以实现放行 * @throws IOException * @throws ServletException */publicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain filterChain)throwsIOException,ServletException{System.out.println("拦截home.html");//2.测试放行 filterChain.doFilter(req,resp);}@Overridepublicvoiddestroy(){//执行一次,在服务器正常关闭执行}@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{//执行一次,在首次访问时执行}}

5.3 Filter的拦截路径配置

    1. 直接配置拦截资源名称:比如: /home.html, 只拦截home.html
    1. 扩展名拦截资源配置: *.html比如: *.html, 拦截所有后缀名为html的资源注意: 前面一定不要加 /2. 通配符拦截资源配置: /比如: / , 拦截所有资源 , * 匹配所有资源

5.4 过滤器链

  • 过滤器链介绍指的在开发中,配置了多个过滤器,多个过滤器构成链.实际场景: 哈喽单车链条,是不是一个一个的链子构成
  • 过滤器的执行顺序浏览器—>filter1--------->filter2—>服务器端资源
  • 注意:每个过滤器配置的拦截路径一定一样,才会形成过滤器链

5.5 案例

  • 需求: 处理全局的post请求的中文乱码问题
  • 思路:1. 定义一个过滤器,在里面: 处理post请求的中文乱码问题2. 拦截所有的servlet, 配置的拦截路径 /*
  • 代码如下packagecom.tedu.global;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;@WebFilter("/*")publicclassFilterGlobalimplementsFilter{publicvoiddestroy(){}publicvoiddoFilter(ServletRequest req,ServletResponse resp,FilterChain chain)throwsServletException,IOException{//1.处理post请求中文乱码问题HttpServletRequest request =(HttpServletRequest)req;//类型转换//2.获取浏览器提交方式String method = request.getMethod();//获取请求方式: get, postif(method.equalsIgnoreCase("post")){ request.setCharacterEncoding("utf-8");}//3.处理中文乱码 chain.doFilter(request, resp);}publicvoidinit(FilterConfig config)throwsServletException{}}
标签: java 服务器 前端

本文转载自: https://blog.csdn.net/caozhisanguo/article/details/122577955
版权归原作者 小码哥的进阶 所有, 如有侵权,请联系我们删除。

“1月19号-Request和Response”的评论:

还没有评论