javaWeb核心技术二
2016-12-23 01:08
239 查看
第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
第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
Demo02.java
web.xml
第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
第05章:Request转发
5.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Request转发。
5.02 要转发必须得用Request.getRequestDispatcher().forward()方法
Demo02.java
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
注意:一个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:
第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
Demo06.java
05_error.html
03_welcome.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
第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
Demo02.java
web.xml
第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
第05章:Request转发
5.01 多个Servlet配合工作
有些时候,一个Servlet不能很好的完成业务工作,需要另一
个Servlet来配合。这就是说,很有可能一个Servlet需要将
流程交由另一个Servlet,此时就要用转发或重定向这二个
技术了,这里我们谈Request转发。
5.02 要转发必须得用Request.getRequestDispatcher().forward()方法
Demo02.java
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
注意:一个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:
第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
Demo06.java
05_error.html
03_welcome.html
附加:总结一下”/”表示什么
01——<a href=”/”>:表示webapps目录
02——<imgsrc=”/”>:表示webapps目录
03——<formaction=”/”>:表示webapps目录
04——request.getRequestDispatcher(“/”).forward():表示当前WEB应用的名,即day12
05——response.sendRedirect(“/”):表示webapps目录
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册表单</title> </head> <body> <!-- /表示webapps目录--> <form action="/day12/Demo02" method="POST"> <table border="2" align="center"> <tbody> <tr> <td>用户名</td> <td><input type="text" name="username" value="哈哈"/></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password" value="123456"/></td> </tr> <tr> <td>性别</td> <td> <input type="radio" name="gender" value="男" checked="checked"/>男 <input type="radio" name="gender" value="女"/>女 </td> </tr> <tr> <td>爱好</td> <td> <input type="checkbox" name="like" value="打球"/>打球 <input type="checkbox" name="like" value="看电视"/>看电视 <input type="checkbox" name="like" value="上网"/>上网 <input type="checkbox" name="like" value="收藏" checked="checked"/>收藏 </td> </tr> <tr> <td>选择上传的文件</td> <td> <input type="file" name="upload"/> </td> </tr> <tr> <td>选择你想就业的城市</td> <td> <select name="city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="深圳">深圳</option> <option value="广州" selected="selected">广州</option> <option value="杭州">杭州</option> </select> </td> </tr> <tr> <td><input type="submit" value="提交按钮"/></td> <td><input type="reset" value="重填按钮"/></td> </tr> </tbody> </table> </form> </body> </html> |
public class Demo02 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } protected 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"); // 提示 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); } } |
<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); } } |
原来浏览器以什么方式提交数据,转发到另一个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, HttpServletResponse response) throws ServletException, IOException { //this.useByte(request,response); this.useChar(request,response); } /** * 以字符方式输出中,英,数, */ private void useChar(HttpServletRequest request, HttpServletResponse response) 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, HttpServletResponse response) 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(); } } |
要么都用字符输出,要么都用字节输出。
第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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>03_login.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <form action="/day12/Demo06" method="POST"> <table border="2" align="center"> <tbody> <tr> <td>用户名</td> <td><input type="text" name="username" value="哈哈" maxlength="4"/></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password" value="123456" maxlength="6"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="提交" style="width:111px"/> </td> </tr> </table> </form> </body> </html> |
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"); } } } |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>05_error.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!-- <meta http-equiv="refresh" content="5;url=03_login.html"> --> </head> <body> <font style="font-size:66;color:green;">出错了,<span id="timeID">5</span>秒后,回到登录页面</font> <script type="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{ var url = "http://127.0.0.1:8080/day12/03_login.html"; window.location.href = url; } } window.setInterval("updateTime()",1000); </script> </body> </html> |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>03_welcome.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <font style="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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册表单</title> </head> <body> <!-- /表示webapps目录--> <form action="/day12/Demo02" method="POST"> <table border="2" align="center"> <tbody> <tr> <td>用户名</td> <td><input type="text" name="username" value="哈哈"/></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password" value="123456"/></td> </tr> <tr> <td>性别</td> <td> <input type="radio" name="gender" value="男" checked="checked"/>男 <input type="radio" name="gender" value="女"/>女 </td> </tr> <tr> <td>爱好</td> <td> <input type="checkbox" name="like" value="打球"/>打球 <input type="checkbox" name="like" value="看电视"/>看电视 <input type="checkbox" name="like" value="上网"/>上网 <input type="checkbox" name="like" value="收藏" checked="checked"/>收藏 </td> </tr> <tr> <td>选择上传的文件</td> <td> <input type="file" name="upload"/> </td> </tr> <tr> <td>选择你想就业的城市</td> <td> <select name="city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="深圳">深圳</option> <option value="广州" selected="selected">广州</option> <option value="杭州">杭州</option> </select> </td> </tr> <tr> <td><input type="submit" value="提交按钮"/></td> <td><input type="reset" value="重填按钮"/></td> </tr> </tbody> </table> </form> </body> </html> |
public class Demo02 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } protected 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"); // 提示 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); } } |
<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); } } |
原来浏览器以什么方式提交数据,转发到另一个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, HttpServletResponse response) throws ServletException, IOException { //this.useByte(request,response); this.useChar(request,response); } /** * 以字符方式输出中,英,数, */ private void useChar(HttpServletRequest request, HttpServletResponse response) 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, HttpServletResponse response) 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(); } } |
要么都用字符输出,要么都用字节输出。
第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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>03_login.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <form action="/day12/Demo06" method="POST"> <table border="2" align="center"> <tbody> <tr> <td>用户名</td> <td><input type="text" name="username" value="哈哈" maxlength="4"/></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password" value="123456" maxlength="6"/></td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="提交" style="width:111px"/> </td> </tr> </table> </form> </body> </html> |
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"); } } } |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>05_error.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!-- <meta http-equiv="refresh" content="5;url=03_login.html"> --> </head> <body> <font style="font-size:66;color:green;">出错了,<span id="timeID">5</span>秒后,回到登录页面</font> <script type="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{ var url = "http://127.0.0.1:8080/day12/03_login.html"; window.location.href = url; } } window.setInterval("updateTime()",1000); </script> </body> </html> |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>03_welcome.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <font style="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目录
相关文章推荐
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(二)
- 小博老师解析JavaWeb核心技术 ——AJAX第一弹
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)
- javaweb核心技术servlet
- javaWeb核心技术四
- JavaWeb核心技术学习笔记(二)——Http协议
- 小博老师解析JavaWeb核心技术 ——JQuery基础
- 223_尚学堂_高淇_java300集最全视频教程_JVM核心机制_线程上下文类加载器_web服务器类加载机制_OSGI技术模块开发原理介绍
- 小博老师解析JavaWeb核心技术 ——AJAX第一弹
- 小博老师解析JavaWeb核心技术 ——JQuery常用方法
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)
- 小博老师解析JavaWeb核心技术 ——JQuery常用方法
- 小博老师解析JavaWeb核心技术 ——JQuery基础
- javaWeb核心技术一
- Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)
- JavaWeb核心技术学习笔记(三)——JavaEE体系概况
- Java及J2EE Web核心开发技术
- Java Web Application的最新技术比较与体会
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(二)
- 转-实施Java的WEB项目需要掌握的技术