一、HTTP

1. 概念

1.1 超文本传输协议

Hyper Text Transfer Protocol

1.2 传输协议

定义了客户端和服务器端通信时,发送数据的格式

1.3 特点:

  • 基于TCP/IP的高级协议
  • 默认端口号:80
  • 基于请求/响应模型的:一次请求对应一次响应
  • 无状态的:每次请求之间相互独立,不能交互数据

1.4 请求消息数据格式

1.4.1 请求行

请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求方式:
HTTP协议有7中请求方式,常用的有2种

GET:1. 请求参数在请求行中,在url后。2. 请求的url长度有限制的3. 不太安全
POST:1. 请求参数在请求体中2. 请求的url长度没有限制的3. 相对安全

1.4.2 请求头

客户端浏览器告诉服务器一些信息,请求头名称: 请求头值
常见的请求头:

1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2. Referer:http://localhost/login.html* 告诉服务器,我(当前请求)从哪里来?* 作用:1. 防盗链:2. 统计工作:

1.4.3 请求空行

空行,就是用于分割POST请求的请求头,和请求体的。

1.4.4 请求体(正文)

封装POST请求消息的请求参数

1.4.5 字符串格式

响应消息数据格式

POST /login.html HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://localhost/login.htmlConnection: keep-aliveUpgrade-Insecure-Requests: 1username=zhangsan

1.5 相应消息

服务器端发送给客户端的数据
数据格式:

     1. 响应行1. 组成:协议/版本 响应状态码 状态码描述2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。1. 状态码都是3位数字 2. 分类:1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码2. 2xx:成功。代表:2003. 3xx:重定向。代表:302(重定向),304(访问缓存)4. 4xx:客户端错误。* 代表:* 404(请求路径没有对应的资源) * 405:请求方式没有对应的doXxx方法5. 5xx:服务器端错误。代表:500(服务器内部出现异常)2. 响应头:1. 格式:头名称: 值2. 常见的响应头:1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据* 值:* in-line:默认值,在当前页面内打开* attachment;filename=xxx:以附件形式打开响应体。文件下载3. 响应空行4. 响应体:传输的数据

响应字符串格式

     HTTP/1.1 200 OKContent-Type: text/html;charset=UTF-8Content-Length: 101Date: Wed, 06 Jun 2018 07:08:42 GMT<html><head><title>$Title$</title></head><body>hello , response</body></html>

二、Request

1. request对象和response对象的原理

  • request和response对象是由服务器创建的。我们来使用它们
  • request对象是来获取请求消息,response对象是来设置响应消息

2. request对象继承体系结构

 ServletRequest      --  接口| 继承HttpServletRequest    -- 接口|  实现org.apache.catalina.connector.RequestFacade 类(tomcat)

3. request功能

3.1 获取请求消息数据

3.1.1 获取请求行数据

  • GET /ydh/demo1?name=zhangsan HTTP/1.1
  • 方法
 1. 获取请求方式 :GET* String getMethod()  2. (*)获取虚拟目录:/day14* String getContextPath()3. 获取Servlet路径: /demo1* String getServletPath()4. 获取get方式请求参数:name=zhangsan* String getQueryString()5. (*)获取请求URI:/day14/demo1* String getRequestURI():        /day14/demo1* StringBuffer getRequestURL()  :http://localhost/day14/demo1* URL:统一资源定位符 : http://localhost/day14/demo1    中华人民共和国* URI:统一资源标识符 : /day14/demo1                  共和国         6. 获取协议及版本:HTTP/1.1* String getProtocol()7. 获取客户机的IP地址:* String getRemoteAddr()

3.1.2 获取请求头数据

  • 方法:
 (*)String getHeader(String name):通过请求头的名称获取请求头的值Enumeration<String> getHeaderNames():获取所有的请求头名称

3.1.3 获取请求体数据

  • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
  • 步骤:
 1. 获取流对象BufferedReader getReader():获取字符输入流,只能操作字符数据ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据2. 再从流对象中拿数据

