一、HTTP协议

1、HTTP协议介绍

IP、端口、协议(TCP和UDP)。Socket编程。

HTTP协议:属于应用层的协议,底层使用的依然是TCP。

HTTP:超文本传输协议。主要应用在互联网中。

主流的协议:HTTP(1.0、1.1、2.0)、HTTPS。

HTTP协议在规定:客户端(浏览器)与服务器(TOMCAT)之间的通信的规则。

请求Request:客户端主动发送数据到服务器(页面上点击超链接、浏览器地址栏输入域名访问、提交表单等等)。

响应Response:服务器基于客户端本次的请求给客户端回送的数据。

2、HTTP协议细节

请求和响应都分为三部分内容:

  • 请求:

    • 请求行:协议(http1.1)、请求方式(GET、POST)、请求的url
    • 请求头:由key:value组成的数据对
    • 请求体:只有请求方式是POST的时候,客户端输入的数据才会在请求体中。
  • 响应:
    • 响应行:状态码(1xxx~5xx)、响应使用的协议
    • 响应头:由key:value组成
    • 响应体:服务器给客户端发送的内容

二、Servlet技术

1、Servlet介绍

Servlet:它是一套规范,用于规定在Java中如何去处理客户端的请求,以及如何给客户端响应数据。如何针对HTTP协议去处理请求和响应的那三部分内容。

2、WEB服务器(容器)

基于Servlet开发的JavaEE程序最终需要交给tomcat运行。负责运行JavaEE项目的服务器被称为WEB应用服务器或者WEB容器(服务器中间件)。

由于Servlet接口是顶层的接口,在开发的Servlet程序的时候一般都会基于底层的HttpServlet类进行相关程序的实现。

提供的HttpServlet类,它是能够针对客户端基于HTTP协议发送的请求进行处理,并且可以基于Http协议给客户端响应数据。HttpServlet它底层针对的HTTP协议给实现的一套Servlet规范。

3、编写简单的Servlet程序

JavaWEB项目的目录结构:

​ 项目名:

​ src: 存放项目的源代码

​ web(WebContent):

​ html文件

​ CSS文件

​ js文件

​ WEB-INF : 目录下的所有的内容,在客户端无法直接访问,在本项目内部可以通过程序去访问跳转

​ classes:src中源代码被编译之后的class文件

​ lib:存放项目需要的第三方的jar包

​ web.xml:当前这个项目的唯一配置文件

项目最终需要交给tomcat运行,在tomcat中发布的是web(WebContent)文件夹下的所有内容。就是web文件夹直接复制到tomcat的webapps目录下,然后将web文件夹名修改为指定的名称(项目名)。

开发简单的Servlet程序的步骤:

  1. 定义类继承HttpServlet

    public class DemoServlet extends HttpServlet {}
    
  2. 在类中复写doGet和doPost方法

    public class DemoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
    }
    
  3. 在项目的web.xml文件中配置当前的servlet程序

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--  配置Servlet  --><servlet><servlet-name>demoServlet</servlet-name><servlet-class>com.neusoft.web.DemoServlet</servlet-class></servlet><!--  配置DemoServlet是处理哪个请求的  --><servlet-mapping><servlet-name>demoServlet</servlet-name><url-pattern>/abc</url-pattern></servlet-mapping></web-app>
    

启动tomcat,访问测试:

