request对象:
request对象是使用最多的一个对象,其主要作用是接受客户端传来的参数、发送的头信息等,request是
javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要应用在http协议上;
对应接口:javax.servlet.http.HttpServletRequest extends ServletRequest;
request_demo01.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<form action="request_demo02.jsp" method="post">
请输入信息:<input type="text" name="info"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
request_demo02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<%
String name=request.getParameter("info");
%>
<h1>姓名:<%=name%></h1>
</body>
</html>
如上所示:如果输入的信息是中文,则传递过去将会出现乱码;
1、乱码解决:
由于request接受的是客户端的参数,所以必然有其默认的编码,之所以这样是因为浏览器默认的编码是utf-8,
而中文的编码是GBK,因为不同统一,所以出现了乱码;
pageEncoding="UTF-8" 设置jsp编译成.java文件的编码
contentType="text/html; charset=UTF-8":设置页面编码,告诉浏览器以什么编码来解析文档,以什么编码来发送数据(当请求为get,post);
request.setCharacterEncoding("UTF-8");设置web服务器对浏览器发送的请求数据的编码(默认是IS08859-1);
response.setCharacterEncoding("UTF-8");设置web服务器给浏览器发送的回复数据的编码(默认是IS08859-1);
解决乱码就得通过jsp提供的统一设置编码的方法---request.setCharacterEncoding("gbk");;
request_demo01.jsp:
<%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<form action="request_demo02.jsp" method="post">
请输入信息:<input type="text" name="info"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
request_demo02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<%
request.setCharacterEncoding("gbk");
String name=request.getParameter("info");
%>
<h1>姓名:<%=name%></h1>
<%=request.getCharacterEncoding()%>
</body>
</html>
以后只要进行传递,则肯定要使用这条语句进行乱码解决的;
如果这种乱码解决不了,还有第二种方法:
String name=new String(request.getParameter("info").getBytes("ISO8859-1"));
2、接收参数:
request_demo01.jsp:
<%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<form action="request_demo02.jsp" method="post">
姓名:<input type="text" name="uname"/><br/>
兴趣:<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="checkbox" name="inst" value="旅游">旅游
<br><input type="hidden" name="id" value="3"/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
request_demo02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<%
request.setCharacterEncoding("gbk");
String id=request.getParameter("id");
String uname=request.getParameter("uname");
String inst[]=request.getParameterValues("inst");
%>
兴趣:
<%
if(inst!=null){//避免为空
for(int i=0;i<inst.length;i++){
%>
<%=inst[i]%>
<%
}
}
%>
<h1>姓名:<%=uname%></h1>
</body>
</html>
3、URL地址重写:
在web开发中,所有的参数不一定都是由表单传递的,也可以使用地址重写的方式进行传递,地址重写的
格式如下:
动态页面地址:?参数名称1=参数内容&参数名称2=参数内容
request_demo02.jsp
<%@ page contentType="text/html" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<%
request.setCharacterEncoding("gbk");
String uname=request.getParameter("name");
String password=request.getParameter("password");
%>
<h1>姓名:<%=uname%></h1>
<h1>密码:<%=password%></h1>
</body>
</html>
直接打开request_demo02.jsp网页时姓名和密码为空,但是可以重写url如下:
http://localhost/lid/request/request_demo02.jsp?name=lid&password=123
4、表单提交的两种方式:get和post
post提交:提交后的地址栏不会再目标地址后面附加其他内容;
get提交:提交后的地址栏会发生变化,而且会是由URL地址重写的方式完成,并且决定会受到地址栏长度的影响;
在request中还有一个很重要的方法:
Enumeration getParameterNames()
从名字可以看出是返回说有参数的名字;
request_demo01.jsp
<%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<form action="request_demo02.jsp" method="post">
姓名:<input type="text" name="uname"/><br/>
性别:<input type="radio" name="sex" Checked/>男
<input type="radio" name="sex" />女<br/>
城市:<select name="city">
<option value="北京">北京</option>
<option value="天津">天津</option>
<option value="洛阳">洛阳</option>
</select><br/>
兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
<input type="checkbox" name="inst" value="跳舞">跳舞
<input type="checkbox" name="inst" value="书法">书法
<input type="checkbox" name="inst" value="摄影">摄影<br/>
自我介绍:<textarea cols="30" rows="3" name="notes"></textarea><br/>
<input type="hidden" name="uid" value="1">
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
如果按照以前的方式,接受不同参数用request.getParameter("param"),而所有的数组内容则用request.getParameterValues()接受;
现在我们用request.getParameterNames()接受:
request_demo01.jsp
<%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<head><title>这是测试</title></head>
<body>
<form action="request_demo02.jsp" method="post">
姓名:<input type="text" name="uname"/><br/>
性别:<input type="radio" name="sex" value="男" Checked/>男
<input type="radio" name="sex" value="女"/>女<br/>
城市:<select name="city">
<option value="北京">北京</option>
<option value="天津">天津</option>
<option value="洛阳">洛阳</option>
</select><br/>
兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
<input type="checkbox" name="inst" value="跳舞">跳舞
<input type="checkbox" name="inst" value="书法">书法
<input type="checkbox" name="inst" value="摄影">摄影<br/>
自我介绍:<textarea cols="30" rows="3" name="notes"></textarea><br/>
<input type="hidden" name="uid" value="1">
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
request_demo02.jsp
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%
request.setCharacterEncoding("gbk");//设置统一编码
//取得所有参数
Enumeration enu=request.getParameterNames();
%>
<table border="1">
<tr>
<td>参数</td>
<td>数值</td>
</tr>
<%
while(enu.hasMoreElements())
{
String paramName=(String)enu.nextElement();
%>
<tr>
<td><%=paramName%></td>
<td>
<%
//如有以**开头则是数组类型的
if(paramName.startsWith("**")){
String str[]=request.getParameterValues(paramName);
for(int i=0;i<str.length;i++){
%>
<%=str[i]%>
<%
}
}
else{
%>
<%=request.getParameter(paramName)%>
<%
}
%>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
5、显示头信息:
java的web的开发使用的是http协议,主要的操作就是基于请求和相应,但是在请求和相应的同时还会包含
其他信息(客户端的ip,cookie、语言等),那这些信息叫做头信息;
要想获得这些通信息的名称可以直接通过request内置对象的getHeaderNames(),而要想获得每个头信息的内容,
则使用getHeader()方法;
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*" %>
<html>
<head><title>这是测试</title></head>
<body>
<%
Enumeration enu=request.getHeaderNames();
while(enu.hasMoreElements()){
String headerName=(String)enu.nextElement();
String headerValue=request.getHeader(headerName);
%>
<h3><%=headerName%>---><%=headerValue%></h3>
<%
}
%>
</body>
</html>
6、角色验证:
tomcat安装的时候设置过用户名和密码:
验证框可以通过程序实现,如果要实现,则使用方法:boolean isUserInRole(String role)
这种验证实际上就是相当于是在tomcat上增加了些新的用户而已,如果要想增加用户修改配置文件conf/tomcat-users.xml
<role rolename="manager"/>
<role rolename="admin"/>
<user name="admin" password="admin" roles="manager-gui" />
<user name="lid" password="123" roles="admin,manager" />
<user name="yuj" password="123" roles="admin" />
配置完成之后,重新启动服务器,
配置完成之后还需要配置WEB-INF/web.xml文件.
<security-constraint>
<web-resource-collection>
<web-resource-name>RegisteredUsers</web-resource-name>
<url-pattern>/request/request_demo02.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Registered Users</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>manager</role-name>
</security-role>
下面编写角色的验证操作:
即在demo01.jsp中写如下语句:
<%
if(request.isUserInRole("admin")){
%>
<h2>欢迎光临</h2>
<%
}
%>
7、其他操作:
通过request对象可以取得客户端的IP地址、请求方式、访问的路径、上下文的名称等等;
<%
String method=request.getMethod();//得到请求的方式
String ip=request.getRemoteAddr();//得到请求的ip
String path=request.getServletPath();//得到访问路径
String contextPath=request.getContextPath();//得到上下文路径
%>
<h3>请求方式:<%=method%></h3>
<h3>请求IP:<%=ip%></h3>
<h3>访问路径:<%=path%></h3>
<h3>上下文路径:<%=contextPath%></h3>
request.getContextPath()在以后的开发中非常重要可以解决跳转路径问题;