Servlet文档2

news2024/11/27 22:40:53

servlet文档2

HttpServletRequest

获取请求头API

getMethod()获取请求的方式
getRequestURI()获取请求的uri(相对路径)
getRequestURL()获取请求的url(绝对路径)
getRemoteAddr()获取请求的地址
getProtocol()获取请求的协议
getRemotePort()获请请求的端口
getHeader(“Host”);获取请求的端口+地址
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("获取请求方式:"+request.getMethod());//GET
        System.out.println("获取请求的相对路径:"+request.getRequestURI());// /ServletDemo
System.out.println("获取请求的绝对方式:"+request.getRequestURL());// http://localhost:8081/ServletDemo
        System.out.println("获取http版本:"+request.getProtocol());// HTTP/1.1
        System.out.println("获取客户端的ip:"+request.getRemoteAddr());// 10.50.5.137
        System.out.println("获取当前请求地址+端口:"+request.getHeader("Host")); // 10.50.5.197:8081
    }

获取请求参数 API

public String getParameter(String name)获取请求指定单个参数
public String[] getParameterValues(String name)获取请求指定多个参数
public Map<String,String[]> request.getParameterMap()获取页面所有提交过来的数据

页面准备

    <form action="ServletDemo2" method="post">

        user:<input type="text" name="username"><br>
        sex:<input type="text" name="sex"><br>
        age:<input type="text" name="age"><br>

        爱好:<input type="checkbox" name="hobby" value="吃饭">吃饭
             <input type="checkbox" name="hobby" value="睡觉">睡觉
             <input type="checkbox" name="hobby" value="打豆豆">打豆豆<br>
        
			<input type="submit">
    </form>

代码实现

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //指定获取输入框内容,如果获取不到返回null
        String username = request.getParameter("username");
        String sex = request.getParameter("sex");
        String age = request.getParameter("age");
        System.out.println(username);
        System.out.println(sex);
        System.out.println(age);
        
        System.out.println("=========================");
        //如果是复选框,获取的值很多,指定获取只能获取第一个
        String hobby = request.getParameter("hobby");
        System.out.println(hobby);
        //request.getParameterValues("hobby"); 获取多个值
        String[] hobbies = request.getParameterValues("hobby");
        if(hobbies != null){
            for(String str : hobbies){
                System.out.println(str);
            }
        }
        
         System.out.println("==========================");
        //获取页面上所有提交的数据
        Map<String, String[]> map = request.getParameterMap();
        Set<String> set = map.keySet();
        for(String key : set){
            String[] values = map.get(key);
            for(String value : values){
                System.out.println(value);
            }
        }
    }

Post请求乱码的解决方案

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决post请求乱码问题
        request.setCharacterEncoding("utf-8");

        //指定获取输入框内容,如果获取不到返回null
        String username = request.getParameter("username");
        String sex = request.getParameter("sex");
        String age = request.getParameter("age");

        System.out.println(username);
        System.out.println(sex);
        System.out.println(age);
    }

Get请求乱码的解决方案

补充:

tomcat8 以上的版本都默认解决了get请求乱码问题,无需关注

        String username = request.getParameter("username");
	    //变量10个。
        username = new String(username.getBytes("iso8859-1"),"utf-8");
        System.out.println(username);

转发

在这里插入图片描述

public RequestDispatcher getRequestDispatcher(String path)转发
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //转发到指定页面
        // request.getRequestDispatcher("index.jsp").forward(request,response);

        //转发指定servlet
        request.getRequestDispatcher("ServletDemo").forward(request,response);
    }

在这里插入图片描述

转发:
	一次请求一次响应
	转发是服务器内部行为
	url不会发生改变

域对象

域:区域的含义;

什么是域对象

一个有作用范围的对象,可以在范围内共享数据

常见的域对象

* Request    范围是一次请求
* Session    范围是一次会话
* ServletContext(application)   范围是整个项目中,直到服务器关闭

域对象共有方法

方法说明
void setAttribute(String name,Object obj)设置数据
Object getAttribute(String name)获取数据
void removeAttribute(String name)删除数据

Request域

代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据

@WebServlet("/aServlet")
public class AServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("去就AServlet");
 
        //向request域对象中 存一个数据
        request.setAttribute("hanbao", "香辣鸡腿堡");
        // 链式编程横
        request.getRequestDispatcher("bServlet").forward(request, response);
    }
}
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我就BServlet");
        //向request域对象中 获取数据
        String hanbao = (String) request.getAttribute("hanbao");
        System.out.println("hanbao:" + hanbao);
    }
}