4、解释Servlet访问过程

  1. 编写的web项目(html、css、js、java程序),然后将项目部署到tomcat中。

  2. 启动tomcat,tomcat会加载当前需要tomcat运行的所有项目

  3. tomcat会识别项目中的唯一配置文件web.xml,tomcat就会知道当前项目中配置的所有的相关类等内容。

  4. tomcat会对项目进行相关的初始化操作,保证项目可以被正常的运行

  5. 通过浏览器访问当前这个项目,如果没有指定访问项目具体的哪个路径(资源),默认访问的项目的欢迎页

    可以在自己项目的web.xml文件中配置,如果没有配置使用tomcat/conf/web.xml文件配置的相关的欢迎页

    <welcome-file-list><welcome-file>demo.html</welcome-file>
    </welcome-file-list>
    
  6. 如果通过浏览器访问项目中指定的资源(html、js、css、Java程序(必须符合Servlet规范的类)),tomcat会到项目中寻找对应的资源(静态的,非Java程序),找到就直接响应给客户端,如果没有直接报404.

    如果通过浏览器访问的非静态资源(符合Servlet规范的Java代码),浏览器的访问被tomcat接受到,tomcat会分析需要访问的资源路径(URI),这时会通过web.xml文件中已经配置的路径进行匹配。通过路径找到配置的对象的Servlet(通过配置的名称)

  7. tomcat会判断当前的Servlet有没有初始化,已经被初始化,那么就会根据本次的请求方式调用Servlet中对应的doXxx方法。如果Servlet还没有初始化,先创建Servlet对象,然后再调用对应的doXxx方法。

  8. 再Servlet程序中处理请求,以及给客户端响应数据。

在Servlet的doXxx方法上接受两个参数:

  • HttpServletRequest request:封装的是与请求有关系的所有数据

  • HttpServletResponse response:给客户端响应数据

request和response对象是由tomcat创建的,并且在调用doXxx的时候传递到方法上,在doXxx中通过request和response完成请求和响应的处理。

5、Servlet接口的实现类

6、Servlet的生命周期

Servlet:从Servlet被创建到最后销毁。

Servlet的创建时间:正常情况一个项目中会包含若干个Servlet。在当前某个Servlet被第一次访问到的时候创建。会执行相关的初始化方法。后续的访问只会执行Servlet中的service方法。

Servlet销毁时间:1、正常关闭tomcat服务器;2、项目从tomcat中被移除

有时我们希望在tomcat服务器启动的时候就会某个Servlet进行创建和初始化,这时需要在项目的配置文件中对这个Servlet进行相关的配置:

    <servlet><servlet-name>demo2</servlet-name><servlet-class>com.neusoft.web.DemoServlet2</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping>

7、ServletConfig对象

ServletConfig:用来封装当前某个Servlet的初始化时的一些配置信息的。

    <servlet><servlet-name>demo2</servlet-name><servlet-class>com.neusoft.web.DemoServlet2</servlet-class><init-param><param-name>addr</param-name><param-value>江苏南京雨花台软件谷</param-value></init-param><init-param><param-name>name</param-name><param-value>东软</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>demo2</servlet-name><url-pattern>/demo2</url-pattern></servlet-mapping>
public class DemoServlet2 implements Servlet {public DemoServlet2(){System.out.println("Servlet被创建");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("Servlet初始化");String addr = servletConfig.getInitParameter("addr");System.out.println(addr);Enumeration<String> en = servletConfig.getInitParameterNames();while( en.hasMoreElements() ){System.out.println(en.nextElement());}}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("处理请求和响应");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("Servlet销毁");}
}

三、请求和响应

1、请求request

1.1、获取请求方式和请求头数据

@WebServlet( name = "RequestServlet" , urlPatterns = "/req")
public class RequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("request.....");//  获取请求方式String method = req.getMethod();System.out.println("method = " + method);String host = req.getRemoteHost();System.out.println("host = " + host);StringBuffer url = req.getRequestURL();System.out.println("url = " + url.toString());//  获取请求头中的所有keyEnumeration<String> en = req.getHeaderNames();while (en.hasMoreElements()){System.out.println(en.nextElement());}//  根据指定的请求头的key获取对应的value值String userAgent = req.getHeader("user-agent");System.out.println("userAgent = " + userAgent);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

1.2、获取客户端提交的数据

  • getParameter : 根据指定的key获取提交的value值
  • getParameterNames:获取提交的所有的key值
  • getParameterValues:根据指定的key获取对应的多个value值
  • getParameterMap:获取到的key和value数据,存储到map集合中,key作为map的key。
