JAVAEE——request对象(三)

news2024/12/26 10:43:32

1. request对象

1.1 知识点

(1)乱码问题的两种解决方式

(2)post和get提交的区别

(3)request接收同名参数的问题

1.2 具体内容

  ·使用request接收参数

<%@page contentType="text/html; charset=utf-8"%>
<form action="requestDemo02.jsp" method="post">
	输入姓名:<input type="text" name="name">
	输入公司:<input type="text" name="cname">
	<input type="submit" value="提交">
</form>
<%@page contentType="text/html; charset=utf-8"%>
<h1>姓名:<%=request.getParameter("name") %></h1>
<h1>公司名称:<%=request.getParameter("cname") %></h1>

  运行完代码发现,页面上本身的中文不会乱码,而传递过来的中文参数,无法显示,非中文则正常显示。意思就是说使用request去接收参数的过程会产生乱码。

分析乱码产生的原因:

         在这个web执行的流程中,是先从服务器上去取得requestDemo01.jsp,之后通过页面把表单进行提交,提交给服务器(tomcat),之后requestDemo02.jsp也发送一个请求,服务再讲内容返回给requestDemo02.jsp.我们现在页面的编码是utf-8,而服务器的编码是ISO8859-1,就等于说一个只懂中文的人和一个只懂英文的人对话,那么肯定是无法沟通。为了解决这个乱码问题,需要将字符串重新的变成byte数组,再讲byte数组转换成字符串。

<%@page contentType="text/html; charset=utf-8"%>
<%
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
	byte bName[] = name.getBytes("ISO8859-1");//让服务器认识你
	name = new String(bName);
	
	byte bCname[] = cname.getBytes("ISO8859-1");
	cname = new String(bCname);
	
 %>

<h1>姓名:<%=name %></h1>
<h1>公司名称:<%=cname%></h1>

通过转换之后发现还是乱码。因为浏览器只认识utf-8。

<%@page contentType="text/html; charset=utf-8"%>
<%
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
	byte bName[] = name.getBytes("ISO8859-1");//让服务器认识你
	name = new String(bName,"utf-8");//再次转换成浏览器能认识的编码
	
	byte bCname[] = cname.getBytes("ISO8859-1");
	cname = new String(bCname,"utf-8");
	
 %>

<h1>姓名:<%=name %></h1>
<h1>公司名称:<%=cname%></h1>

代码运行完观察发现可以正常显示,但是这种转换非常麻烦,最好的做法就是设置统一编码,之后的参数就按照这个统一的编码进行接收。如果说想要完成这个操作,必须使用HttpServletRequest中的一个方法:

void setCharacterEncoding(java.lang.String env) throws java.io.UnsupportedEncodingException

而且我们知道request对象就是HttpServletRequest这个接口的对象。

<%@page contentType="text/html; charset=utf-8"%>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
 %>

<h1>姓名:<%=name %></h1>
<h1>公司名称:<%=cname%></h1>

发现设置统一编码之后,就可以解决乱码问题,那么现在有两种乱码问题的解决方式,但是在开发中到底使用哪一种呢?肯定是使用第二种最方便,但是要说的是,两种方法如果其中的一种不能解决乱码问题,那么另外一种肯定是可以解决的。但是我们还是要说,使用第二种方式是最方便的。

·get和post提交

         对于表单的提交存在两种方式,就get和post提交。

         ·使用get提交

·使用post提交:

从页面可以发现,使用get提交的话,地址栏会显示所有提交的信息,证明使用get方式提交传递的参数会全部在地址栏中显示,而是用post提交则不会在地址栏中显示提交的参数内容。

         ·get:

                   |·会在地址栏显示提交的内容、

                   |·如果不希望用户看到提交的内容,最好不使用get提交(get不安全)

                   |·地址栏最多可以放4-5K的内容,如果提交的内容过多,则肯定无法正常提交

         ·post:

                   |·地址栏不会显示提交内容

                   |·安全

                   |·本身并不受长度的显示,理论上是可以提交任意的长度,当然如果确实提交内容太大的话,肯定会超出http的超时限制。

综合起来比较,使用post提交会更好,但是使用get提交也有一个好处,如下:

·URL重写(地址栏重写)

         我们除了使用表单传递参数之外,还可以使用地址栏重写的方式进行参数的传递。