3.2 其他功能

  • 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
 1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=1232. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game3. Enumeration<String> getParameterNames():获取所有请求的参数名称4. Map<String,String[]> getParameterMap():获取所有参数的map集合中文乱码问题:* get方式:tomcat 8 已经将get方式乱码问题解决了* post方式:会乱码* 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
  • 请求转发:一种在服务器内部的资源跳转方式
 1. 步骤:1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 2. 特点:1. 浏览器地址栏路径不发生变化2. 只能转发到当前服务器内部资源中。3. 转发是一次请求
  • 共享数据
 * 域对象:一个有作用范围的对象,可以在范围内共享数据* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据* 方法:1. void setAttribute(String name,Object obj):存储数据2. Object getAttitude(String name):通过键获取值3. void removeAttribute(String name):通过键移除键值对
  • 获取ServletContext
 ServletContext getServletContext()

三、用户登录案例

1. 用户登录案例需求

 1.编写login.html登录页面username & password 两个输入框2.使用Druid数据库连接池技术,操作mysql,在数据库中创建一个user表3.使用JdbcTemplate技术封装JDBC4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

2. 开发步骤

  • 创建项目,导入html页面,配置文件,jar包
  • 创建数据库环境
CREATE DATABASE ydh;USE ydh;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,PASSWORD VARCHAR(32) NOT NULL);
  • 创建包cn.ydh.domain,创建类User