@WebServlet(name = "RequestServlet2" , urlPatterns = "/req2")
public class RequestServlet2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 根据指定的key获取value值String name = request.getParameter("name");String age = request.getParameter("age");System.out.println("name = " + name );System.out.println("age = " + age );//  提交的所有的keyEnumeration<String> en = request.getParameterNames();while ( en.hasMoreElements() ){System.out.println( en.nextElement() );}//  如果提交的数据中是一个key对应的多个value值,使用getParameterValues获取String[] hobbies = request.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}//  获取提交的key和value,存储在map集合中Map<String, String[]> map = request.getParameterMap();Set<Map.Entry<String, String[]>> entries = map.entrySet();for(Iterator<Map.Entry<String , String[]>> it = entries.iterator() ; it.hasNext() ; ){Map.Entry<String, String[]> entry = it.next();System.out.println(entry.getKey() + "----" + Arrays.toString(entry.getValue()));}}
}

1.3、post方式提交的数据

在tomcat8.0版本以上针对get请求已经不会再乱码。POST提交的数据需要手动的解决乱码问题

@WebServlet(name = "RequestServlet3" , urlPatterns = "/req3")
public class RequestServlet3 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//  需要写在获取数据的最前面request.setCharacterEncoding("utf-8");  // 只能针对post解决String name = request.getParameter("name");String sex = request.getParameter("sex");String password = request.getParameter("password");//name = new String( name.getBytes("iso-8859-1") , "utf-8" );System.out.println("name = " + name);System.out.println("sex = " + sex);System.out.println("password = " + password);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

2、注册案例

2.1、注册的流程

2.2、注册页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><center><form action="/servlet1/regist" method="post"><div>用户名:<input type="text" name="name"/></div><div>密码:<input type="password" name="password"/></div><div>性别:<input type="radio" name="sex" value="男"/>男<input type="radio" name="sex" value="女"/>女</div><div><input type="submit" value="提交"/></div></form></center>
</body>
</html>

2.3、编写Servlet程序

@WebServlet(name = "RegisterServlet" ,urlPatterns = "/regist")
public class RegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//  处理请求的乱码request.setCharacterEncoding("utf-8");String name = request.getParameter("name");String password = request.getParameter("password");String sex = request.getParameter("sex");User user = new User();user.setSex(sex);user.setPassword(password);user.setName(name);//  这里需要对数据进行非空验证UserService userService = new UserService();int x = userService.userRegister( user );if( x == 1 ){System.out.println("注册成功");}else{System.out.println("注册是不");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

2.4、编写service

public class UserService {public int userRegister(User user ) {try {//  对密码进行加密处理user.setPassword(MD5Utils.getMD5(user.getPassword()));//  封装注册的时间user.setRegistTime(new Date());//  调用daoUserDao userDao = new UserDao();return userDao.userRegister(user);}catch (SQLException e){e.printStackTrace();}return 0;}
}

2.5、编写dao

public class UserDao {public int userRegister(User user) throws SQLException {//  获取连接Connection conn = JDBCUtils.getConnection();String sql = "insert into users value( null , ? , ? , ? , ?  )";// 获取执行器PreparedStatement stmt = conn.prepareStatement(sql);//  设置参数stmt.setString(1 , user.getName());stmt.setString(2 , user.getPassword());stmt.setString(3 , user.getSex());stmt.setDate(4 , new Date( user.getRegistTime().getTime() ));//  执行int x = stmt.executeUpdate( );JDBCUtils.close(conn , stmt);return x;}
}
insert into users value( null , ? , ? , ? , ?  )";// 获取执行器PreparedStatement stmt = conn.prepareStatement(sql);//  设置参数stmt.setString(1 , user.getName());stmt.setString(2 , user.getPassword());stmt.setString(3 , user.getSex());stmt.setDate(4 , new Date( user.getRegistTime().getTime() ));//  执行int x = stmt.executeUpdate( );JDBCUtils.close(conn , stmt);return x;}
}

HTTP协议和Servlet技术相关推荐

  1. Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)

    文章目录: 入门秘籍-Http协议与robots协议 内功修炼-深入理解网络爬虫概念,作用,原理和爬取方式及流程 山中奇遇-得授页面解析技术之Xpath 入驻兵器阁-获取爬虫神器之Jsoup 入驻兵器 ...

  2. osi七层协议和tcp/ip四层协议

