Request对象

1.request对象和response对象的原理- 原理:1.tomcat服务器会根据请求url(http://localhost/day14/demo1)中的资源路径/demo1,创建对应的Demo01Servlet的对象2.tomcat服务器,会创建request和response对象,request对象中封装请求消息数据3.tomcat将request和response两个对象传递给service方法,并且调用service方法4.程序员可以通过request对象获取请求消息数据,可以通过response对象设置响应消息数据5.服务器在给浏览器做出响应之前,会从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.获取请求方式:GETString getMethod()   String method = request.getMethod();*2.获取虚拟目录:/day14String getContextPath()     String contextPath = request.getContextPath();3.获取Servlet路径:/demo1String getServletPath()       String servletPath = request.getServletPath();4.获取get方式请求参数:name=zhangsanString getQueryString()       String queryString = request.getQueryString();*5.获取请求URI:/day14/demo1String getRequestURI() /day14/demo1    String requestURI = request.getRequestURI();StringBuffer getRequestURL()   http://localhost/day14/demo1    StringBuffer requestURL = request.getRequestURL();- URL:统一资源定位符 http://localhost/day14/demo1    类似中华人民共和国- URI:统一资源标识符   /day14/demo1    类似共和国6.获取协议及版本:HTTP/1.1String getProtocol()  String protocol = request.getProtocol();7.获取客户机的IP地址:String getRemoteAddr() String remoteAddr = request.getRemoteAddr();//0:0:0:0:0:0:0:12.获取请求头数据- 方法:*1.String getHeader(String name):通过请求头的名称获取请求头的值- 演示获取请求头数据:user-agentString agent = request.getHeader("user-agent");//判断agent的浏览器版本if(agent.contains("Chrome")){//谷歌System.out.println("谷歌来了...");}else if(agent.contains("Firefox")){//火狐System.out.println("火狐来了...");}- 演示获取请求头数据:referer需在web/login.html中写:<a href="/day14/demo04Servlet">demo4.....</a>String referer = request.getHeader("referer");System.out.println(referer);//http://localhost/day14/login.html//防盗链if(referer != null){if(referer.contains("/day14")){//正常访问//System.out.println("播放电影...");response.setContentType("text/html;charset=utf-8");response.getWriter().write("播放电影...");}else{//盗链//System.out.println("想看电影吗?来优酷吧...");response.setContentType("text/html;charset=utf-8");response.getWriter().write("想看电影吗?来优酷吧...");}2.Enumeration<String> getHeaderNames():获取所有的请求头名称//演示获取请求头数据//1,获取所有请求头名称Enumeration<String> headerNames = request.getHeaderNames();//2.遍历while(headerNames.hasMoreElements()){String name = headerNames.nextElement();//根据名称获取请求头的值String value = request.getHeader(name);System.out.println(name + "---" + value);}3.获取请求体数据- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数- 步骤:1.获取流对象1.BufferedReader getReader():获取字符输入流,只能操作字符数据2.ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据(文件上传知识点时再讲解)2.再从流对象中拿数据- 代码演示需在web/regist.html中写:<form action="/day14/demo05Servlet" method="post"><input type="text" placeholder="请输入用户名" name="username"><br><input type="text" placeholder="请输入密码" name="password"><br><input type="submit" value="注册"></form>在doPost中写://获取请求消息体--请求参数//1.获取字符流BufferedReader br = request.getReader();//2.读取数据String line = null;while((line = br.readLine()) != null){System.out.println(line);} //username=zhangsan&password=123                  2.其他功能:1.获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数需在web/regist2.html中写:   <form action="/day14/demo06Servlet" method="get"><input type="text" placeholder="请输入用户名" name="username"><br><input type="text" placeholder="请输入密码" name="password"><br><input type="checkbox" name="hobby" value="game">游戏<input type="checkbox" name="hobby" value="study">学习<br><input type="submit" value="注册"></form>需在doGet中写:this.doPost(request,response);   1.String getParameter(String name):根据参数名称获取参数值  username=zs&password=123//根据参数名称获取参数值String username = request.getParameter("username");2.String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=shopping&hobby=game//根据参数名称获取参数值的数组String[] hobbies = request.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}3.Enumeration<String> getParameterNames():获取所有请求的参数名称//获取所有请求的参数名称Enumeration<String> parameterNames = request.getParameterNames();while(parameterNames.hasMoreElements()){String name = parameterNames.nextElement();System.out.println(name);String value = request.getParameter(name);System.out.println(value);System.out.println("-------------");}4.Map<String,String[]> getParameterMap():获取所有参数的map集合//获取所有参数的map集合Map<String, String[]> parameterMap = request.getParameterMap();//遍历Set<String> keyset = parameterMap.keySet();for (String name : keyset) {//根据键获取值String[] values = parameterMap.get(name);System.out.println(name);for (String value : values) {System.out.println(value);}System.out.println("---------------");}- 中文乱码问题:1.get方式:tomcat8已经将get方式乱码问题解决了2.post方式:会乱码解决:在获取参数前,设置request的编码 //1.设置流的编码request.setCharacterEncoding("utf-8");2.请求转发:一种在服务器内部的资源跳转方式1.步骤:1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/demo09Servlet");requestDispatcher.forward(request,response);*/request.getRequestDispatcher("/demo09Servlet").forward(request,response);2.特点:1.浏览器地址栏路径不发生变化2.只能转发到当前服务器内部资源中3.转发是一次请求3.共享数据:- 域对象:一个有作用范围的对象,可以在范围内共享数据- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据- 方法:1.void setAttribute(String name,Object obj):存储数据//存储数据到request域中,要在转发之前存储request.setAttribute("msg","hello");2.Object getAttribute(String name):通过键获取值//获取数据Object msg = request.getAttribute("msg");3.void removeAttribute(String name):通过键移除键值对4.获取ServletContext- ServletContext getServletContext()ServletContext servletContext = request.getServletContext();

Servlet案例:用户登录

1.用户登录案例需求:1.编写login.html登录页面username & password 两个输入框2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表3.使用JdbcTemplate技术封装JDBC4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
2.分析:1.开发步骤: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.创建包domain,创建类User//用户的实体类public class User {private int id;private String username;private String password;Getter/Setter方法,toString方法省略}  4.创建包util,编写工具类JDBCUtils//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.创建包dao,创建类UserDao,提供login方法   //操作数据库中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;}}}//选中要添加trycatch的语句,按ctrl+alt+t添加6.创建包test,创建类UserDaoTest,测试UserDao方法public class UserDaoTest {@Testpublic void testLogin(){User loginuser = new User();loginuser.setUsername("superbaby");loginuser.setPassword("123111");UserDao dao = new UserDao();User user = dao.login(loginuser);System.out.println(user);}}7.创建包web.servlet创建类LoginServlet@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置编码request.setCharacterEncoding("utf-8");//2.获取请求参数String username = request.getParameter("username");String password = request.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){//登录失败request.getRequestDispatcher("/failServlet").forward(request,response);}else{//登录成功//存储数据request.setAttribute("user",user);//转发request.getRequestDispatcher("/successServlet").forward(request,response);}}}8.在web.servlet包中,编写FailServlet和SuccessServlet类  - FailServlet类@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);}}- 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()+",欢迎您");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}9.login.html中form表单的action路径的写法- 虚拟目录+Servlet的资源路径    <form action="/day14_test1/loginServlet" method="post"> </form>               10.BeanUtils工具类,简化数据封装- 用于封装JavaBean的1.JavaBean:标准的Java类1.要求:1.类必须被public修饰2.必须提供空参的构造器3.成员变量必须使用private修饰4.提供公共setter和getter方法2.功能:封装数据2.概念:- 成员变量:- 属性:setter和getter方法截取后的产物例如:getUsername()--> Username-->username注意:成员变量和属性通常为同一个概念,但在BeanUtils中不是- 在User类中定义private String gender;public void setHehe(String gender){this.gender = gender;}public String getHehe(){return gender;}3.方法:1.setProperty():设置属性User user = new User();BeanUtils.setProperty(user,"hehe","male");System.out.println(user);2.getProperty():获取属性String gender = BeanUtils.getProperty(user, "hehe");System.out.println(gender);3.populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中//2.获取所有请求参数Map<String, String[]> map = request.getParameterMap();//3.创建User对象User loginUser = new User();//3.1使用BeanUtils封装BeanUtils.populate(loginUser,map);注意:方法3用于简化登录案例中LoginServlet类的编写

javaweb基础打卡17相关推荐

  1. javaweb基础打卡12

    DOM简单学习:为了满足案例要求 1.功能:控制html文档的内容 2.代码:获取页面标签(元素)对象Element- document.getElementById("id值") ...

  2. JavaWeb基础知识总结

     [Java面试题]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l ...

  3. [Java面试三]JavaWeb基础知识总结.

    [Java面试三]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Int ...

  4. javaweb基础知识点记录2

    javaweb基础知识点记录 1.在service方法中,首先获得请求的方法名,然后根据方法名调用对应的doXXXX方法,比如说请求参数为GET,那么就会去调用doGet方法,请求参数为POST,那么 ...

  5. javaweb基础知识点记录1

    javaweb基础知识点记录 1.当我们通过在浏览器的输入栏中直接输入网址的方式访问网页的时候,浏览器采用的就是GET方法向服务器获取资源. 2.我们可以将Servlet看做是嵌套了HTML代码的ja ...

  6. JavaWeb基础核心技术-佟刚-专题视频课程

    JavaWeb基础核心技术-132383人已学习 课程介绍         本Java视频教程涵盖JavaWEB 企业级开发所需的Servlet.JSP.MVC 设计模式.EL 表达式.JavaBea ...

  7. 17秋《计算机应用基础》,南开17秋学期《计算机应用基础》在线作业.docx

    南开17秋学期<计算机应用基础>在线作业.docx (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 南开17秋学期& ...

  8. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  9. STM32 基础系列教程 17 – CRC

    前言 学习stm32 循环冗余校验(CRC)计算单元接口使用,学会stm32f103 CRC应用与编程,关于CRC的基础知识请各位自行百度,STM32有些芯片的CRC多项式可自由设定,有些则是固定值0 ...

  10. index加载显示servlet数据_[WEB篇]-JavaWeb基础与应用-02-Servlet开发

    JavaWeb基础与应用 2.Servlet开发 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源 ...

最新文章

  1. Unknown lifecycle phase mvn
  2. 数据结构解析——小白也能看懂的单链表
  3. 一种比sys.path更好的获得当前脚本路径的方法
  4. 《Python3网络爬虫开发实战(第二版)》上市了!!!!
  5. Boost:circular buffer的测试程序
  6. Centos7安装部署Zabbix3.4
  7. 简单理解线性规划的单纯形算法
  8. R载入需要的程辑包:rJava Error
  9. bolt在java,java – 在Apache Storm中将不同的元组从1个spout发送到不同的bolt
  10. java循环do while_Java中for、while、do while三种循环语句的区别介绍
  11. Django:数据迁移不生成auth相关表
  12. 二次开发—Ribbon界面
  13. 机器学习处理信号分离_【火炉炼AI】机器学习054-用ICA做盲源分离
  14. android toast显示时间,Android Toast自定义显示时间
  15. 数字图像处理基础——图像空间操作的3种形式
  16. 刘强东的敌与友:嘲讽王健林一亿小目标,性侵案后李国庆说该原谅
  17. 找工作系列之-操作系统
  18. 如何用自己的笔记本建wifi热点~~~
  19. Arm服务器芯片编年史
  20. PowerBI小技巧--新式书签导航器

热门文章

  1. BAT齐聚阿里安全-ASRC生态大会:呼吁联合共建网络安全白色产业链
  2. 你真的了解前端模块化吗?
  3. TensorFlow 2.0 教程-词嵌入
  4. Region Proposal by Guided Anchoring论文翻译和理解
  5. 蛋白质二级结构预测-Chou-Fasman预测方法
  6. POJ 1371 Tin Cutter 笔记
  7. 正则表达式在一个字符串上多次搜索、正则表达式匹配书名等
  8. H5页面打开微信小程序
  9. 风能设备物流的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. 6岁就获吉尼斯世界纪录!这届10后程序员「小鬼当家」