package cn.ydh.domain;/*** 用户的实体类*/public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}
  • 创建包cn.ydh.util,编写工具类JDBCUtils
     package cn.ydh.util;import com.alibaba.druid.pool.DruidDataSourceFactory;       import javax.sql.DataSource;import javax.xml.crypto.Data;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;     /*** JDBC工具类 使用Durid连接池*/public class JDBCUtils {private static DataSource ds ;static {     try {//1.加载配置文件Properties pro = new Properties();//使用ClassLoader加载配置文件,获取字节输入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化连接池对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取连接Connection对象*/public static Connection getConnection() throws SQLException {return  ds.getConnection();}}
  • 创建包cn.ydh.dao,创建类UserDao,提供login方法
     package cn.ydh.dao;import cn.ydh.domain.User;import cn.ydh.util.JDBCUtils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;      /*** 操作数据库中User表的类*/public class UserDao {//声明JDBCTemplate对象共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); /*** 登录方法* @param loginUser 只有用户名和密码* @return user包含用户全部数据,没有查询到,返回null*/public User login(User loginUser){try {//1.编写sqlString sql = "select * from user where username = ? and password = ?";//2.调用query方法User user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(), loginUser.getPassword());return user;} catch (DataAccessException e) {e.printStackTrace();//记录日志return null;}}}
  • 编写cn.ydh.web.servlet.LoginServlet类
     package cn.ydh.web.servlet;import cn.ydh.dao.UserDao;import cn.ydh.domain.User;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("/loginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置编码req.setCharacterEncoding("utf-8");//2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//4.调用UserDao的login方法UserDao dao = new UserDao();User user = dao.login(loginUser);//5.判断userif(user == null){//登录失败req.getRequestDispatcher("/failServlet").forward(req,resp);}else{//登录成功//存储数据req.setAttribute("user",user);//转发req.getRequestDispatcher("/successServlet").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}}
  • 编写FailServlet和SuccessServlet类
     @WebServlet("/successServlet")public class SuccessServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取request域中共享的user对象User user = (User) request.getAttribute("user");       if(user != null){//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");}}}@WebServlet("/failServlet")public class FailServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录失败,用户名或密码错误");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}
  • login.html中form表单的action路径的写法
    虚拟目录+Servlet的资源路径
  • BeanUtils工具类,简化数据封装
 用于封装JavaBean1. JavaBean:标准的Java类1. 要求:1. 类必须被public修饰2. 必须提供空参的构造器3. 成员变量必须使用private修饰4. 提供公共setter和getter方法2. 功能:封装数据2. 概念:成员变量:属性:setter和getter方法截取后的产物例如:getUsername() --> Username--> username3. 方法:1. setProperty()2. getProperty()3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

http、request和登录案例讲解相关推荐

  1. Request和Response-学习笔记02【请求转发和request共享数据、Request_获取ServletContext、request登录案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Request和Response-学习笔记01[Request_原理和继承体系.Request_获取请求数据][day01] Request和Resp ...

  2. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  3. 29.CSRF及SSRF漏洞案例讲解

    文章目录 CSRF&SSRF---漏洞案例讲解 1. CSRF---跨站请求伪造攻击 CSRF漏洞解释,原理 导图 原理详解 CSRF漏洞检测,案例,防御 防御方案 2. SSRF(服务器端请 ...

  4. 我爱Java系列---【登录案例】

    一.登录案例分析 二.实施流程 1.创建数据库web01,用户表user 代码: CREATE DATABASE web01; USE web01; CREATE TABLE USER( uid IN ...

  5. 【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))

    文章目录 1.cookie:再次时请求头携带cookie到服务端 2.登陆案例_记住我:js访问浏览器数据用document 3.session:根据sessionid,服务器才能找到session( ...

  6. 十三、MySQL存储过程相关知识总结 + 案例讲解(强化)

    一.存储过程VS函数 存储过程和函数:类似于java中的方法 好处: 1.提高代码的重用性 2.简化操作 二.存储过程 含义:一组预先编译好的SQL语句的集合,理解成批处理语句 1.提高代码的重用性 ...

  7. 用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

    简单的JavaWeb注册登录案例 1.注册页面register.html register 姓名: 电话: 邮箱: qq: 2.注册案例实现程序register.java /** * 注册案例实现程序 ...

  8. Android(java)学习笔记155:中文乱码的问题处理(qq登录案例)

    1. 我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed& ...

  9. JavaWeb--用户注册登录案例

    用户注册登录案例 1 用户登录 1.1 需求分析 1.2 环境准备 1.3 代码实现 2 用户注册 2.1 需求分析 2.2 代码编写 3 SqlSessionFactory工具类抽取 目标: 能够完 ...

最新文章

  1. 中科创星米磊:从五个方向筛选“硬科技”企业
  2. 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)
  3. 转载:关于错排的相关知识
  4. 把工程部署在tomcat的root路径下
  5. Codeforces-449B-Jzzhu and Cities(最短路变形)
  6. ARM指令集的最新版本包括针对JavaScript的优化
  7. 今天终于搞懂了:为什么Java的main方法必须是public static void?
  8. 给自己一个anchor,挑战不可能
  9. oracle数据库建语句吗,Oracle建表语句是什么_数据库
  10. 2020年互联网大厂中秋礼盒PK!看看你的礼盒怎么样
  11. 【图像分割】基于粒子群算法实现图像聚类分割附matlab代码
  12. vue+elementui 房贷计算器
  13. Linux监控工具vmstat命令详解
  14. 图像特征之SIFT、HOG、LBP
  15. Testng的简介和使用
  16. 013:Django商城项目规划与环境搭建
  17. 逻辑函数的两种标准形式
  18. 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
  19. 能提取HTML网页正文的网站,智能提取网页正文新方法
  20. 群晖服务器主板维修,没那么复杂 群晖DS213j内部拆解

热门文章

  1. 【JavaScript】计算24点
  2. 称球问题解析(2)-N球方法
  3. Java坦克大战 (四) 之子弹的产生
  4. camunda工作流开发实战------03 hello world
  5. AUTO CAD 形状、线段如何偏移?
  6. 下载谷歌浏览器插件网址
  7. 二次开发扩展能力,能帮助星图地球开发者平台实现什么?
  8. 「星图地球开发者平台」有灾害预警功能吗?
  9. 怎样把显示桌面图标放入任务栏?
  10. 台式计算机电源安装在哪里,如何样查看台式机电源配置