    (大部分内容为转载) OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议.OSI七层协议是由ISO (I ...

  3. Bytom BIP-32协议和BIP-44协议解读

    我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...

  4. 如何用过滤器过滤HTTP协议和非HTTP协议编码

    2019独角兽企业重金招聘Python工程师标准>>> 在编写web时,最苦恼的事情就是乱码了. 一直没怎么考虑过JSP第一句话中 <%@ page language=&quo ...

  5. HTTP协议和web工作原理

    HTTP协议和web工作原理 http://blog.csdn.net/kjfcpua/archive/2009/12/04/4932597.aspx 本章学完之后能干什么? 要把 知识点学好,那就需 ...

  6. 计算机网络(二十)-广域网-PPP协议和HDLC协议

    一.广域网 广域网,通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个城市或国家,远距离通信,形成国际性的远程网络. 广域网的通信子网主要使用分组交换技术.广域网的通信子网可以利用 ...

  7. Zookeeper的ZAB协议和Leader选举过程剖析

    Zookeeper的ZAB协议和Leader选举过程剖析 关键词 ZAB 崩溃恢复 和 消息⼴播 原子广播协议(⼆阶段提交),数据不⼀致问题 崩溃恢复(Leader选举算法/zxid) 选举:投票先投 ...

  8. nginx websocket wss 连接失败 failed_浅谈WebSocket协议、WS协议和WSS协议原理及关系

    现如今,一些游戏,网站,APP,支付行业的网络经常会收到DDOS和CC,因此这个事情也变得不足为奇了.但在防护方案中有多种不同的方案.如,今天有几个同事在针对高防CDN问题讨论的时,谈到WebSock ...

  9. SSL协议和SET协议

    SSL协议和SET协议 --三.安全电子交易的协议 --目前的安全电子交易协议主要有两种,即安全套接层(SSL)协议和安全电子交易(SET)协议. --1.SSL协议 --SSL协议由Netscape ...

最新文章

  1. python跨行字符串 变量_在Python中有没有在多行字符串中使用变量的方法?
  2. (44)Xilinx ROM IP核配置(五)(第9天)
  3. 代码只要写得多,就能成为顶尖的架构师?
  4. Bailian2686 打印完数【暴力】
  5. HDU1573 X问题【扩展欧几里得算法】
  6. RunAs 增强性扩展命令(支持自动提交密码,安全授权)
  7. jQuery实现滑动门效果
  8. 惠普台式电脑引导不了系统_惠普电脑进入bios设置引导模式操作步骤图文
  9. 智慧机场大数据可视化分析决策系统
  10. win10 u盘 修复计算机,U盘启动盘修复win10系统的方法
  11. 中国内地LCD液晶屏原材料仍正在发展中(二)
  12. len是python的内置函数吗_len(x) 击败 x.len(),从内置函数看 Python 的设计思想(内有公号宣传,不喜勿进)...
  13. R语言入门第一集 R语言、RTools、RStudio的简介、安装与使用
  14. 智能窗帘控制(语音、时间、光、红外)
  15. 实验六 可变分区存储管理实验
  16. Python3树莓派连接阿里云物联网设备发送接收数据
  17. 实探java对象的内存布局
  18. Diagnostic Plane Extraction from 3DParametric Surface of the Fetal Cranium胎儿颅骨三维参数表面的诊断平面提取
  19. push button 与 tool button的用法_详解Vue的slot新用法
  20. 建设部是否认可计算机软考,呼吁计算机技术与软考中级证书获得建设部的认可-房建监理-筑龙工程监理论坛...

热门文章

  1. 封禁恶意IP访问在我司实践总结
  2. C#隐藏tabcontrol
  3. 经典爱情诗《四月的纪念》 刘擎/王嫣、乔榛/丁建华双版朗诵
  4. .net开发 abp框架+vue的微信公众号的微信授权
  5. android emulator ps4,PS4 Simulator模拟器
  6. 尚医通 (十八)微信登录
  7. 264编码 yocto_66AK2H06
  8. overleaf 常见数学公式 latex
  9. 【题解】食物链(并查集)
  10. ChatGPT宝藏插件丨装上之后,上网、语音聊天、一键分享对话……简直让你爽到起飞!