ServletContext域

@WebServlet("/oneServlet")
public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 向servletContext域存数据
        ServletContext sc1 = request.getServletContext();
        sc1.setAttribute("user", "jack");
        System.out.println("我是oneServlet");
    }
}
@WebServlet("/twoServlet")
public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 从servletContext域获取数据
        String user = (String) request.getServletContext().getAttribute("user");
        System.out.println("twoServlet获取数据:"+user);
    }
}
  • ServletContext生命周期

    1. 何时创建?
    		项目加载时,创建
    		
    2. 何时销毁?
    		项目服务器关闭时,销毁
    
    3. 作用范围?
    		与项目共存亡(多个servlet都可以操作它)
    

HttpServletResponse

常用API

public void setStatus(int status)设置响应状码
public void [setHeader](mk:@MSITStore:F:\api\java_ee_api_中英文对照版.chm::/javax/servlet/http/HttpServletResponse.html#setHeader(java.lang.String, java.lang.String))(Stringname,String value)设置响应该头

向客户端浏览器,发数据,中文,乱码;

response.setCharacterEncoding(“utf-8”);

setContextType(“text/html;charset=utf-8”)

重定向

在这里插入图片描述

重定向: 客户端形行,一次请求,两次响应,把上一个url清空,重新响应了一个新的url,最终看到是新的url
 		重定向不能返回上一个url
实现方式: 		
	1:状态码302+响应地址
	2:response.sendRedirect()
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //重定向
        response.setStatus(302);
        response.setHeader("Location","http://localhost:8081/index.jsp");

        //这种方法等价于以上两行代码
        response.sendRedirect("http://localhost:8081/index.jsp");

    }

重定向和转发的区别

重定向(redirect):属于客户端行为,一次请求两个url,url会在地址栏中显示,不能返回上一个历史记录,不能携带数据
转 发(forward): 属于服务器行为,一次请求一个url,url地址始终只有一个,可以携带数据

设置响应体

setContentType(String charset)设置响应字符集(解决响应乱码问题)
getWriter()把响应内容以流的形式输出(响应给浏览器)
getHeader()设置响应头

响应浏览内容

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应体及响应乱码
        response.setContentType("text/html;charset=utf-8");

        //响应给浏览器
        PrintWriter writer = response.getWriter();
        writer.println("<h2>servlet是动态网页技术</h2>");
        writer.println("<font style='color:red'>servlet高大尚</font>");

        response.getWriter().println("哈哈哈,我是从后台servlet响应给浏览器的");
    }

解决响应乱码问题

        //设置响应体及响应乱码
        response.setContentType("text/html;charset=utf-8");

自动刷新

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应体及响应乱码
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println("对不起,你访问的资源不存在,3秒之后跳转到yiyan网站!!");

        response.setHeader("refresh","3;url=https://www.baidu.com");
    }
回顾html自动刷新:
    <meta http-equiv="refresh" content="3;url=https://www.baidu.com">

生成图片验证码

servlet代码

package cn.yanqi.web;

import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet(urlPatterns = "/Checkcode")
public class Checkcode extends HttpServlet {
    private static final int WIDTH = 100;	//设置验证码图片宽度
    private static final int HEIGHT = 30;	//设置验证码图片高度
    private static final int LENGTH = 4;	//设置验证码长度
    public static final int LINECOUNT=20;	//干扰线的数目

    //验证码的字符库
    private static final String str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    //通过随机数取字符库中的字符组合成4位验证码
    private static Random random=new Random();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置数据类型为图片
        resp.setContentType("image/jpeg");

        //设置不进行缓存
        resp.setHeader("pragma", "no-cache");
        resp.setHeader("cache-control", "no-cache");
        resp.setHeader("expires", "0");