http://localhost:8080/JspDemo01/request/requestDemo02.jsp?name=zby&cname=jjm

当然也可以通过a标签的形式,传递参数。

<a href="requestDemo02.jsp?name=zby&cname=jjm">跳转</a>

·隐藏域传递参数:我们在开发的时候,对于一些数据增删改,一般都会通过ID值进行,但是ID肯定不会显示在页面上,但是对于这些操作我们又需要ID,就是比如在修改的时候肯定会把ID作为一个参数进行传递,那么这个怎么去传递ID呢?

<%@page contentType="text/html; charset=utf-8"%>
<form action="requestDemo02.jsp" method="post">
	输入姓名:<input type="text" name="name">
	输入公司:<input type="text" name="cname">
	<input type="hidden" name="id" value="10">--》隐藏域
	<input type="submit" value="提交">
</form>

<a href="requestDemo02.jsp?name=zby&cname=jjm">跳转</a>
<%@page contentType="text/html; charset=utf-8"%>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
 %>

<h1>姓名:<%=name %></h1>
<h1>公司名称:<%=cname%></h1>
<h1><%=request.getParameter("id") %></h1>

·接收多个同名参数

<%@page contentType="text/html; charset=utf-8"%>
<form action="requestDemo02.jsp" method="post">
	输入姓名:<input type="text" name="name">
	输入公司:<input type="text" name="cname">
	<input type="hidden" name="id" value="10">
	兴趣:
	<input type="checkBox" name="inst" value="游泳"/>游泳
	<input type="checkBox" name="inst" value="唱歌"/>唱歌
	<input type="checkBox" name="inst" value="跳舞"/>跳舞
	<input type="checkBox" name="inst" value="打球"/>打球
	<input type="submit" value="提交">
</form>

<a href="requestDemo02.jsp?name=zby&cname=jjm">跳转</a>

对于这个兴趣的参数,怎么去接收呢?发现使用普通的参数接收,只能接收一个值,因为这个getParameter()这个方法只能接收一个值,这个时候如果想接收多个同名参数的话,我们可以先来观察API,可以发现有一个方法:

java.lang.String[] getParameterValues(java.lang.String name)

意思就是说可以根据参数的名称取得一个参数内容的字符串数组。

<%@page contentType="text/html; charset=utf-8"%>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
	String inst[] = request.getParameterValues("inst");
 %>

<h1>姓名:<%=name %></h1>
<h1>公司名称:<%=cname%></h1>
<h1><%=request.getParameter("id") %></h1>
<h1>兴趣:
<%
	for(int i = 0;i<inst.length ;i++){
%>
	<%=inst[i] %>、
<%
	}
%>
</h1>

通过运行结果发现,复选框的内容就已经全部的提交过来了,这个操作就是叫做接收同名参数,当然我们也可以通过方法取得参数的名称:

·取得参数名称

java.util.Enumeration<java.lang.String> getParameterNames()

此方法就表示取得参数名称,但是发现此方法返回的是一个枚举对象。

<%@page contentType="text/html; charset=utf-8"%>
<%@page import="java.util.*" %>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	//取得参数名
	Enumeration<String> en = request.getParameterNames();
	
 %>
<h1>参数名称:
<%
	while(en.hasMoreElements()){
%>
	<%=en.nextElement()%>、
<%
	}
%>
</h1>

 以上呢我们已经知道了取得参数的名称,如果想要取得参数值的话,就可以继续使用getParameter()这个方法完成。

<%@page contentType="text/html; charset=utf-8"%>
<%@page import="java.util.*" %>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	//取得参数名
	Enumeration<String> en = request.getParameterNames();
	
 %>
<h1>参数名称:
<%
	while(en.hasMoreElements()){
		String paramsName = en.nextElement();
%>
	<%=paramsName%>=<%=request.getParameter(paramsName) %>、
<%
	}
%>
</h1>

以上虽然将内容提取出来了,但是发现,复选框的值还是只有一个,是不是意味着可以放弃getParameterNames()这个方法呢?肯定是不可以的,这个方法有一个好处,就是不管我们的表单如何变化,我都能取得参数的名称,但是对于同名的参数又是一个问题。这个时候我们可以在参数名称上做手脚。

