HTTP协议和Servlet技术
一、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程序的步骤:
定义类继承HttpServlet
public class DemoServlet extends HttpServlet {}
在类中复写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);} }
在项目的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访问过程
编写的web项目(html、css、js、java程序),然后将项目部署到tomcat中。
启动tomcat,tomcat会加载当前需要tomcat运行的所有项目
tomcat会识别项目中的唯一配置文件web.xml,tomcat就会知道当前项目中配置的所有的相关类等内容。
tomcat会对项目进行相关的初始化操作,保证项目可以被正常的运行
通过浏览器访问当前这个项目,如果没有指定访问项目具体的哪个路径(资源),默认访问的项目的欢迎页
可以在自己项目的web.xml文件中配置,如果没有配置使用tomcat/conf/web.xml文件配置的相关的欢迎页
<welcome-file-list><welcome-file>demo.html</welcome-file> </welcome-file-list>
如果通过浏览器访问项目中指定的资源(html、js、css、Java程序(必须符合Servlet规范的类)),tomcat会到项目中寻找对应的资源(静态的,非Java程序),找到就直接响应给客户端,如果没有直接报404.
如果通过浏览器访问的非静态资源(符合Servlet规范的Java代码),浏览器的访问被tomcat接受到,tomcat会分析需要访问的资源路径(URI),这时会通过web.xml文件中已经配置的路径进行匹配。通过路径找到配置的对象的Servlet(通过配置的名称)
tomcat会判断当前的Servlet有没有初始化,已经被初始化,那么就会根据本次的请求方式调用Servlet中对应的doXxx方法。如果Servlet还没有初始化,先创建Servlet对象,然后再调用对应的doXxx方法。
再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技术相关推荐
- Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)
文章目录: 入门秘籍-Http协议与robots协议 内功修炼-深入理解网络爬虫概念,作用,原理和爬取方式及流程 山中奇遇-得授页面解析技术之Xpath 入驻兵器阁-获取爬虫神器之Jsoup 入驻兵器 ...
- osi七层协议和tcp/ip四层协议
(大部分内容为转载) OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议.OSI七层协议是由ISO (I ...
- Bytom BIP-32协议和BIP-44协议解读
我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...
- 如何用过滤器过滤HTTP协议和非HTTP协议编码
2019独角兽企业重金招聘Python工程师标准>>> 在编写web时,最苦恼的事情就是乱码了. 一直没怎么考虑过JSP第一句话中 <%@ page language=&quo ...
- HTTP协议和web工作原理
HTTP协议和web工作原理 http://blog.csdn.net/kjfcpua/archive/2009/12/04/4932597.aspx 本章学完之后能干什么? 要把 知识点学好,那就需 ...
- 计算机网络(二十)-广域网-PPP协议和HDLC协议
一.广域网 广域网,通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个城市或国家,远距离通信,形成国际性的远程网络. 广域网的通信子网主要使用分组交换技术.广域网的通信子网可以利用 ...
- Zookeeper的ZAB协议和Leader选举过程剖析
Zookeeper的ZAB协议和Leader选举过程剖析 关键词 ZAB 崩溃恢复 和 消息⼴播 原子广播协议(⼆阶段提交),数据不⼀致问题 崩溃恢复(Leader选举算法/zxid) 选举:投票先投 ...
- nginx websocket wss 连接失败 failed_浅谈WebSocket协议、WS协议和WSS协议原理及关系
现如今,一些游戏,网站,APP,支付行业的网络经常会收到DDOS和CC,因此这个事情也变得不足为奇了.但在防护方案中有多种不同的方案.如,今天有几个同事在针对高防CDN问题讨论的时,谈到WebSock ...
- SSL协议和SET协议
SSL协议和SET协议 --三.安全电子交易的协议 --目前的安全电子交易协议主要有两种,即安全套接层(SSL)协议和安全电子交易(SET)协议. --1.SSL协议 --SSL协议由Netscape ...
最新文章
- python跨行字符串 变量_在Python中有没有在多行字符串中使用变量的方法?
- (44)Xilinx ROM IP核配置(五)(第9天)
- 代码只要写得多,就能成为顶尖的架构师?
- Bailian2686 打印完数【暴力】
- HDU1573 X问题【扩展欧几里得算法】
- RunAs 增强性扩展命令(支持自动提交密码,安全授权)
- jQuery实现滑动门效果
- 惠普台式电脑引导不了系统_惠普电脑进入bios设置引导模式操作步骤图文
- 智慧机场大数据可视化分析决策系统
- win10 u盘 修复计算机,U盘启动盘修复win10系统的方法
- 中国内地LCD液晶屏原材料仍正在发展中(二)
- len是python的内置函数吗_len(x) 击败 x.len(),从内置函数看 Python 的设计思想(内有公号宣传,不喜勿进)...
- R语言入门第一集 R语言、RTools、RStudio的简介、安装与使用
- 智能窗帘控制(语音、时间、光、红外)
- 实验六 可变分区存储管理实验
- Python3树莓派连接阿里云物联网设备发送接收数据
- 实探java对象的内存布局
- Diagnostic Plane Extraction from 3DParametric Surface of the Fetal Cranium胎儿颅骨三维参数表面的诊断平面提取
- push button 与 tool button的用法_详解Vue的slot新用法
- 建设部是否认可计算机软考,呼吁计算机技术与软考中级证书获得建设部的认可-房建监理-筑龙工程监理论坛...