JAVAEE——request对象(三)

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在以后开发类似投票程序的时候能够用上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个命令查看linux系统是Centos还是Ubuntu

目 录 一、 背景介绍 二、一个命令查看linux系统的简单方法 1、 uname -a 2、cat /etc/issue 3、lsb_release -a 4、 dmesg | grep Ubuntu 一、 背景介绍 Linux 系统基本上分为两大类&#xff1a; 1. Red Hat 系列&#xff1a;包括 Red Ha…

ipv6(centos布置-亲自操刀)

这一篇本来不太想写&#xff0c;但想想&#xff0c;不写出来后面又忘记了&#xff0c;就写写看了&#xff0c; 切记&#xff0c;大家看完别去用来做别的事情哈 正文来了&#xff1a; 开始就去注册一个Ipv6隧道服务吧 在隧道信息的下方有Example IPv6 Tunnel Configurations …

openEuler安装Docker艰辛路程

文章目录 安装docker测试docker关于windows docker拉取镜像查看所有镜像删除镜像删除不在运行的进程强制删除正在运行的进程 启动docker容器服务-d测试 停止docker容器服务查看docker启动进程更新容器(没有自启动功能&#xff0c;更新为自启动)docker端口映射进入容器修改内容退…

python + selenium 初步实现数据驱动

如果在进行自动化测试的时候将测试数据写在代码中&#xff0c;若测试数据有变&#xff0c;不利于数据的修改和维护。但可以尝试通过将测试数据放到excel文档中来实现测试数据的管理。 示例&#xff1a;本次涉及的项目使用的12306 selenium 重构------三层架构 excel文件数据如…

单机物理机部署Datax

一、概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/DataX 为了解决异构数据…

Portalgraph VR空间投影仪:可以将VR空间投射到任意平面上的新型VR投影技术

通过一项创新的科技突破&#xff0c;Portalgraph VR空间投影仪成功地在现实与虚拟空间之间搭建起了一座神奇的“时空传送门”。这投影一技术不仅打破了传统虚拟现实设备的局限&#xff0c;更让人们无需佩戴任何头戴显示器&#xff0c;仅凭裸眼就能在任何平面上看到虚拟现实空间…

RibbonGroup添加QAction

实际项目中&#xff0c;group中需要添加按钮与点击事件&#xff1a; 添加实例如下&#xff1a; if (Qtitan::RibbonGroup* groupClipboard pageHome->addGroup(tr("Clipboard"))) { //右下角按钮显示 groupClipboard->setO…

高效办公:在文件夹名称左边插入关键字,提高文件管理效率

在繁忙的工作环境中&#xff0c;经常要处理大量的文件和文件夹。有效的文件管理是一个挑战&#xff0c;大量的文件和文件夹难以找到所需的资料。下面一起来看云炫文件管理器如何在文件夹名称左边批量插入关键字。 文件夹名称左边添加关键字前后对比图。 文件夹名称左边批量插…

电脑扩容升级硬盘选1T还是2T

SSD固态有必要升级2TB吗&#xff1f;----------吴中函 某大二学生用的一台笔记本电脑&#xff0c;512GB的硬盘空间已经严重不够用了&#xff0c;想给笔记本扩容升级一下硬盘&#xff1b; 这位学生是学设计专业的、平时也喜欢摄影、电脑里面也装了一些游戏&#xff0c;经常整理、…

OFBiz RCE漏洞复现(CVE-2023-51467)

漏洞名称 Apache OFBiz 鉴权绕过导致命令执行 漏洞描述 Apache OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0c;提供了创建基于最新J2EE/XML规范和技术标准&#xff0c;构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式…

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式&#xff1a;每个列都不可以再拆分。 第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。 第三范式&#xff1a;在第二范式的基础上&#xff0c;非主键列只依赖于主键&#…

数模学习day13-典型相关分析

典型相关分析&#xff08;Canonical Correlation analysis&#xff09; 研究两组变量&#xff08;每组变量中都可能有多个指标&#xff09;之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 注&#xff1a;本文源于数学建模学习交流相关公众号观…

手把手教你在Ubuntu下建gitlab,试用于Ubuntu20、Ubuntu22、Ubuntu23

一、gitlab说明 略 二、准备工作 更新系统&#xff0c;安装依赖库$ sudo apt update && sudo apt upgrade $ sudo apt install apt install ca-certificates curl openssh-server postfix配置安装GitLab所需要的源$ curl -sS https://packages.gitlab.com/install/re…

Qt点击按钮在附近弹出下拉框

效果 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include"toollayout.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow…

js动态设置关键侦@keyframes

js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%&#xff1b;to 等价与 100% // 或…

如何确定测试用例的优先级?5个方面

测试用例优先级的确定&#xff0c;有助于测试团队合理分配测试资源&#xff0c;集中精力测试重点功能和场景&#xff0c;确保重点功能测试用例的覆盖率&#xff0c;从而有利于快速发现和解决重点功能缺陷&#xff0c;确保项目进度和质量。 如果测试用例没有明确的优先级&#x…

函数的秘密

1. 函数的概念 在数学中我们学习过函数&#xff0c;而在C语言中其有着与数学不同的概念&#xff1a; 在C语言中&#xff0c;函数是指一组执行特定任务的语句&#xff0c;这些语句可以重复使用&#xff0c;并且可以在程序的不同部分调用。通过使用函数&#xff0c;程序员可以将…

GIS融合之路(五)番外-山海鲸的体积云又又又升级了

一转眼自上一篇文章已经过去半年之久&#xff0c;承诺的CesiumJS的天气文章竟然又又又又跳票了&#xff0c;没办法。开发任务时间紧&#xff0c;任务重。GIS的进一步整合进入深水区&#xff0c;每向前迈一步都是步履维艰&#xff0c;好不容易把体积雾&#xff0c;接触阴影&…

利用docker的LNMP

服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.20.0.30 Docker-php 任务需求 使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台…

Spark---RDD(Key-Value类型转换算子)

文章目录 1.RDD Key-Value类型1.1 partitionBy1.2 reduceByKey1.3 groupByKeyreduceByKey和groupByKey的区别分区间和分区内 1.4 aggregateByKey获取相同key的value的平均值 1.5 foldByKey1.6 combineByKey1.7 sortByKey1.8 join1.9 leftOuterJoin1.10 cogroup 1.RDD Key-Value…