<%@page contentType="text/html; charset=utf-8"%>
<form action="requestDemo02.jsp" method="post">
	输入姓名:<input type="text" name="name" value="mlz">
	输入公司:<input type="text" name="cname" value="zhilian">
	<input type="hidden" name="id" value="10">
	兴趣:
	<input type="checkBox" name="**inst" value="游泳"/>游泳
	<input type="checkBox" name="**inst" value="唱歌"/>唱歌
	<input type="checkBox" name="**inst" value="跳舞"/>跳舞
	<input type="checkBox" name="**inst" value="打球"/>打球
	<input type="submit" value="提交">
</form>

<a href="requestDemo02.jsp?name=zby&cname=jjm">跳转</a>
<%@page contentType="text/html; charset=utf-8"%>
<%@page import="java.util.*" %>
<%
	request.setCharacterEncoding("utf-8");//设置统一编码
	//取得参数名
	Enumeration<String> en = request.getParameterNames();
	
 %>
<h1>参数名称:
<%
	while(en.hasMoreElements()){
		String paramsName = en.nextElement();
		%>
			<%=paramsName%>=
		<%
		if(paramsName.startsWith("**")){
			String values[] = request.getParameterValues(paramsName);
			for(int i = 0;i<values.length;i++){
%>
				<%=values[i] %>|
<%
			}
		
		}else{
%>
	<%=request.getParameter(paramsName) %>、
<%
		}
	}
%>
</h1>

以上就是对于参数接收的全部内容,还有一个就是去的客户端IP

·去的客户端IP:很多投票程序发现,如果这台机器投过票了,就不能再投,其实就是在投票是记录了这个客户端IP,那么怎么去的客户端的IP呢?

java.lang.String getRemoteAddr()

使用以上的方法就可以去的客户端IP。

<h1><%=request.getRemoteAddr() %></h1>

 1.3 小结

(1)学会使用request对象接收参数和参数名称。

(2)学会处理乱码问题(两种方式)。

(3)要掌握get和post方式提交的区别。

(4)对于取得客户端的IP在以后开发类似投票程序的时候能够用上。

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

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

相关文章

深入理解 go chan

go 里面&#xff0c;在实际程序运行的过程中&#xff0c;往往会有很多协程在执行&#xff0c;通过启动多个协程的方式&#xff0c;我们可以更高效地利用系统资源。 而不同协程之间往往需要进行通信&#xff0c;不同于以往多线程程序的那种通信方式&#xff0c;在 go 里面是通过…

C++ Primer 6.3 返回类型和return语句 知识点+练习题

C Primer 6.3 返回类型和return语句 无返回值函数有返回值的函数两个错误值是如何被返回的返回类类型的函数和调用运算符引用返回左值列表初始化返回值主函数main的返回值返回数组指针 递归练习题疑问待更新 无返回值函数 用在返回值类型为void的函数中&#xff0c;可以不写re…

01章【JAVA开发入门】

计算机基本概念 计算机组成原理 计算机组装 计算机&#xff1a;电子计算机&#xff0c;俗称电脑。是一种能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成&#xff0c;没有安装任何软件的计算机称为裸机。常见的形式有台式计算机、…

浅析五种 React 组件设计模式

作为一名 React 开发者&#xff0c;你可能会面临下面几个问题&#xff1a; 如何构建一个高复用度性的组件&#xff0c;使其适应不同的业务场景&#xff1f;如何构建一个具有简单 API的组件&#xff0c;使其易于使用&#xff1f;如何构建一个在 UI 和功能方面具有可扩展性的组件…

Vue3-TS中的接口-泛型-自定义类型

1首先一般在src下新建types文件夹&#xff0c;用来存放接口类型 2定义一个接口&#xff0c;用于限制person对象的具体属性 当需要用这个类型形成数组时&#xff0c;有2种写法 export type Persons Array<PersonInter> export type Persons PersonInter[] 3在文件中使…

检索增强生成技术(RAG)深度优化指南:原理、挑战、措施、展望

ChatGPT、Midjourney等生成式人工智能&#xff08;GenAI&#xff09;在文本生成、文本到图像生成等任务中表现出令人印象深刻的性能。然而&#xff0c;生成模型也不能避免其固有的局限性&#xff0c;包括产生幻觉的倾向&#xff0c;在数学能力弱&#xff0c;而且缺乏可解释性。…

C++基础算法之贪心

