javaWeb核心技术二
来源:互联网 发布:云计算发展与政策论坛 编辑:程序博客网 时间:2024/06/14 16:49
第01章:Request【全称为HttpServletRequest】入门
1.01 什么是Request对象
客户端向服务器发送请求时,所有客户端信息都封装在Request对象中,
我们可以通过Request对象来获取客户端相关信息。
第02章:Request常用API
2.01 获取客户机信息
getRequestURL()方法返回客户端发出请求时的完整URL
getRequestURI()方法返回请求行中的资源名部分
getQueryString()方法返回请求行中的参数部分
getRemoteAddr()方法返回发出请求的客户机的IP地址
getLocalAddr()方法返回WEB服务器的IP地址
getMethod()方法返回客户机请求方式 GETPOST
getContextPath()方法返回当前web应用根目录
getServletPath()方法返回Servlet映射路径
2.02 获取请求头信息
getHeader(User-Agent)方法返回请求头的值
2.03 获取请求体参数
getParameter()方法通过name获得值
getParameterValues()方法通过name获得多值
getParameterNames()方法获得所有name
Demo01.java
/**
* 用以下网址访问:
* http://127.0.0.1:8080/day12/Demo01?id=2016&name=zhaojun
*/
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//如:http://127.0.0.1:8080/day12/Demo01
String url = request.getRequestURL().toString();//方法返回客户端发出请求时的完整URL
//如:/day12/Demo01
String uri = request.getRequestURI();//方法返回请求行中的资源名部分
//如:id=2016&name=zhaojun
String queryString = request.getQueryString();//方法返回请求行中的参数部分
//如:127.0.0.1
String remoteAddr = request.getRemoteAddr();//方法返回发出请求的客户机的IP地址
//如:127.0.0.1
String localAddr = request.getLocalAddr();//方法返回web服务器的IP地址
//如:GET
String method = request.getMethod();//方法返回客户机请求方式 GET或POST
//如:/day12
String contextPath = request.getContextPath();//方法返回当前web应用根目录
//如:/Demo01
String servletPath = request.getServletPath();//方法返回Servlet映射路径,即<url-pattern>
//如:参见下面注释
Enumeration<String> enums = request.getHeaderNames();//获取所有请求头
while(enums.hasMoreElements()){
String key = enums.nextElement();
String value = request.getHeader(key);
System.out.println(key+"-"+value);
}
System.out.println(url);
System.out.println(uri);
System.out.println(queryString);
System.out.println(remoteAddr);
System.out.println(localAddr);
System.out.println(method);
System.out.println(contextPath);
System.out.println(servletPath);
/*
accept-text/html, application/xhtml+xml,
accept-language-zh-CN
user-agent-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64;Trident/6.0)
ua-cpu-AMD64
accept-encoding-gzip,deflate
host-127.0.0.1:8080
dnt-1
connection-Keep-Alive
*/
}
}
第03章:表单提交中文乱码的原因和解决方案
3.01 为什么表单中有中文,会出现乱码呢?
画图分析
代码演示
3.02 解决方案
通用方式:适用于GET和POST
byte[] buf =username.getBytes(“ISO8859-1”);按ISO8859-1编码
String username = new String(buf,”UTF-8”);按UTF-8解码
专用方式:适用于POST
request.setCharacterEncoding(“UTF-8”);针对请求体内容按UTF-8编码
request.getParameter(“username”)
如果项目中GET和POST业务功能相同的话,可以在doGet()方法中调用doPost()
01_register.html
<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>注册表单</title>
</head>
<body>
<!-- /表示webapps目录-->
<formaction="/day12/Demo02"method="POST">
<tableborder="2"align="center">
<tbody>
<tr>
<td>用户名</td>
<td><inputtype="text"name="username"value="哈哈"/></td>
</tr>
<tr>
<td>密码</td>
<td><inputtype="password"name="password"value="123456"/></td>
</tr>
<tr>
<td>性别</td>
<td>
<inputtype="radio"name="gender"value="男"checked="checked"/>男
<inputtype="radio"name="gender"value="女"/>女
</td>
</tr>
<tr>
<td>爱好</td>
<td>
<inputtype="checkbox"name="like"value="打球"/>打球
<inputtype="checkbox"name="like"value="看电视"/>看电视
<inputtype="checkbox"name="like"value="上网"/>上网
<inputtype="checkbox"name="like"value="收藏"checked="checked"/>收藏
</td>
</tr>
<tr>
<td>选择上传的文件</td>
<td>
<inputtype="file"name="upload"/>
</td>
</tr>
<tr>
<td>选择你想就业的城市</td>
<td>
<selectname="city">
<optionvalue="北京">北京</option>
<optionvalue="上海">上海</option>
<optionvalue="深圳">深圳</option>
<optionvalue="广州"selected="selected">广州</option>
<optionvalue="杭州">杭州</option>
</select>
</td>
</tr>
<tr>
<td><inputtype="submit"value="提交按钮"/></td>
<td><inputtype="reset"value="重填按钮"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
Demo02.java
public class Demo02 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
request.setCharacterEncoding("UTF-8");
// 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] likes = request.getParameterValues("like");
String upload = request.getParameter("upload");
String city = request.getParameter("city");
// 提示
System.out.println(username);
System.out.println(password);
System.out.println(gender);
for (String like : likes) {
System.out.print(like +" ");
}
System.out.println("\n" +upload);
System.out.println(city);
}
}
web.xml
<servlet>
<servlet-name>Demo02</servlet-name>
<servlet-class>cn.itheima.request.Demo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo02</servlet-name>
<url-pattern>/Demo02</url-pattern>
</servlet-mapping>
第04章:Request域对象
4.01 什么是域对象
域对象初学者可以理解为一个容器,可以暂存String-Object这种key-value形式的数据
域对象保存时间是不同的,有的域对象保存时间在一次请求中;有的域对象保存时间在一次会话中;
有的域对象保存时间在整个应用中。其中Request域对象保存时间只在一次请求中,也就是说
一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也
就不存在了。
4.02 为什么需要域对象
有时我们的业务,一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,
我们需要在二个或多个Servlet之间传递数据,域对象就负责完成这项任务
4.03 Request对象有二层含义:
01——代表客户端向服务器的请求对象,如getParameter(“username”)
02——代表可以暂存数据的域对象,如下如示API
4.04 Request作为域对象常用的API
setAttribute():向域对象中绑定key=value形式的数据
getAttribute():从域对象中根据key找value,如果取到不到,返回NULL
removeAttribute():从域对象中删除key对应的value
Request何时创建:
一次请求来到Servlet
Request何时销毁:
服务器将内容响应到客户端后,Request就销毁
Demo03.java
public class Demo03 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//从Request对象中根据key取出User对象
User user = (User) request.getAttribute("USER");
//将User对象中的内容在浏览器中显示
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write(user.getUsername()+"<br/>");
pw.write(user.getPassword()+"<br/>");
pw.write(user.getGender()+"<br/>");
pw.write(user.getUpload()+"<br/>");
pw.write(user.getCity()+"<br/>");
for(String like : user.getLikes()){
pw.write(like+"\t");
}
pw.flush();
pw.close();
}
}
第05章:Request转发
5.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Request转发。
5.02 要转发必须得用Request.getRequestDispatcher().forward()方法
Demo02.java
public class Demo02 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
request.setCharacterEncoding("UTF-8");
// 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] likes = request.getParameterValues("like");
String upload = request.getParameter("upload");
String city = request.getParameter("city");
//创建User对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setGender(gender);
user.setLikes(likes);
user.setUpload(upload);
user.setCity(city);
//将User对象以key=value形式绑定到Request对象中
request.setAttribute("USER",user);
//将流程转发到Demo03.java继续处理,/表示当前web应用名或web应用根目录
request.getRequestDispatcher("/Demo03").forward(request,response);
}
}
5.03 转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,
原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的
doXxx方法。画图解释
浏览器以POST提交---à第一个Servlet::doPost---à第二个Servlet::doPost
浏览器以GET提交---à第一个Servlet::doGet---à第二个Servlet::doGet
注意:转发不限于Servlet之间,Servlet也可以转发到HTML和JSP页面
第06章:Response【全称为HttpServletResponse】入门
6.01 什么是Response对象
服务器向客户端发送响应时,必须通过Response对象,因此想向客户端输出数据,
就要会用Response对象
第07章:Response常用的API
7.01 设置响应头,制作浏览器
setHeader(key,value)
7.02 获取字符输出流
getWriter():返回PrintWriter
适合:向浏览器输出内容,用字符
7.03 获取字节输出流
getOutputStream():返回ServletOutputStream
适合:向客户端输出多媒体文件,用字节
Demo04.java
public class Demo04 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//this.useByte(request,response);
this.useChar(request,response);
}
/**
* 以字符方式输出中,英,数,
*/
private void useChar(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
response.setCharacterEncoding("UTF-8");//服务器编码
PrintWriter pw = response.getWriter();
pw.write("美国<br/>");
pw.write("USA<br/>");
pw.write(99);
pw.flush();
pw.close(); }
/**
* 以字节方式输出中,英,数,
*/
private void useByte(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
response.setHeader("content-type","text/html;charset=UTF-8");
OutputStream os = response.getOutputStream();
os.write("中国<br/>".getBytes("UTF-8"));
os.write("CHINA<br/>".getBytes("UTF-8"));
os.write(98);
os.flush();
os.close();
}
}
注意:一个Respnse对象不能同时用字符和字节输出;
要么都用字符输出,要么都用字节输出。
第08章:浏览器输出中文乱码的原因和解决方案
8.01 Response向浏览器输出中文乱码的原因:
字符:
response.getWriter().write("哈哈");
默认按ISO8859-1编码,浏览器默认按GB2312解码
字节:
response.getOutputStream().write("呵呵".getBytes());
默认按GB2312编码,浏览器默认按GB2312解码,
我们是window平台,window平台默认GB2312的编码和解码
8.02 解决方案:
字符:
response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
response.setCharacterEncoding("UTF-8");//服务器编码
以上二句代码,可以合二为一,如下:
response.setContentType("text/html;charset=UTF-8");
服务器按UTF-8编码,浏览器按UTF-8解码
确保编码解码相同
一:服务器输出的内容采用UTF-8来编码
二:通知浏览器接收什么类型的数据
三:通知浏览器用UTF-8来解码
response.getWriter().write("哈哈");
字节:
response.setHeader("content-type","text/html;charset=UTF-8");
浏览器按UTF-8解码
response.getOutputStream().write("呵呵".getBytes("UTF-8"));
服务器按UTF-8解码
下载文件Demo05.java:
<!-- /表示webapps目录 -->
<a
href="/day12/Demo05?fileName=%E4%B8%8A%E6%B5%B7%E5%9C%B0%E9%93%81%E5%9B%BE.gif"
style="text-decoration:none;">河源万绿湖.gif</a>
public class Demo05 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String fileName = request.getParameter("fileName");
byte[] buf = fileName.getBytes("ISO8859-1");
fileName = new String(buf,"UTF-8");
System.out.println("你要下载的文件名为:" + fileName);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
InputStream is = this.getServletContext().getResourceAsStream("/images/河源万绿湖.gif");
OutputStream os = response.getOutputStream();
byte[] data =new byte[1024*3];
int len = 0;
while((len=is.read(data))>0){
os.write(data,0,len);
}
os.close();
is.close();
}
/*
public static void main(String[]args) throws Exception{
String fileName = URLEncoder.encode("河源万绿湖.gif","UTF-8");
System.out.println(fileName);
}
*/
}
第09章:Response重定向
9.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Response重定向。
9.02 要重定向必须得用Response.sendRedirect()方法
9.03 重定向是客户端与服务器的共同行为,不是服务器内部行为,所以浏览器的地址栏会变化
9.04 位于/WEB-INF这个私有目录下的资源,只能通过转发才可访问,重定向是不能访问的
注意:重定向不限于Servlet之间,Servlet也可以重定向到HTML和JSP页面
用户登录:
03_login.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>03_login.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
</head>
<body>
<formaction="/day12/Demo06"method="POST">
<tableborder="2"align="center">
<tbody>
<tr>
<td>用户名</td>
<td><inputtype="text"name="username"value="哈哈"maxlength="4"/></td>
</tr>
<tr>
<td>密码</td>
<td><inputtype="password"name="password"value="123456"maxlength="6"/></td>
</tr>
<tr>
<tdcolspan="2"align="center">
<inputtype="submit"value="提交"style="width:111px"/>
</td>
</tr>
</table>
</form>
</body>
</html>
Demo06.java
public class Demo06 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if("赵君".equals(username) &&"123456".equals(password)){
response.sendRedirect(request.getContextPath()+"/04_welcome.html");
}else{
response.sendRedirect(request.getContextPath()+"/05_error.html");
}
}
}
05_error.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>05_error.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
<!--
<meta http-equiv="refresh" content="5;url=03_login.html">
-->
</head>
<body>
<fontstyle="font-size:66;color:green;">出错了,<spanid="timeID">5</span>秒后,回到登录页面</font>
<scripttype="text/javascript">
function updateTime(){
var span = document.getElementById("timeID");
var strTime = span.innerHTML;
var time = parseInt(strTime);
if(time>1){
time--;
span.innerHTML = time;
}else{
varurl = "http://127.0.0.1:8080/day12/03_login.html";
window.location.href = url;
}
}
window.setInterval("updateTime()",1000);
</script>
</body>
</html>
03_welcome.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>03_welcome.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
</head>
<body>
<fontstyle="font-size:66;color:green;">欢迎光临</font>
</body>
</html>
附加:总结一下”/”表示什么
01——<a href=”/”>:表示webapps目录
02——<imgsrc=”/”>:表示webapps目录
03——<formaction=”/”>:表示webapps目录
04——request.getRequestDispatcher(“/”).forward():表示当前WEB应用的名,即day12
05——response.sendRedirect(“/”):表示webapps目录
第01章:Request【全称为HttpServletRequest】入门
1.01 什么是Request对象
客户端向服务器发送请求时,所有客户端信息都封装在Request对象中,
我们可以通过Request对象来获取客户端相关信息。
第02章:Request常用API
2.01 获取客户机信息
getRequestURL()方法返回客户端发出请求时的完整URL
getRequestURI()方法返回请求行中的资源名部分
getQueryString()方法返回请求行中的参数部分
getRemoteAddr()方法返回发出请求的客户机的IP地址
getLocalAddr()方法返回WEB服务器的IP地址
getMethod()方法返回客户机请求方式 GETPOST
getContextPath()方法返回当前web应用根目录
getServletPath()方法返回Servlet映射路径
2.02 获取请求头信息
getHeader(User-Agent)方法返回请求头的值
2.03 获取请求体参数
getParameter()方法通过name获得值
getParameterValues()方法通过name获得多值
getParameterNames()方法获得所有name
Demo01.java
/**
* 用以下网址访问:
* http://127.0.0.1:8080/day12/Demo01?id=2016&name=zhaojun
*/
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//如:http://127.0.0.1:8080/day12/Demo01
String url = request.getRequestURL().toString();//方法返回客户端发出请求时的完整URL
//如:/day12/Demo01
String uri = request.getRequestURI();//方法返回请求行中的资源名部分
//如:id=2016&name=zhaojun
String queryString = request.getQueryString();//方法返回请求行中的参数部分
//如:127.0.0.1
String remoteAddr = request.getRemoteAddr();//方法返回发出请求的客户机的IP地址
//如:127.0.0.1
String localAddr = request.getLocalAddr();//方法返回web服务器的IP地址
//如:GET
String method = request.getMethod();//方法返回客户机请求方式 GET或POST
//如:/day12
String contextPath = request.getContextPath();//方法返回当前web应用根目录
//如:/Demo01
String servletPath = request.getServletPath();//方法返回Servlet映射路径,即<url-pattern>
//如:参见下面注释
Enumeration<String> enums = request.getHeaderNames();//获取所有请求头
while(enums.hasMoreElements()){
String key = enums.nextElement();
String value = request.getHeader(key);
System.out.println(key+"-"+value);
}
System.out.println(url);
System.out.println(uri);
System.out.println(queryString);
System.out.println(remoteAddr);
System.out.println(localAddr);
System.out.println(method);
System.out.println(contextPath);
System.out.println(servletPath);
/*
accept-text/html, application/xhtml+xml,
accept-language-zh-CN
user-agent-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64;Trident/6.0)
ua-cpu-AMD64
accept-encoding-gzip,deflate
host-127.0.0.1:8080
dnt-1
connection-Keep-Alive
*/
}
}
第03章:表单提交中文乱码的原因和解决方案
3.01 为什么表单中有中文,会出现乱码呢?
画图分析
代码演示
3.02 解决方案
通用方式:适用于GET和POST
byte[] buf =username.getBytes(“ISO8859-1”);按ISO8859-1编码
String username = new String(buf,”UTF-8”);按UTF-8解码
专用方式:适用于POST
request.setCharacterEncoding(“UTF-8”);针对请求体内容按UTF-8编码
request.getParameter(“username”)
如果项目中GET和POST业务功能相同的话,可以在doGet()方法中调用doPost()
01_register.html
<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>注册表单</title>
</head>
<body>
<!-- /表示webapps目录-->
<formaction="/day12/Demo02"method="POST">
<tableborder="2"align="center">
<tbody>
<tr>
<td>用户名</td>
<td><inputtype="text"name="username"value="哈哈"/></td>
</tr>
<tr>
<td>密码</td>
<td><inputtype="password"name="password"value="123456"/></td>
</tr>
<tr>
<td>性别</td>
<td>
<inputtype="radio"name="gender"value="男"checked="checked"/>男
<inputtype="radio"name="gender"value="女"/>女
</td>
</tr>
<tr>
<td>爱好</td>
<td>
<inputtype="checkbox"name="like"value="打球"/>打球
<inputtype="checkbox"name="like"value="看电视"/>看电视
<inputtype="checkbox"name="like"value="上网"/>上网
<inputtype="checkbox"name="like"value="收藏"checked="checked"/>收藏
</td>
</tr>
<tr>
<td>选择上传的文件</td>
<td>
<inputtype="file"name="upload"/>
</td>
</tr>
<tr>
<td>选择你想就业的城市</td>
<td>
<selectname="city">
<optionvalue="北京">北京</option>
<optionvalue="上海">上海</option>
<optionvalue="深圳">深圳</option>
<optionvalue="广州"selected="selected">广州</option>
<optionvalue="杭州">杭州</option>
</select>
</td>
</tr>
<tr>
<td><inputtype="submit"value="提交按钮"/></td>
<td><inputtype="reset"value="重填按钮"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
Demo02.java
public class Demo02 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
request.setCharacterEncoding("UTF-8");
// 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] likes = request.getParameterValues("like");
String upload = request.getParameter("upload");
String city = request.getParameter("city");
// 提示
System.out.println(username);
System.out.println(password);
System.out.println(gender);
for (String like : likes) {
System.out.print(like +" ");
}
System.out.println("\n" +upload);
System.out.println(city);
}
}
web.xml
<servlet>
<servlet-name>Demo02</servlet-name>
<servlet-class>cn.itheima.request.Demo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo02</servlet-name>
<url-pattern>/Demo02</url-pattern>
</servlet-mapping>
第04章:Request域对象
4.01 什么是域对象
域对象初学者可以理解为一个容器,可以暂存String-Object这种key-value形式的数据
域对象保存时间是不同的,有的域对象保存时间在一次请求中;有的域对象保存时间在一次会话中;
有的域对象保存时间在整个应用中。其中Request域对象保存时间只在一次请求中,也就是说
一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也
就不存在了。
4.02 为什么需要域对象
有时我们的业务,一个Servlet完成不了,需要另一个Servlet帮忙,这就是说,
我们需要在二个或多个Servlet之间传递数据,域对象就负责完成这项任务
4.03 Request对象有二层含义:
01——代表客户端向服务器的请求对象,如getParameter(“username”)
02——代表可以暂存数据的域对象,如下如示API
4.04 Request作为域对象常用的API
setAttribute():向域对象中绑定key=value形式的数据
getAttribute():从域对象中根据key找value,如果取到不到,返回NULL
removeAttribute():从域对象中删除key对应的value
Request何时创建:
一次请求来到Servlet
Request何时销毁:
服务器将内容响应到客户端后,Request就销毁
Demo03.java
public class Demo03 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//从Request对象中根据key取出User对象
User user = (User) request.getAttribute("USER");
//将User对象中的内容在浏览器中显示
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write(user.getUsername()+"<br/>");
pw.write(user.getPassword()+"<br/>");
pw.write(user.getGender()+"<br/>");
pw.write(user.getUpload()+"<br/>");
pw.write(user.getCity()+"<br/>");
for(String like : user.getLikes()){
pw.write(like+"\t");
}
pw.flush();
pw.close();
}
}
第05章:Request转发
5.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Request转发。
5.02 要转发必须得用Request.getRequestDispatcher().forward()方法
Demo02.java
public class Demo02 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//POST请求下,将request请求体中的内容按UTF-8编码
request.setCharacterEncoding("UTF-8");
// 分别根据表单项名获取对应的表单值,按UTF-8解码,采用字符集同上
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] likes = request.getParameterValues("like");
String upload = request.getParameter("upload");
String city = request.getParameter("city");
//创建User对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setGender(gender);
user.setLikes(likes);
user.setUpload(upload);
user.setCity(city);
//将User对象以key=value形式绑定到Request对象中
request.setAttribute("USER",user);
//将流程转发到Demo03.java继续处理,/表示当前web应用名或web应用根目录
request.getRequestDispatcher("/Demo03").forward(request,response);
}
}
5.03 转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,
原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的
doXxx方法。画图解释
浏览器以POST提交---à第一个Servlet::doPost---à第二个Servlet::doPost
浏览器以GET提交---à第一个Servlet::doGet---à第二个Servlet::doGet
注意:转发不限于Servlet之间,Servlet也可以转发到HTML和JSP页面
第06章:Response【全称为HttpServletResponse】入门
6.01 什么是Response对象
服务器向客户端发送响应时,必须通过Response对象,因此想向客户端输出数据,
就要会用Response对象
第07章:Response常用的API
7.01 设置响应头,制作浏览器
setHeader(key,value)
7.02 获取字符输出流
getWriter():返回PrintWriter
适合:向浏览器输出内容,用字符
7.03 获取字节输出流
getOutputStream():返回ServletOutputStream
适合:向客户端输出多媒体文件,用字节
Demo04.java
public class Demo04 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//this.useByte(request,response);
this.useChar(request,response);
}
/**
* 以字符方式输出中,英,数,
*/
private void useChar(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
response.setCharacterEncoding("UTF-8");//服务器编码
PrintWriter pw = response.getWriter();
pw.write("美国<br/>");
pw.write("USA<br/>");
pw.write(99);
pw.flush();
pw.close(); }
/**
* 以字节方式输出中,英,数,
*/
private void useByte(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
response.setHeader("content-type","text/html;charset=UTF-8");
OutputStream os = response.getOutputStream();
os.write("中国<br/>".getBytes("UTF-8"));
os.write("CHINA<br/>".getBytes("UTF-8"));
os.write(98);
os.flush();
os.close();
}
}
注意:一个Respnse对象不能同时用字符和字节输出;
要么都用字符输出,要么都用字节输出。
第08章:浏览器输出中文乱码的原因和解决方案
8.01 Response向浏览器输出中文乱码的原因:
字符:
response.getWriter().write("哈哈");
默认按ISO8859-1编码,浏览器默认按GB2312解码
字节:
response.getOutputStream().write("呵呵".getBytes());
默认按GB2312编码,浏览器默认按GB2312解码,
我们是window平台,window平台默认GB2312的编码和解码
8.02 解决方案:
字符:
response.setHeader("content-type","text/html;charset=UTF-8");//浏览器解码
response.setCharacterEncoding("UTF-8");//服务器编码
以上二句代码,可以合二为一,如下:
response.setContentType("text/html;charset=UTF-8");
服务器按UTF-8编码,浏览器按UTF-8解码
确保编码解码相同
一:服务器输出的内容采用UTF-8来编码
二:通知浏览器接收什么类型的数据
三:通知浏览器用UTF-8来解码
response.getWriter().write("哈哈");
字节:
response.setHeader("content-type","text/html;charset=UTF-8");
浏览器按UTF-8解码
response.getOutputStream().write("呵呵".getBytes("UTF-8"));
服务器按UTF-8解码
下载文件Demo05.java:
<!-- /表示webapps目录 -->
<a
href="/day12/Demo05?fileName=%E4%B8%8A%E6%B5%B7%E5%9C%B0%E9%93%81%E5%9B%BE.gif"
style="text-decoration:none;">河源万绿湖.gif</a>
public class Demo05 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String fileName = request.getParameter("fileName");
byte[] buf = fileName.getBytes("ISO8859-1");
fileName = new String(buf,"UTF-8");
System.out.println("你要下载的文件名为:" + fileName);
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
InputStream is = this.getServletContext().getResourceAsStream("/images/河源万绿湖.gif");
OutputStream os = response.getOutputStream();
byte[] data =new byte[1024*3];
int len = 0;
while((len=is.read(data))>0){
os.write(data,0,len);
}
os.close();
is.close();
}
/*
public static void main(String[]args) throws Exception{
String fileName = URLEncoder.encode("上海地铁图.gif","UTF-8");
System.out.println(fileName);
}
*/
}
第09章:Response重定向
9.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Response重定向。
9.02 要重定向必须得用Response.sendRedirect()方法
9.03 重定向是客户端与服务器的共同行为,不是服务器内部行为,所以浏览器的地址栏会变化
9.04 位于/WEB-INF这个私有目录下的资源,只能通过转发才可访问,重定向是不能访问的
注意:重定向不限于Servlet之间,Servlet也可以重定向到HTML和JSP页面
用户登录:
03_login.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>03_login.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
</head>
<body>
<formaction="/day12/Demo06"method="POST">
<tableborder="2"align="center">
<tbody>
<tr>
<td>用户名</td>
<td><inputtype="text"name="username"value="哈哈"maxlength="4"/></td>
</tr>
<tr>
<td>密码</td>
<td><inputtype="password"name="password"value="123456"maxlength="6"/></td>
</tr>
<tr>
<tdcolspan="2"align="center">
<inputtype="submit"value="提交"style="width:111px"/>
</td>
</tr>
</table>
</form>
</body>
</html>
Demo06.java
public class Demo06 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if("赵君".equals(username) &&"123456".equals(password)){
response.sendRedirect(request.getContextPath()+"/04_welcome.html");
}else{
response.sendRedirect(request.getContextPath()+"/05_error.html");
}
}
}
05_error.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>05_error.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
<!--
<meta http-equiv="refresh" content="5;url=03_login.html">
-->
</head>
<body>
<fontstyle="font-size:66;color:green;">出错了,<spanid="timeID">5</span>秒后,回到登录页面</font>
<scripttype="text/javascript">
function updateTime(){
var span = document.getElementById("timeID");
var strTime = span.innerHTML;
var time = parseInt(strTime);
if(time>1){
time--;
span.innerHTML = time;
}else{
varurl = "http://127.0.0.1:8080/day12/03_login.html";
window.location.href = url;
}
}
window.setInterval("updateTime()",1000);
</script>
</body>
</html>
03_welcome.html
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>03_welcome.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html; charset=UTF-8">
</head>
<body>
<fontstyle="font-size:66;color:green;">欢迎光临</font>
</body>
</html>
附加:总结一下”/”表示什么
01——<a href=”/”>:表示webapps目录
02——<imgsrc=”/”>:表示webapps目录
03——<formaction=”/”>:表示webapps目录
04——request.getRequestDispatcher(“/”).forward():表示当前WEB应用的名,即day12
05——response.sendRedirect(“/”):表示webapps目录
- javaWeb核心技术二
- JavaWeb核心技术学习笔记(二)——Http协议
- javaWeb核心技术一
- javaWeb核心技术三
- javaWeb核心技术四
- JavaWeb(二)
- UML核心技术学习(二)
- c语言核心技术 二
- Struts2核心技术 (二)
- Hibernate 核心技术(二)
- Spring 深入浅出核心技术(二)
- jQuery核心技术 (二)
- Struts2核心技术 (二)
- Spring 深入浅出核心技术(二)
- Hibernate 核心技术(二)
- jQuery核心技术 (二)
- C核心技术手册(二)
- Java核心技术(多线程)二
- omnipeek安装教程
- Git代码管理工具
- PHP配置xdebug
- MFC消息映射机制以及画线功能实现
- [LeetCode]371. Sum of Two Integers
- javaWeb核心技术二
- Prometheus 系统监控方案
- 关系型数据库优化操作
- 华中农大HZAUOJ1104 Sum and XOR 异或瞎搞
- mac 下tomcat 安装与配置
- Database - 读书笔记--SQL必知必会07--创建计算字段
- Database - 读书笔记--SQL必知必会06--用通配符进行过滤
- 在CentOS 6.4中I安装OpenCobol 1.1
- java中的同步与异步(转)