        //获取画笔
        BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);
        Graphics g=image.getGraphics();

        //设置背景颜色并绘制矩形背景
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        //验证码的绘制
        String code=drawChar(g);
        System.out.println("验证码:"+code);


        //随机线的绘制
        for (int i=0;i<LINECOUNT;i++){
            drawLine(g);
        }

        //在session中存入当前的code码,便于验证
        req.getSession().setAttribute("code",code);

        //绘制图片
        g.dispose();

        //将图片输出到response中
        ImageIO.write(image, "JPEG", resp.getOutputStream());
    }

    //获取不同颜色
    public  Color getColor(){
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
    }

    //获取字体样式
    public Font getFont() {
        return new Font("Fixedsys", Font.CENTER_BASELINE, 20);
    }

    //绘制字符
    public String drawChar(Graphics g){
        String code="";
        g.setFont(getFont());
        for (int i=0;i<LENGTH;i++){
            char c=str.charAt(random.nextInt(str.length()));
            g.setColor(getColor());
            g.drawString(c+"", 20* i + 10, 20);
            code=code+c;
        }
        return code;
    }

    //绘制随机线
    public  void drawLine(Graphics g) {
        int x = random.nextInt(WIDTH);
        int y = random.nextInt(HEIGHT);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.setColor(getColor());
        g.drawLine(x, y, x + xl, y + yl);
    }
}

JS代码

    <form action="ServletDemo2" method="post">
        user:<input type="text" name="username"><br>
        sex:<input type="text" name="sex"><br>
        age:<input type="text" name="age"><br>

        爱好:<input type="checkbox" name="hobby" value="吃饭">吃饭
             <input type="checkbox" name="hobby" value="睡觉">睡觉
             <input type="checkbox" name="hobby" value="打豆豆">打豆豆<br>

        验证码:<input type="text" name="ckimg">
        		<img src="/Checkcode"  id="_img"><br>

        <input type="submit">
    </form>
    <script>
        window.onload = function () {
            var _img = document.getElementById("_img");
            _img.onclick = function () {
                var date = new Date();
                _img.src ="/Checkcode?"+date.getTime();
            };
        }
    </script>

JAVA代码

		//获取用户输入的验证码
        String _img = request.getParameter("ckimg");
        //获取服务器生成的验证码
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute("code");
        //为了保证验证是有效的唯一,把上一个给清了
        session.removeAttribute("code");	
        //判断
        if(!_img.equalsIgnoreCase(code)){
            //提示用户
      		System.out.println("验证码不正确!");
            return;
        }

ode?"+date.getTime();
};
}


## JAVA代码

