今天内容:
1.response
2.request
-------------------------------------
昨天内容:
1.servlet模板
在myeclipse10下的common下的plugins下查找文件com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar
将jar文件使用压缩工具打开,在下面有一个templates下查找Servlet.java文件
2.关于默认的servlet
如果某个Servlet的映射路径它是 "/" 那么它就是默认Servlet.
默认的Servlet是用于处理不能处理的请求。
在tomcat中conf/web.xml文件,我们自己工程的所有的web.xml相当于继承了这个xml.
当我们去访问web工程下内容时,都是通过web.xml文件中的<url-pattern>去查找到资源。
而我们在访问 a.txt a.html时在xml文件中没有与其对应的资源,这时,是默认的servlet进行处理。
----------------------------------------------------------------------------
1.了解request与response
request:请求对象 HttpServletRequest
response:响应对象 HttpServletResponse
对于请求与响应对象,是每一次请求都会创建新的对象。当响应结束,请求与响应对象自动消失。
它们是由服务器创建的。
request与response的作用:
request可以处理所有的http请求. 简单说:request可以获取我们http请求信息。
response可以处理所有的http响应。简单说:response可设置http响应信息。
2.关于request与response体系
--------------------------------------------------------------------------------
3.response对象.
1.response对象,它是在service方法中接收到的。
resposne对象它是用于设置http响应的。
2.response操作响应信息.
1.响应状态行的状态码 setStatus
2.响应头 setHeader setDateHeader setIntHeader
3.响应正文 是通过流操作 getOutputStream() getWriter();
4.示例1
通过response实现重定向
服务器端要做两件事:
1.状态码 302
2.响应头 location
重定时,可以访问站内资源,也可以访问站外资源。
开发中要想重定向 respons.sendRedirect(String location);
5.示例 2发送http头,控制浏览器定时跳转网页
response.setHeader("refresh", "5;url=/day8_1/refresh.html");
通知浏览器5秒后跳转到url指定的路径。
扩展:在实际操作中,很少使用服务器端进行定时跳转,一般都是在浏览端完成。
可以通过js完成数字变化
<script type="text/javascript">
var time=5;
function change(){
var span=document.getElementById("s");
span.innerHTML=time;
time--;
setTimeout("change()", 1000);
}
</script>
<meta http-equiv="refresh" content="5;url=/day8_1/index.jsp">
<body "change();">
页面会在<span id="s"></span>后跳转到index.jsp。
</body>
-----------------------------------------------------------------------
6.示例 3发送http头,控制浏览器禁止缓存当前文档内容
只需要在服务器端设置这三项就可能,控制缓存。
在开发中要想禁用缓存,都是在显示页面上操作.也就是jsp上。
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="-1">
如果要在servlet上禁用缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", -1);
==============================================================
响应正文是在浏览器上真正显示的内容。
在servlet中要想操作响应正文,需要通过response对象获取输出流来操作。
getWriter() 字符流
getOutputStream(); 字节流.
问题1: 什么时候使用字节流,什么时候使用字符流?
如果是纯文本使用字符流,如果二进制文件,使用字节流。
如果只是得到信息,原样不动,不进行修改操作,这时就使用字节流。
如果要操作的是自定义信息,这时使用字符流。
问题2:通过response获取的输出流它的真实类型是什么?
ServletOutputStream response.getOutputStream();
PrintWriter response.getWriter();
打印流有两个特点:
1.可以设置自动刷新
2.可以将信息原样输出
关于输出流的简单应用:servlet是可以完成显示操作的。
关于responset获取输出流在使用时的注意事项:
1.通过response获取输出流时,字节流与字符流只能选择一个,不能一起使用。互相排斥.
2.通过response获取输出流时,可以不关闭,tomat会自动关闭。
关于响应信息乱码问题:
response.setCharacterEncoding(String code);它不能通知浏览器解析时使用什么编码。只能设置响应正文编码。
response.setContentType(String mimeType);它不仅设置响应编码,也通知浏览器怎样解析。
response.setHeader("content-Type","text/html;charset=utf-8");
------------------------------------------
复习
1.response与request作用
2.request与response它体系
3.response对象
1.可以操作状态码 setStatus()
2.可以操作响应头 setHeader()
3.可以操作响应正文 通过流 getOutputStream() getWriter()
校验码:
作用:可以防止恶意注册.校验码它是一个图片。
服务器响应回来的是一张图片,我们将这个图片显示出来。
这张图片我们是通过程序生成的。
----------------------------------------------------------------------
request对象:
作用:用于获取http请求信息.
关于post请求与get请求区别?
1.post请求可以提交大数据 get请求只能提交1kb
2.post请求它的数据不会在浏览器上显示(安全)
get请求请求的参数会在浏览器上显示。
3.post请求,请求参数是在请求正文中.
get请求,它是资源路径上。
=====================================
1.关于获取请求行信息
1.请求方式
request.getMethod();
2协议
request.getProtocol();
3.获取请求资源路径
request.getRequestURI(); 它返回的是一个URI
request.getRequestURL(); 它返回的是一个URL
URI包含URL
4.get请求时参数
request.getQueryString();
关于request获取客户机信息:
request.getRemoteAddr();获取客户机ip地址
request.getLocalAddress();获取服务器ip地址.
request.getContextPath(); 获取虚拟目录名称.(就是工程名)
我们通过getRequestURI()-getContextPath()就可以得到访问的资源路径。
2.关于获取请求头信息.
String getHeader(String name); 获取一个请求头信息
Enumeration getHeaders(); 获取多个请求头信息
getDateHeader();
getIntHeader();
重点头信息
1.referer 它可以防止盗链。
2.user-agent 可以获取浏览器信息.
=====================================================
3.关于获取请求参数
request获取请求参数:
1.getParameter();
public String getParameter(String name);
2.getParameterValues();
对于值不是一个的控制,在获取时要使用这个方法,例如 checkbox
public String[] getParameterValues(String name);
3.getParameterNames();
public Enumeration getParameterNames();
它获取的是表单中所有的name值.
4.getParameterMap();
public Map<String,String[]> getParameterMap();
它将请求参数的name做为了key,以输入的值或选定的值做为value。
注意:value是一个String[];
-----------------------------------------------------------------
问题1:得到请求参数后,我们就可以直接操作吗?
在得到请求参数后,需要对数据进行校验。这是服务器端的校验,通过java代码实现。
校验无非就做两件事:
1.非空校验
String.trim().length()>0
2.规则校验
正则进行规则校验。
问题2:关于中文乱码问题
乱码出现的原因:汉字在各个编码表中的码值不一样。
对于我们的程序,为什么出现的乱码:页面上使用的是utf-8进行编码,而tomcat使用了iso8859-1进行了解码。
我们通过request获取信息就是乱码。
解决方案:
将得到信息使用iso8859-1进行编码 msg.getBytes("iso8859-1");
在使用utf-8进行解码 new String( msg.getBytes("iso8859-1"),"utf-8");
如果请求方式是post,我们可以通过 request.setCharacterEncoding(String charsetname); 来解决乱码问题.
=====================================================================
request域对象
request生命周期;
1.当请求来时创建request对象.
2.当响应结束时,request就销毁。
每次请求都是一个新的request对象.
只要是域对象就有 setAttribute() getAttribute() removeAttribute()操作.
重要概念:请求转发
它代表的是服务器的内部跳转.
请求转发:
RequestDispatcher rd=request.getRequestDispatcher(String path);
rd.forward(ServletRequest sr,ServletResponse ss);
注意;对于forward或sendRedirect后,它会清空response缓冲区,那么执行任何操作就无效。
养成习惯在执行这两个操作后,直接加上return.
================================
请求转发与重定向区别?
1.请求转发它是服务器内部跳转,只有一次请求,一次响应。
重定向它是两次请求,两次响应。
2.请求转发,是服务器内部操作,它不会影响到地址的路径。
重定向是两次请求,地址栏会变化。
3.请求转发只能在当前站点内跳转。
重定向可以跳出站内。
4.请求转发是由request发起的。 request.getRequestDispatcher("").forward();
重定向 response.sendRedirect();
5.请求转发时,它的路径 "/" 代表的是当前工程. 服务器端路径
重定向 它的路径 "/" 代表的是服务器要目录。 客户端路径.
request.getRequestDispatcher("/").forward();
这时的/相当于当前虚拟目录名称 http://localhost:8080/day8_2
response.sendRedirect("/");它相当于是 http://localhost:8080
6.请求转发中存在request域.
重定向它不存在request域。
====================================================================
作业:
Response
通过response输出中文 setContextType() getWriter()
通过response实现请求重定向
Request
看request文档,查看获取请求方式getMethod、请求资源getRequestURI、请求头getHeader、请求参数getParameter的方法
如何向客户机输出不同类型的表单,以收集客户机的数据,并在服务器端获取(必做)
获取中文数据
理解请求转发和重定向区别