1. request对象
1.1 知识点
(1)乱码问题的两种解决方式
(2)post和get提交的区别
(3)request接收同名参数的问题
1.2 具体内容
**·**使用request接收参数
html
<%@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>
html
<%@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数组转换成字符串。
html
<%@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。
html
<%@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中的一个方法:
java
void setCharacterEncoding(java.lang.String env) throws java.io.UnsupportedEncodingException
而且我们知道request对象就是HttpServletRequest这个接口的对象。
html
<%@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呢?
html
<%@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>
html
<%@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>
**·**接收多个同名参数
html
<%@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) |
意思就是说可以根据参数的名称取得一个参数内容的字符串数组。
html
<%@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() |
此方法就表示取得参数名称,但是发现此方法返回的是一个枚举对象。
html
<%@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()这个方法完成。
html
<%@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()这个方法呢?肯定是不可以的,这个方法有一个好处,就是不管我们的表单如何变化,我都能取得参数的名称,但是对于同名的参数又是一个问题。这个时候我们可以在参数名称上做手脚。
html
<%@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>
html
<%@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在以后开发类似投票程序的时候能够用上。