临渊羡鱼 不如退而结网 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 寒假带大家手撕算法 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 贪心算法的简介 贪心算法的介绍# 贪心的基本原理# 贪心的局限性# 贪心的特征# 贪…

用julia演示蝴蝶效应:洛伦兹吸引子

文章目录 Lorentz吸引子julia绘图关闭抗锯齿 蝴蝶效应的名字来源于蝴蝶扇动翅膀的动作&#xff0c;虽然这个动作微小&#xff0c;但可能会在数周后引起飓风等极端天气的发生。这种现象表明&#xff0c;微小的变化可能会被放大并产生非线性的结果。这个概念最早由美国气象学家爱…

【开源】基于JAVA的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

C++中map按照从大到小的顺序存储元素

map按照从大到小存储元素 引言map的大致介绍概述 场景误区示例示例代码&#xff08;方法一&#xff09;运行结果示例代码二&#xff08;方法二&#xff09;运行结果 引言 在对map的使用中&#xff0c;由于对业务的需要&#xff0c;希望map中存储元素能够按照键的大小从大到小的…

【EI会议征稿通知】2024年第三届能源互联网及能源交互技术国际会议(EIEIT 2024)

2024年第三届能源互联网及能源交互技术国际会议(EIEIT 2024) 2024 3rd International Conference on the Energy Internet and Energy Interactive Technology 随着EIEIT前2届的成功举办&#xff0c;我们很荣幸地宣布&#xff0c;2024年第三届能源互联网及能源交互技术国际学术…

牛客周赛 Round 6 解题报告 | 珂学家 | 数学场

前言 一切都是命运的安排。 整体评价 这场整体感觉有点简单&#xff0c;D题感觉不错&#xff0c;E题应该是超纲了。整场还是偏数学&#xff0c;个人还是喜欢Round 4/Round 5. A. 游游的数字圈 简单模拟题 0,6,9对应一个圆圈8对应2个圆圈 import java.io.BufferedInputStrea…

spring-boot集成mybait-plus+shareding实现分表分库,dynamic动态数据多数据源

spring-boot集成mybait-plusshareding实现分表分库&#xff0c;多数据源 1. Spring-boot集成shareding Mybatis-plus依赖引用yaml 配置示例 2. 引用 dynamic实现分表动态数据源依赖引用yaml配置数据源注入配置示例 说明&#xff1a; 以下内容为两部分&#xff1a; …

黑马苍穹外卖学习Day7

文章目录 缓存菜品实现思路代码开发 缓存套餐Spring Cache入门案例实现思路代码开发 添加购物车需求分析和设计代码开发 查看购物车需求分析代码开发 清空购物车需求分析代码实现 缓存菜品 实现思路 代码开发 Controller层 RestController("userDishController") …

C# new Thread和Task.Run,多线程(Thread和Task)

一、开启多线程-new Thread的使用 示例一 Thread thread25yi new Thread(new ThreadStart(obj.MethodTimer1)); thread25yi.Start(); void MethodTimer1() { while (true) { Console.WriteLine(DateTime.Now.ToString() "_" thread25yi.CurrentThread.Managed…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时&#xff0c;图片的上传和存放是一个问题&#xff0c;使用小众第三方图床&#xff0c;怕不稳定和倒闭&…

【SpringMVC】常用注解(续)

在SpringMVC常用注解一文中&#xff0c;已经对一些基本注解&#xff08;有Controller、RequestMapping、ResponseBody、RequestParam&#xff09;进行了简单介绍&#xff1b;在此篇文章中&#xff0c;将继续对剩余的几个常用注解进行简单介绍&#xff0c;有RequestBody、PathVa…

测试平台出问题?看我20分钟快速定位!

今天遇到一个问题&#xff0c;感觉挺有意思&#xff0c;处理过程也非常有意义&#xff0c;希望能给大家一个借鉴吧。今天一位小姐姐找到了我们大组长&#xff0c;说测试平台添加自动化测试用例失败&#xff0c;之后我们组长把我拉到了一个群里让我去看一下&#xff0c;硬着头皮…

uniapp 简易自定义日历

1、组件代码 gy-calendar-self.vue <template><view class"calendar"><view class"selsct-date">请选择预约日期</view><!-- 日历头部&#xff0c;显示星期 --><view class"weekdays"><view v-for"…