Web(十一)

news2024/9/20 23:26:18

                                                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=123
                2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game
                3. 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技术封装JDBC
        4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
        5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

   * 开发步骤


        1. 创建项目,导入html页面,配置文件,jar包 

将druid配置文件放置到Src下 

在web包下创建WEB-INF目录,专门存放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,创建类User
          

 package 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
                public String toString() {
                    return "User{" +
                            "id=" + id +
                            ", username='" + username + '\'' +
                            ", password='" + password + '\'' +
                            '}';
                }
            }


       4. 创建包cn.itcast.util,编写工具类JDBCUtils
            

package 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 loginUser 只有用户名和密码
                 * @return user包含用户全部数据,没有查询到,返回null
                 */
                public User login(User loginUser){
                    try {
                        //1.编写sql
                        String 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
                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.判断user
                    if(user == null){
                        //登录失败
                        req.getRequestDispatcher("/failServlet").forward(req,resp);
                    }else{
                        //登录成功
                        //存储数据
                        req.setAttribute("user",user);
                        //转发
                        req.getRequestDispatcher("/successServlet").forward(req,resp);
                    }
            
                }
            
                @Override
                protected 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--> username


            3. 方法:
                1. setProperty()
                2. getProperty()
                3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka知识概况

Kafka知识概况Kafka简介Kafka 生产者Kafka BrokerKafka 消费者Kafka-Eagle 监控Kafka-Kraft 模式集成 SpringBootKafka简介 消息队列简介&#xff1a; 目 前企业中比较常见的消息队列产 品主 要有 Kafka、ActiveMQ 、RabbitMQ 、RocketMQ 等。在大数据场景主要采用 Kafka 作为…

【ElasticSearch8.X】学习笔记(一)

【ElasticSearch8.X】学习笔记一、8.x与7.x的对比二、安装elk8.x2.1、下载2.2、集群规划2.3、安装2.4、配置环境2.5、修改配置文件2.6、启动2.5、安装其他结点三、Kibana 安装3.1、下载3.2、配置环境3.2、修改配置文件3.4、启动一、8.x与7.x的对比 减少内存堆使用&#xff0c;…

JavaScript 进阶--charater2

系列文章目录 提示&#xff1a; JavaScript进阶笔记 &#xff0c;希望各位看官可以高抬小手一键三连 上一章测试题 答案在最后给出 文章目录系列文章目录前言一、深入对象1.1创建对象三种方式1. 利用对象字面量创建对象2.利用new Object 创建对象3. 利用构造函数创建对象1.2 构…

设计师百度百科词条创建怎么做?

设计分为平面设计、空间设计、工业设计、珠宝设计、游戏设计、家具设计、建筑设计、室内设计、景观设计、服装设计、网页设计、系统设计、剧场设计、动漫设计、品牌设计、造型设计、三维设计师、杂志封面设计师、包装设计师、形象设计师等领域。 设计师是一个提供创意的工作&a…

Hive(8):Hive内、外部表

关键字&#xff1a;EXTERNAL 1 什么是内部表 内部表&#xff08;Internal table&#xff09;也称为被Hive拥有和管理的托管表&#xff08;Managed table&#xff09;。 默认情况下创建的表就是内部表&#xff0c;Hive拥有该表的结构和文件。换句话说&#xff0c;Hive完全管理…

Hue(2):Hue 的安装

1 上传解压安装包 Hue 的安装支持多种方式&#xff0c;包括 rpm 包的方式进行安装、tar.gz 包的方式进行安装以及 cloudera manager 的方式来进行安装等&#xff0c;我们这里使用 tar.gz 包的方式来进行安装。 Hue 的压缩包的下载地址&#xff1a; http://archive.cloudera.…

SSH远程登录RaspberryPi命令行响应缓慢问题

SSH远程登录RaspberryPi命令行响应缓慢问题1. 问题2. 分析3. 解决3.1 去掉PAM部分鉴权模块3.2 去掉sshd的DNS设置3.3 无线WiFi信号优化方法一&#xff1a;ifconfig操作方法二&#xff1a;内核自动检测4. 结果5. 补充资料5.1 [排除wifi网卡功率自管理问题](https://raspberrypi.…

LeetCode刷题---21.合并两个有序链表(双指针)

文章目录一、编程题&#xff1a;19. 删除链表的倒数第 N 个结点&#xff08;双指针-快慢指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、编…

【Linux】调试器 gdb 及 ‘\r‘ 的使用

目录 前言 gdb 断点 打断点 查看、删除断点 断点使能 调试 显示数据 其他指令 ‘\r’的使用 行缓冲区 小程序 前言 &#x1f951;在 Linux 下我们可以通过 gcc 进行编译&#xff0c;但与 vs 相比若想对代码进行调试&#xff0c;我们还需要学会使用调试器 gdb 。 &am…

Elastic Job学习笔记

目标&#xff1a; 第一章&#xff1a;概述 1、理解任务调度的概念 2、理解分布式任务调度的概念 3、能够说出Elastic-Job是什么 第二章&#xff1a;Elastic-Job快速入门 1、能够搭建Elastic-Job快速入门工程环境 2、能够编写Elastic-Job快速入门的程序 3、理解Elastic-Job整体架…

Studio 3T怎么用mysql语句执行查询

目录说明说明 mongo图形界面 Studio 3T怎么执行mongo的原生语句进行查询 就先说到这\color{#008B8B}{ 就先说到这}就先说到这 在下Apollo\color{#008B8B}{在下Apollo}在下Apollo 一个爱分享Java、生活的小人物&#xff0c;\color{#008B8B}{一个爱分享Java、生活的小人物&…

【前端】Vue项目:旅游App-(20)home:点击跳转至带参数的动态路由

文章目录目标过程与代码详情页detailhome中设置点击跳转效果总代码修改或添加的文件router/indexdetailhome-content参考本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-博客总结 目标 点击热门精选的item跳转至对应详情页&#xff1a; 详情页&#xff1a; 路…

什么是HTTPDNS?HTTPDNS有哪些作用?

近几年来&#xff0c;HTTPDNS技术大火&#xff0c;很多大的网站都开始部署自己的HTTDNS服务器&#xff0c;那么什么是HTTPDNS&#xff0c;HTTPDNS和传统的DNS技术相比有哪些区别&#xff1f;HTTPDNS又有哪些作用呢&#xff1f;针对这些问题&#xff0c;本文中科三方做下简单介绍…

【学习】Linux 系统 文件权限表示

学习内容描述&#xff1a;Linux 系统 文件权限格式 重点知识&#xff1a; Linux 系统 文件权限格式是10位&#xff0c;格式例如&#xff1a;-rw-rw-rw-&#xff0c;表示文件所有者、所属组、其他用户都具有读和写的权限 。 &#xff08;1&#xff09;第0位确定文件类型 其中: …

计算机组成原理 第三章笔记

视频网址 仅仅是笔记记录&#xff0c;若有错误请指出。 零碎的 存储器的分类 磁表面存储器:磁盘,磁带磁芯存储器半导体存储器 RAM ROM光存储器 看下面这个思维导图 存储器的性能指标 存储容量&#xff1a;存储字数字长单位成本: 每位价格总成本/总容量存储速度&#xff1a;数…

Android Studio Linux系统模拟器启动异常

一、报错&#xff1a;/dev/kvm device permission denied 1、首先检查/dec/kvm的所属关系 命令&#xff1a;ls -al /dev/kvm 可以看到&#xff0c;属于root用户&#xff0c;组也是root用户 2、查看当前用户是否在root组 命令&#xff1a;grep root /etc/group 显然是没有的…

C语言学习笔记-数组

C 数组 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 runoob0、runoob1、…、runoob99&#x…

Project3:Ants Vs. SomeBees

Ants Vs. SomeBees1. 前言2. Phase 1&#xff1a;Basic gameplay3. Phase 2&#xff1a;More Ants&#xff01;4. Phase 3: Water and Might5. 测试结果1. 前言 本项目是 CS 61A 的第三个项目&#xff0c;要求是实现一个类似于植物大战僵尸的游戏&#xff0c;这里 Ants 就相当…

【redis】redis的过期策略以及内存淘汰机制

前言 今天我们讨论下redis的过期策略以及内存淘汰机制&#xff0c;如果你想要考察一个人对redis的了解&#xff0c;那吗这个问题是必选的&#xff0c;从他对这个问题的回答中&#xff0c;就可以了解到他的redis深浅。 过期策略 先来介绍下&#xff0c;Redis key 过期删除的策…

虹科产品 | 使用Redis企业版数据库为MySQL增添魅力!

MySQL读取数据慢&#xff1f; 难以轻松扩展&#xff1f; 数据搜索效率低&#xff1f; 无法实时分发数据集&#xff1f; 虹科Redis企业版数据库解决方案来了&#xff01;企业将Redis企业版数据库与MySQL一起使用&#xff0c;可以实现企业缓存或复制数据库&#xff0c;从而使应用…