java web 学习 --第五天(Java三级考试)
第四天的学习内容:http://www.cnblogs.com/tobecrazy/p/3454860.html
Response对象
response对象主要是向客户端浏览器发送二进制数据,如输出Cookie、设置HTTP文件头信息等方面内容
response主要功能和方法
- getWrite() 获得PrintWrite类的对象实例,实现向浏览器输出信息
- addCookie() 在客户端计算机磁盘上创建出Cookie对象实例,在Cookie对象实例可以保存客户端信息特征,然后采用request对象的getCookies()方法获取客户机所有Cookie对象
- addHeader() 添加HTTP头文件信息,将信息传送到客户浏览器中
- containsHeader() 判断指定名字的文件头是否存在,返回布尔型true / false
- setHeader() 设置指定名字HTTP头文件的值,若该值存在则覆盖
- sendRedirect() 重定向到由参数targetURL所指示的目标JSP页面或Servlet程序,不能向客户端输出信息
- setContentType() 在相应中可以设置内容的文档数据类型和格式
- setBufferSize() 设置Web容器的缓冲区大小,配合getBufferSize()方法返回该缓冲器信息
利用response对象实现向客户机种写入Cookie信息
Cookie或称Cookies,是指Web应用系统为了辨别访问者身份而存储在客户机中的一个文本文件,其中包含特定数据,比如登陆邮箱:
可以把用户名和密码放在客户机Cookie中,下次访问不需要再输入用户名密码
读取Cookie文件信息,使用Cookie类中的getName()和getValue()返回客户端的某一个特定Cookie对象名所对应的值。而利用response对象addCookie(cookie data )方法可以写入Cookie对象中所包装的数据。
实例:在系统首页中添加读写Cookie信息
在index jsp页面中添加如下代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="java.util.Date" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP add Cookie information </title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%! String lastAccessTime=null; //the last time view this web site String nowAccessTime=null; Cookie mycookie=null; Cookie[] cookies=null; Date now=null; %> <% cookies=request.getCookies(); // use request class getCookie method to get cookies if there is no cookie info then add new now=new Date(); if(cookies==null) { lastAccessTime=(now.getYear()+1900+"Year"+now.getMonth()+"Month"+now.getDay()+"Day"+now.getHours()+"Hour"+now.getMinutes()+"Minute"+now.getSeconds()+"Second"); mycookie=new Cookie("lastAccessTime",lastAccessTime); mycookie.setMaxAge(30*24*60*60); // 30 days 24hours 60mins 60 seconds response.addCookie(mycookie); } else for(int index=0;index<cookies.length;index++) { if(cookies[index].getName().equals("lastAccessTime")) { lastAccessTime=cookies[index].getValue(); nowAccessTime=(now.getYear()+1900+"Year "+now.getMonth()+" Month "+now.getDay()+" Day "+now.getHours()+" Hour "+now.getMinutes()+" Minute "+now.getSeconds()+" Second"); mycookie=new Cookie("lastAccessTime",nowAccessTime); mycookie.setMaxAge(30*24*60*60); // 30 days 24hours 60mins 60 seconds response.addCookie(mycookie); break; } } out.print("the last time your visit this system is "+lastAccessTime); %> </body> </html>
首先用request的getCookie获取一下cookie,如果没有cookie信息,使用response的addCookie增加cookie信息
区分重定向与跳转方式的区别
- 请求转发过程中客户端浏览器只向server端产生一次请求,而重定向是两次;
- 请求转发时在浏览器的URL地址栏中的信息不会发生改变,仍然是原来的URL而重定向将会转向目标URL
使用HTTP请求转发:
使用转发由于只有一次请求,所以在一个页面的request.setAttribute 能够在跳转后的页面使用request.getAttribute获取其属性值
使用4个jsp页面和一个类文件
新建 login.jsp 设置登陆框,用户名密码。。。。。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ page isErrorPage="true" errorPage="error.jsp" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>This is my first JSP page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form method="post" action="response.jsp" > username: <input type="text" name="user" > <br> password: <input type="password" name="password"> <br> userType: <select name="userType"> <option value="user" >user</option> <option value="master"> master</option> </select> <input type="submit" name="submit" /> </form> </body> </html>
新建response.jsp页面当用户名是:young并且密码是1234跳转到index.jsp否则跳转到error.jsp,引入userInfo类,使用其verifyID方法校验用户名密码
userinfo类代码:
package mypackage; public class userInfo { /** * @param args * two parameters add get/set methods */ String userName=null; String passWord=null; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public boolean verifyID( ) { if(userName.equals("young") && passWord.equals("1234")) { System.out.print("login successful\n"); return true; } else { System.out.print("login failure\n"); return false; } } }
代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <jsp:useBean id="user" class="mypackage.userInfo" scope="session" ></jsp:useBean> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'response.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%! String targetPage=null; RequestDispatcher rd=null; %> <% user.setUserName(request.getParameter("user")); user.setPassWord(request.getParameter("password")); if(user.verifyID()) { request.setAttribute("userNameString",user.getUserName()); targetPage="index.jsp"; System.out.print(user.getUserName()); } else { request.setAttribute("errorMSG","sorry,Login FAILED.\n"); targetPage="error.jsp"; } rd=request.getRequestDispatcher(targetPage); rd.forward(request,response); %> </body> </html>
新建error.jsp 这个页面会获取response.jsp传递过来的errorMSG
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'error.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> errorMSG<br> <%=request.getAttribute("errorMSG") %> </body> </html>
新建index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="java.util.Date" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP add Cookie information </title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> welcome <%=request.getAttribute("userNameString") %> <%! String lastAccessTime=null; //the last time view this web site String nowAccessTime=null; Cookie mycookie=null; Cookie[] cookies=null; Date now=null; %> <% cookies=request.getCookies(); // use request class getCookie method to get cookies if there is no cookie info then add new now=new Date(); if(cookies==null) { lastAccessTime=(now.getYear()+1900+"Year"+now.getMonth()+"Month"+now.getDay()+"Day"+now.getHours()+"Hour"+now.getMinutes()+"Minute"+now.getSeconds()+"Second"); mycookie=new Cookie("lastAccessTime",lastAccessTime); mycookie.setMaxAge(30*24*60*60); // 30 days 24hours 60mins 60 seconds response.addCookie(mycookie); } else for(int index=0;index<cookies.length;index++) { if(cookies[index].getName().equals("lastAccessTime")) { lastAccessTime=cookies[index].getValue(); nowAccessTime=(now.getYear()+1900+"Year "+now.getMonth()+" Month "+now.getDay()+" Day "+now.getHours()+" Hour "+now.getMinutes()+" Minute "+now.getSeconds()+" Second"); mycookie=new Cookie("lastAccessTime",nowAccessTime); mycookie.setMaxAge(30*24*60*60); // 30 days 24hours 60mins 60 seconds response.addCookie(mycookie); break; } } out.print("the last time your visit this system is "+lastAccessTime); %> </body> </html>
登陆成功会显示: 可以看出,跳转后的页面URL仍然是跳转前的URL并未发生任何变化,由于只进行一次请求,所以request.setAttribute 和request.getAttribute能够正常工作
登陆失败:
而是用response.sendRedirect()会出现2次请求不能再是用request的对象包装和传递参数,可以使用session.setAttribute("NAME","VALUE")使用EL表达式语句${sesstionScope.userNameString}
从session会话对象中获取传递的参数,同时重定向后的URL为重定向页面的URL。