Servlet技术(二) --请求和响应
开头提要
这一个章节中更重要的是HttpServletRequest对象的相关方法
主要技术概括如下:
- 网页的定时刷新和跳转
- 利用referer放盗链
- 获取请求参数以及通过request对象传递数据
- 请求重定向(数据会被丢失)
- 请求转发 (数据不会被丢失)
- 请求包含 (返回的包括主题servlet和包含的servlet两部分内容)
在编写这方面的程序的时候经常会遇到乱码问题,详情请看字符乱码问题的解决办法HttpServletResponse对象
发送状态码相关的方法
- setStatus(int status)方法
- sendError(int sc)方法
public void sendError(int code) throws java.io.IOException
public void sendError(int code, String message) throws java.io.IOException
相应的状态代码参数的描述如下:
发送响应消息头相关的方法
发送响应消息体的相关方法
- getOutputStream()方法 用于输出二进制格式的响应正文
- getWriter()方法 用于输出内容全为字符文本的网页文档
在此不进行过多的赘述和相关代码的实验了,需要注意的是:
getOutputStream()和getWriter()方法都可以发送响应消息体,但是它们之间互相排斥,不可以同时使用,否则会发生IllegalStateException异常
网页定时刷新并跳转
HTTP协议中,定义了一个Refresh头字段,它可以通知浏览器在指定的时间内自动刷新并跳转到其他页面
response.setHeader(“Refresh”,”2,URL=http:xxxxxxxxx” 表示的是浏览器在2秒之后自动跳转到xxxxxxxxx的网站
response.setHeader(“Refresh”,”3”) 表示每隔3秒页面定时刷新
禁止浏览器缓存页面
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
请求重定向(重要)
工作原理如下:
方法如下:
public void sendRedirect(java.lang.String location) throws java.io.IOException
在请求重定向的过程中,传输的信息会丢失
HttpServletRequest对象
获取请求行信息的相关方法
在这一小节里面主要是HTTP头字段的相关操作,所以掌握HTTP头字段和HTTP协议是十分有必要的,详情请看关于HTTP协议
- 当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名,请求路径等信息,为了获取这些信息,在HttpServletRequest接口中,定义了一系列用于获取请求行信息的方法,如下表所示
如上表所示,相关方法的效果已经表述的很详近了,在此不进行代码实验了 - 当请求Servlet时,需要通过请求头向服务器传递附加信息,例如,客户端可以接受的数据类型,压缩方式,语言等等,具体方法如下表所示
利用referer请求头防止”盗链”
实现思路如下
- 获取referer头字段的值
- 获取网站的域名
- 判断:如果referer头字段的值不为空,并且网站的域名和referer头字段的值相等,就进行相应文件的下载什么的,否则就重定向到另外一个消息返回错误的网页上
主要的servlet代码如下
至于跳转到的网页代码,在此就不再贴出来了
获取请求参数
这些方法基本上是用来处理表单数据的,没什么太多需要注意的地方,暂时不贴代码了
获取网络连接信息
以上就不再添加代码了,根据实际情况进行代码的编写就可以了
通过request对象传递数据(重要)
方法 | 效果 |
---|---|
setAttribute(String name, Object o) | 将一个对象与一个名称关联后存储进ServletRequest对象中 |
getAttribute(String name) | 从ServletRequest对象中返回指定名称的属性对象 |
removeAttribute(String name) | 从ServletRequest对象中删除指定名称的属性 |
getAttributeNames() | 返回一个包含ServletRequest对象中所有属性名的Enumeration对象 |
RequestDispatcher接口
方法 | 效果 |
---|---|
getRequestDispatcher(String path) | 用于返回封装了某个路径所指定资源的RequestDispatcher对象 |
getNamedDispatcher(String name) | 用于返回封装了某个Web资源的RequestDispatcher对象,传递给该方法的参数是在Web应用程序部署好的某个Web资源名称 |
forward(ServletRequest request,ServletResponse response) | 该方法用于将请求从一个Servlet传递给另外的一个Web资源 |
include(ServletRequest request,ServletResponse response) | 该方法用于将其它的资源作为当前响应内容包含进来 |
接下来进行最重要的两个概念了:
请求转发
原理如下图所示
在请求转发的过程中传输的信息不会丢失。
请求包含
原理如下图所示