2019独角兽企业重金招聘Python工程师标准>>>

Servlet:

1. 概念
2. 步骤
3. 执行原理
4. 生命周期
5. Servlet3.0 注解配置
6. Servlet的体系结构 Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet  -- 抽象类* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可* HttpServlet:对http协议的一种封装,简化操作1. 定义类继承HttpServlet2. 复写doGet/doPost方法7. Servlet相关配置1. urlpartten:Servlet访问路径1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})2. 路径定义规则:1. /xxx:路径匹配2. /xxx/xxx:多层路径,目录结构3. *.do:扩展名匹配

HTTP:

* 概念:Hyper Text Transfer Protocol 超文本传输协议* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式* 特点:1. 基于TCP/IP的高级协议2. 默认端口号:803. 基于请求/响应模型的:一次请求对应一次响应4. 无状态的:每次请求之间相互独立,不能交互数据* 历史版本:* 1.0:每一次请求响应都会建立新的连接* 1.1:复用连接* 请求消息数据格式1. 请求行请求方式 请求url 请求协议/版本GET /login.html HTTP/1.1* 请求方式:* HTTP协议有7中请求方式,常用的有2种* GET:1. 请求参数在请求行中,在url后。2. 请求的url长度有限制的3. 不太安全* POST:1. 请求参数在请求体中2. 请求的url长度没有限制的3. 相对安全2. 请求头:客户端浏览器告诉服务器一些信息请求头名称: 请求头值* 常见的请求头:1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题2. Referer:http://localhost/login.html* 告诉服务器,我(当前请求)从哪里来?* 作用:1. 防盗链:2. 统计工作:3. 请求空行空行,就是用于分割POST请求的请求头,和请求体的。4. 请求体(正文):* 封装POST请求消息的请求参数的* 字符串格式: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   * 响应消息数据格式
## HTTP协议:1. 请求消息:客户端发送给服务器端的数据* 数据格式:1. 请求行2. 请求头3. 请求空行4. 请求体2. 响应消息:服务器端发送给客户端的数据* 数据格式: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对象的原理1. request和response对象是由服务器创建的。我们来使用它们2. request对象是来获取请求消息,response对象是来设置响应消息2. request对象继承体系结构:  ServletRequest      --  接口| 继承HttpServletRequest    -- 接口|  实现org.apache.catalina.connector.RequestFacade 类(tomcat)3. request功能:1. 获取请求消息数据1. 获取请求行数据* GET /day14/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()2. 获取请求头数据* 方法:* (*)String getHeader(String name):通过请求头的名称获取请求头的值* Enumeration<String> getHeaderNames():获取所有的请求头名称3. 获取请求体数据:* 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数* 步骤:1. 获取流对象*  BufferedReader getReader():获取字符输入流,只能操作字符数据*  ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据* 在文件上传知识点后讲解2. 再从流对象中拿数据2. 其他功能:1. 获取请求参数通用方式:不论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");2. 请求转发:一种在服务器内部的资源跳转方式1. 步骤:1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 2. 特点:1. 浏览器地址栏路径不发生变化2. 只能转发到当前服务器内部资源中。3. 转发是一次请求3. 共享数据:* 域对象:一个有作用范围的对象,可以在范围内共享数据* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据* 方法:1. void setAttribute(String name,Object obj):存储数据2. Object getAttitude(String name):通过键获取值3. void removeAttribute(String name):通过键移除键值对4. 获取ServletContext:* ServletContext getServletContext()

案例:用户登录