```java
		//获取用户输入的验证码
        String _img = request.getParameter("ckimg");
        //获取服务器生成的验证码
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute("code");
        //为了保证验证是有效的唯一,把上一个给清了
        session.removeAttribute("code");	
        //判断
        if(!_img.equalsIgnoreCase(code)){
            //提示用户
      		System.out.println("验证码不正确!");
            return;
        }

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

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

相关文章

Vue3 CSS v-bind 计算和三元运算

官方文档 中指出&#xff1a;CSS 中的 v-bind 支持 JavaScript 表达式&#xff0c;但需要用引号包裹起来&#xff1a; 例子如下&#xff1a; <script lang"ts" setup> const treeContentWidth ref(140); </script><style lang"less" scop…

mschart Label Formart显示数值的格式化

默认这个数值想显示2位小数&#xff0c; 格式化代码如下。 series1.Label "#VAL{###.###}";

字符指针?指针数组?数组指针?《C语言指针进阶第一重奏》

目录 一.字符指针 1.1字符指针的认识 1.2字符指针存放字符串 1.3字符指针的使用 二.指针数组 2.1指针数组的认识 三.数组指针 3.1数组指针的认识 3.2数组名和&数组名的区别 3.3数组指针的使用 3.4数组参数&#xff0c;指针参数 3.5一维数组传参 3.6二维数组传…

如何让Stable Diffusion正确画手(1)-通过embedding模型优化图片质量

都说AI画手画不好手&#xff0c; 看这些是我用stable diffusion生成的图片&#xff0c;小姐姐都很漂亮&#xff0c;但手都千奇百怪&#xff0c;破坏了图片的美感。 其实只需要一个提示词&#xff0c;就能生成正确的手部&#xff0c;看这是我重新生成的效果&#xff0c;每一个小…

【leetcode】面试题 02.01. 移除重复节点 (python + 链表)

题目链接&#xff1a;[leetcode] 面试题 02.01. 移除重复节点 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val x # self.next Noneclass Solution(object):def removeDuplicateNodes(self, he…

MySQL为什么采用B+树作为索引底层数据结构?

索引就像一本书的目录&#xff0c;通过索引可以快速找到我们想要找的内容。那么什么样的数据结构可以用来实现索引呢&#xff1f;我们可能会想到&#xff1a;二叉查找树&#xff0c;平衡搜索树&#xff0c;或者是B树等等一系列的数据结构&#xff0c;那么为什么MySQL最终选择了…

尚硅谷Docker实战教程-笔记12【高级篇,Docker-compose容器编排】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…

一篇文章搞懂Libevent网络库的原理与应用

1. Libevent介绍 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a; > - 事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能; > - 轻量级&#xff0c;专注于网络&#xff1b; > - 源代码相当…

前端(五)——从 Vue.js 到 UniApp:开启一次全新的跨平台开发之旅

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;从 Vue.js 到 UniApp&#xff1a;开启一次全新的跨平台开发之旅 文章目录 UniApp和vue.js什么是UniApp&#xff1f;UniApp的写法什么是vue.js&#xff1f;UniApp与vue.js是什么关系&#xff1f; 为什…

Python+Appium+Pytest自动化测试-参数化设置

来自APP Android端自动化测试初学者的笔记&#xff0c;写的不对的地方大家多多指教哦。&#xff08;所有内容均以微博V10.11.2版本作为例子&#xff09; 在自动化测试用例执行过程中&#xff0c;经常出现执行相同的用例&#xff0c;但传入不同的参数&#xff0c;导致我们需要重…

【Redis基础】快速入门

一、初识Redis 1. 认识NoSQL 2. 认识Redis Redis诞生于2009年&#xff0c;全称是Remote Dictionary Server&#xff08;远程词典服务器&#xff09;&#xff0c;是一个基于内存的键值型NoSQL数据库特征 &#xff08;1&#xff09;键值&#xff08;key-value&#xff09;型&am…

测试员如何突破自我的瓶颈?我有几点看法

前阵子我自己也对如何“突破瓶颈”思考过&#xff0c;我觉得“突破瓶颈”、“弥补短板”等等都大同小异&#xff0c;从古至今就是测试员们津津乐道的话题。我也对自己该如何“突破瓶颈”总结了几点&#xff0c;跟大家分享下&#xff1a; 1、“常立志、立长志”。“立志”就是目…

Vue脚手架使用【快速入门】

一、使用vue脚手架创建工程 在黑窗口中输入vue ui命令 再更改完路径地址后需要按回车 二、vue工程中安装elementui 第一种可以在黑窗口输入命令安装 npm install -s element-ui第二种使用图形化安装 三、 在vue工程中安装axios 第一种可以在黑窗口输入命令安装 npm inst…

ECMAScript6之一

目录 一、介绍 二、新特性 2.1 let 和 const 命令 2.2 es6的模板字符串 2.3 增强的函数 2.4 扩展的字符串、对象、数组功能 2.5 解构赋值 2.6 Symbol 2.7 Map 和 Set 2.8 迭代器和生成器 2.9 Promise对象 2.10 Proxy对象 2.11 async的用法 2.22 类class 2.23 模块…

linux内核中kmalloc与vmalloc

kmalloc 和 vmalloc 是 Linux 内核中的两种内存分配方法&#xff0c;它们都用于为内核分配内存&#xff0c;但它们在使用和管理内存方面存在一些重要差异。下面我们详细讨论这两种内存分配方法的异同。 相同点&#xff1a; 都是内核空间的内存分配方法。都可以用于动态分配内…

anaconda目录下的pkgs文件夹很大,可以删除吗?

pkgs这个目录占用了6GB的硬盘空间。 其实里面是conda安装第三方包的时候保存在本地的下载文件&#xff0c;大部分是可以删除的。 只是删除后&#xff0c;后续你需要创建虚拟环境的时候或者在虚拟环境下pip安装第三方库的时候&#xff0c;会从网络去下载&#xff0c;没法直接从…

Jmeter的常用设置(一)

文章目录 前言一、Jmeter设置中文 方法一&#xff08;临时改为中文&#xff09;方法二&#xff08;永久改成中文&#xff09;二、启动Jmeter的两种方式 方法一&#xff08;直接启动&#xff0c;不打开cmd窗口&#xff09;方法二&#xff08;带有cmd窗口的启动&#xff09;三、调…

【xxl-job】本地部署并接入xxl-job到项目中

本地部署并接入xxl-job到项目中 一、xxl-job简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 什么是分布式任务调度 通常任务调度的程序是集成在应用…

SparkCoreDAG

DAG有向无环图 倒推 故推导程序的执行计划时&#xff0c;先看代码有几个action算子&#xff0c;从action倒推 一个action会产生一个JOB&#xff08;DAG&#xff09;&#xff08;即一个应用程序内的子任务&#xff09; 一个action一个Job一个DAG 一个application里面可以有多…

Latex:画图识别符号

http://detexify.kirelabs.org/classify.html