第一章 request&response对象
1.1. 简介
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了
第二章 HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
2.1. 常用操作:
通过Request对象进行的常用操作
获取客户机信息
获取请求头信息
获取请求参数
利用请求域传递对象
转发
2.2. 常用方法:
3.3. request获取客户机信息
案例:
1 2 3 4 5 6 7 8 9 10
| protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String remoteAddr = request.getRemoteAddr(); System.out.println("IP:" + remoteAddr); String contextPath = request.getContextPath(); System.out.println("项目路径:"+contextPath); }
|
2.4. request获取请求头信息
2.5. request获取请求参数
2.6. 案例:完成用户登录功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录界面</title> </head> <body style="text-align: center"> <h3>登录界面</h3> <form action="/JavaWebDay03/LoginServlet"> <br> 账号<input type="text" name="username"><br> <br> 密码<input type="password" name="password"><br> <br> <input type="submit" value="登录"><br> <br> </form> </body> </html>
|
Servlet代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| package cn.yueqian.homework;
import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import cn.yueqian.util.JDBCUtils;
@WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); String sql = "select * from user where username=?"; String str[] = {username}; ResultSet rs = JDBCUtils.executeQuery(sql, str); try { if(rs.next()) { String password_db = rs.getString("password"); if(password.equals(password_db)) { System.out.println("登录成功"); response.getWriter().append("<h1>登录成功</h1>"); }else { System.out.println("密码错误"); response.getWriter().append("<h1>密码错误</h1>"); } }else { System.out.println("没有这个用户"); response.getWriter().append("<h1>没有这个用户</h1>"); } } catch (SQLException e) { e.printStackTrace(); }
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
}
|
2.7. request利用请求域传递对象
将对象放到request域中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| @WebServlet("/Servlet3") public class Servlet3 extends HttpServlet { private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user = new User("张三", "123456"); request.setAttribute("user", user); request.getRequestDispatcher("Servlet4").forward(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
}
@WebServlet("/Servlet4") public class Servlet4 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user =(User) request.getAttribute("user"); System.out.println("传递过来的数据是:"+user); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
}
|
重定向:response.sendRedirect(“/myDemo2/jsp/index.jsp”);
2.8. 转发重定向简介
第三章 HttpServletResponse
HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
3.1. response 代码案例
重定向(登陆页面
页面定时刷新(页面读秒操作)
禁用浏览器缓存(三个头信息)
向页面输出中文(乱码问题)
实现文件下载l 实现验证码
3.2. response 指定状态码&头信息
状态码(Status Code)
setStatus(int)
常用状态码:200、302、304、404、500
头信息 (Header Info)
addHeader(String,String) 在原有值添加
setHeader(String,String) 替换原有值
3.3. response状态码和头信息应用
通过response实现请求重定向。
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向
302+Location —— response.sendRedirect
案例:用户登陆时,用户名密码错误,重定向回登陆页面
3.4. 发送http头,控制浏览器定时刷新网页(refresh)
用mate标签完成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="refresh" content="5;/JavaWebDay03/login.html">
<title>定时刷新</title>
</head> <body> 在开发中,meta标签可以模拟响应操作, <span id="spanId">5</span> 秒后跳到登录界面
</body> <script type="text/javascript"> var x = 5; function run(){ var span = document.getElementById("spanId"); span.innerHTML = x; x--; var time = setTimeout("run()", 1000); if(x=="0"){ time.clean(); } } run(); </script> </html>
|
3.5. Response禁用缓存
发送http头,控制浏览器禁止缓存当前文档内容
向页面输出时间,使用IE浏览器查看效果。
设置三个Http头信息禁用浏览器缓存
Cache-Control : no-cachel Pragma : no-cache
Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以 -1)
3.6. Response向页面输出中文
字节流输出中文
乱码和浏览器的编码有关
设置浏览器默认打开的时候的编码集
获得字节数组的时候,传入一个编码集
字符流输出中文
response的字符流的缓冲区是ISO-8859-1编码.
设置response缓冲区的编码.
设置浏览器的默认打开的时候字符集编码.
3.7. 注意事项:
3.8. Response文件下载
3.9. 输出验证码图片
步骤:
1.在内存中生成图片可以使用BufferedImage对象该对象可以获取画笔对象getGraphics()
2.随机生成字母或数字可以使用Random对象
3.把生成的数字或字母写在图片上通过画笔中的方法
4.把图片生成到页面上可以使用ImageIO对象
第四章 请求重定向和请求转发的区别 (面试题)
RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于服务器的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。