* 用户登录案例需求:1.编写login.html登录页面username & password 两个输入框2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表3.使用JdbcTemplate技术封装JDBC4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误* 分析* 开发步骤1. 创建项目,导入html页面,配置文件,jar包2. 创建数据库环境CREATE DATABASE day14;USE day14;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,PASSWORD VARCHAR(32) NOT NULL);3. 创建包cn.itcast.domain,创建类Userpackage cn.itcast.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;}[@Override](https://my.oschina.net/u/1162528)public String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}4. 创建包cn.itcast.util,编写工具类JDBCUtilspackage cn.itcast.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();}}5. 创建包cn.itcast.dao,创建类UserDao,提供login方法package cn.itcast.dao;import cn.itcast.domain.User;import cn.itcast.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](https://my.oschina.net/u/2303379) loginUser 只有用户名和密码* [@return](https://my.oschina.net/u/556800) 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;}}}6. 编写cn.itcast.web.servlet.LoginServlet类package cn.itcast.web.servlet;import cn.itcast.dao.UserDao;import cn.itcast.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 {[@Override](https://my.oschina.net/u/1162528)protected 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);}}7. 编写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);}}8. login.html中form表单的action路径的写法* 虚拟目录+Servlet的资源路径9. BeanUtils工具类,简化数据封装* 用于封装JavaBean的1. JavaBean:标准的Java类1. 要求:1. 类必须被public修饰2. 必须提供空参的构造器3. 成员变量必须使用private修饰4. 提供公共setter和getter方法2. 功能:封装数据2. 概念:成员变量:属性:setter和getter方法截取后的产物例如:getUsername() --> Username--> usernameprivate String gender;public void setHehe(String gender){this.gender=gender;}这里,Hehe就变成了属性。而BeanUtil中操作的就是属性值3. 方法:1. setProperty()  给对象设置属性值。注意上面属性和成员变量的区别例子:BeanUtils.setProperty("hehe","malil");//gender有值BeanUtils.setProperty("gender","malil");//gender值为null2. getProperty()3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中4.案例:/* //2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);*///2.获取所有请求参数Map<String, String[]> map = req.getParameterMap();//3.创建User对象User loginUser = new User();//3.2使用BeanUtils封装try {BeanUtils.populate(loginUser,map);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}

转载于:https://my.oschina.net/u/3668429/blog/3043393

Servlet、Http、Request相关推荐

  1. 【Servlet】总结 JSP的四大域对象、Servlet的四个作用域:pageContext、request、session、application

    JSP的四大域对象:pageContext.request.session.application 这四个域对象,都提供了一对相同的方法: 设置一个属性: setAttribute("属性名 ...

  2. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

  3. java servlet filter_Java的Servlet、Filter、Interceptor、Listener

    写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...

  4. 深入Jetty源码之Servlet框架及实现(AsyncContext、RequestDispatcher、HttpSession)

    概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层 ...

  5. Servlet基础:接口、类、请求响应、配置、会话追踪、上下文、协作、异常

    10.1 Servlet介绍 ​ Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的Web服务器端编程技术,主要用于在Web服务器端获得客户端的访问请求信息和动 ...

  6. 从Servlet、Dubbo、Mybatis聊聊责任链究竟怎么用

    作者:atheva 来源:https://dwz.cn/1TtgW7Ud 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链 ...

  7. Struts2中action获取request、response、session的方式

    2019独角兽企业重金招聘Python工程师标准>>> 第一种方式,非IoC(Spring中的控制反转)方式: package com.action; import java.uti ...

  8. Servlet、Filter、Listener、Interceptor基础

    第一:Servlet Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹 ...

  9. SpringBoot(四)-- 整合Servlet、Filter、Listener

    SpringBoot中有两种方式可以添加 Servlet.Filter.Listener. 1.代码注册 通过ServletRegistrationBean. FilterRegistrationBe ...

  10. 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全

    前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...

最新文章

  1. C高级第一次PTA作业(2)
  2. git只提交一张图片_几张图让你彻底弄懂git工作流(三) ——git深入
  3. 麦克纳姆轮全向移动机器人速度分解
  4. 机器学习基础(一)——如何避免浮点数下溢
  5. 服务器系统还原后如何退回去,如何进行系统还原
  6. 一级计算机考试电子表格排序筛选,重新应用Excel排序和筛选或清除筛选
  7. win10完美运行红警
  8. 【c++】CTGU2022春校赛原题详解:出题人的大航海BFS
  9. 【机器学习 基本概念】监督学习、无监督学习、半监督学习与强化学习
  10. Nature 曹云龙/谢晓亮等破解新冠病毒趋同进化机制,将为抗新冠病毒添新药!...
  11. linux oracle 常用操作
  12. 向质量要增长,内容社区告别“大水漫灌”时代
  13. 【测试工程师】关于软件测试的10条建议
  14. 计算机的运算方法(中)测试
  15. 杰里之主动降噪与物理降噪的区别【篇】
  16. QT 实现图片旋转及缩放
  17. 一般web放在linux那个目录下,【linux】linux 大家一般把web目录放在哪个分区下面呢?放在/data目录下面安全吗?...
  18. Vim小技巧及快捷键大全【持续更新】
  19. 为什么冠状病毒从湖北出发传播这么快?
  20. MATLAB入门教程(4):矩阵的生成

热门文章

  1. 强化学习样本复杂性综述
  2. 人脸识别技术及其应用领域
  3. 人工智能落地之路:从概念验证到产品
  4. 谷歌利用人工智能设计的芯片揭示了智能的本质
  5. 【前沿技术】严重事故!实习生删除字节跳动所有轻量级机器学习模型
  6. 中国工程院发布2021中国电子信息工程科技发展十四大趋势
  7. SpaceX再发射58颗星链卫星 总数达到538颗
  8. 记忆的天空:智能进化三部曲
  9. 学自动化必知:20个传感器原理及应用动图
  10. 世界隐形冠军比拼:德国1307家、美国366家、中国68家