Servlet的实现和相关的方法 |
---|
一、HttpServletRequest类
HttpServletRequest类封装了从客户端传递过来的信息。
每次请求,Tomcat都会创建一个HttpServletRequest对象实例传递到service请求的方法中。
public void service(ServletRequest request, ServletResponse response);
《1》Request对象常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符
getRemoteHost() 获取请求的客户端ip地址
getHeader() 获取请求头信息
getParameter() 获取请求参数值(只能获取请求参数的一个值)
getParameterValues() 获取请求的多个值(常用于复选框和下拉列表多选)。
getRequestDispatcher() 获取请求的转发对象。转发请求(转发的请求和原请求共享request对象和response对象)
getMethod() 获取请求的方式GET 或 POST
setAttribute(key, value); 设置Request请求范围的属性值。
getAttribute(key); 获取Request请求范围的属性值。
ServletContext 是域对象(域的范围是整个web工程)
Request也是域对象之一 (是在同一个请求内)
getCookies() 获取Cook对象
getSession() 获取或创建Session对象
《2》获取请求行
request.getRequestURI(); 获取请求的资源路径 /day07/requst1 表示访问的是day07工程下的/request1的servlet动态资源
request.getRequestURL();获取请求的统一资源定位符。
http://192.168.11.30:8080/day07/request1
192.168.11.30 是我的ip地址
8080 服务器端口号
day07是工程名
request1 是资源的路径
获取请求的资源路径:
System.out.println( "getRequestURI==>>" + request.getRequestURI() );
// 获取请求路径的统一资源定位符
System.out.println( "getRequestURL==>>" + request.getRequestURL() );
图8
2) 获取访问的客户端的ip地址:
// 获取客户端的ip地址
System.out.println("getRemoteHost==>>" + request.getRemoteHost());
得到客户端的请求ip地址 例如:192.168.11.10 , 192.168.10.32等等
3) 获取请求头信息
//获取请求头的信息。
System.out.println("getHeader('User-Agent')==>>" + request.getHeader("User-Agent"));
打印内容(不同的浏览器,得到的信息不一样):
getHeader('User-Agent')==>>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
(二)获取请求参数的值★★★
《1》表单如下:
<form action="http://127.0.0.1:8080/day07/params" method="get">
用户名:<input name="username" type="text" /><br/>
密 码:<input name="password" type="password" /><br/>
兴趣爱好:
<input name="hobby" type="checkbox" value="c" />C
<input name="hobby" type="checkbox" value="cpp" />C++
<input name="hobby" type="checkbox" value="java" />java
<input name="hobby" type="checkbox" value="php" />php
<br/>
<input type="submit" />
</form>
2) 接收请求参数的代码:
public class Params extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取客户端传递过来的用户名参数值
String username = request.getParameter("username");
System.out.println("用户名:" + username);
// 获取密码
String password = request.getParameter("password");
System.out.println("密码:" + password);
-----------------------------------------------------------------------
// 获取兴趣爱好,这个方法只能获取到一个兴趣爱好。
// String hobby = request.getParameter("hobby");
// System.out.println("getParameter得到的兴趣爱好:" + hobby);
// 如果获取的参数有多个值的情况下。我们都使用getParameterValues方法来获取
// 因为它可以获取到多个值。而getParameter只能获取到一个值。
String[] hobbys = request.getParameterValues("hobby");
if (hobbys != null) {
for (String hb : hobbys) {
System.out.println("getParameterValues兴趣爱好:" + hb);
}
}
}
图片9
《2》做为域对象设置请求Request范围的属性值
把下面的这三行代码放到任意一个Servlet中,去请求访问。
// 在Request中设置 属性值。
request.setAttribute("abc", "abcValue");
// 获取 Request域中的属性值
String abcAttr = (String) request.getAttribute("abc");
System.out.println(abcAttr); // 控制台打印 abcValue
如果大家读源码你会发现。其实在Request对象中,有一个Map对象用来存放 属性值。
所以属性的操作就跟操作一个map对象是一样的。
☆☆二、请求转发
1)问题:什么是请求的转发?
请求的转发主要用在把Servlet中的数据转发到Jsp中去显示
jsp是一个Servlet程序
如图
图10
2)请求转发的具体实现代码:
从Servlet1转发到Servlet2
Servlet1实现如下:
图11
Servlet2实现如下:
图12
3) 直接在浏览器地址栏中输入 http://127.0.0.1:8080/day07/servlet1?username=abc 访问第1个Servlet1 程序
4) 控制台打印如下内容:
请求转的的小结:
比如Servlet1把请求转发给Servlet2
1.首先Servlet1和Servlet2中request和response对象是同一个对象。
2.在Servlet1,中和Servlet2都可以获取到相同的请求的参数值,
并且也可以获取到相同属性值
3.转发的时候,浏览器地址栏的地址不发会生变化
5)、Base标签转发中的相对路径
base 标签它会把所有的相对路径,设定在base指定的路径的基础之上做操作。
图14
三、HttpServletResponse类
Response对象封装了服务器到客户端返回的信息。
1)、获取输出流
getOutoutStream() 拿到的是二进制流。
主要用于返回二进制数据。比如说下载,图片验证码等。
getWriter() 拿到字符流。大部分的返回都用writer。
这两个输出流,我们不能同时获取两个,只能使用一个做为返回。
只要同时获取两个输出流就会报错,不管你是先获取二进制输出,还是先获取字符串输出流。
代码如下:
/**
* 同时通过response对象获取两个输出流对象,就会报错。
* 不管你是先获取二进制的字节流,还是字符流
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取二进制输出流
response.getOutputStream();
// 获取字符串输出流
response.getWriter();
}
图15
2)、输出字符串内容到客户端
往客户端输出。分两个步骤:
第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)
第二步:调用输出流对象,写出数据第客户端
如:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 通过response响应对象获取到字符输出流
Writer writer = response.getWriter();
// 往 客户 端 输出数据。
writer.write("this is response content!");
}
3)设置响应状态码,和设置响应头
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/**
* 当响应状态码为302的时候,表示要重定义。
* 浏览器会检测Location的值,去重新发起请求。
*/
// 设置响应状态码 302 表示重定向
response.setStatus(302);
// 设置响应头 Location中的信息
// 浏览器会把Location中的值重新发起一次请求。
// response.setHeader("Location", "http://127.0.0.1:8080/day07/response2");
// 浏览器会重新 发起请求http://www.baidu.com
response.setHeader("Location", "http://www.baidu.com");
}
2)在浏览器中访问响应状态的代码。得到的响应内容如下:
图16
并且浏览器收到响应后会马上自动发生起第二次的请求。
第二次请求的地址是Location对应的值。
总结重定向:
请求重定向。是两次请求,浏览器地址栏会发生改变。
第一次请求返回的响应码为302.并且有响应头Location的内容。
第二次请求的地址就是Location对应的值。
重定向,第二次请求不仅可以是站内的资源,也可以是站外的资源。
4.5、请求重定向 sendRedirect的方式
除了通过设置响应状态码和响应头可以实现重定向之外。
我们还可以通过HttpServletResponse对象的sendRedirect方法实现重定向。
代码如:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/**
* 当响应状态码为302的时候,表示要重定向。
* 浏览器会检测Location的值,去重新发起请求。
*/
// 设置响应状态码 302 表示重定向
// response.setStatus(302);
// 设置响应头 Location中的信息
// 浏览器会把Location中的值重新发起一次请求。
// response.setHeader("Location", "http://127.0.0.1:8080/day07/response2");
// 浏览器会重新 发起请求http://www.baidu.com
// response.setHeader("Location", "http://www.baidu.com");
//方式二、、 通过sendRedirect方法直接重定向到你需要的网址。
response.sendRedirect("http://www.baidu.com");
}
浏览器访问后,会有两次请求。
第一次是http://127.0.0.1:8080/day07/response3 访问上面的java代码。
第二次是访问Location中的地址。
最后:请求转发和重定向的对比
图18