request与response



今天内容:

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 onload="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=reqeust.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域。