ServletRequest,HttpServletRequest ServletResponse,HttpServletResponse的区别
servletsessionjsp浏览器web服务引擎
所有Servlet响应都实现ServletResponse接口。ServletResponse接口主要有以下方法:
(1)从Servlet中可以通过getWriter方法取得PrintWriter对象,来输出字符数据。从Servlet中可以通过getOutputStream方法取得ServletoutputStream对象。ServletOutputStream既可以输出字符数据,也可以输出MIME格式的二进制数据。如果getWriter方法已经被使用过,当使用getOutputStream时,会有java.lang.IllegalStateException例外抛出。
(2)setContentType方法:在响应中可以表明内容格式和长短。
(3)setBufferSize方法:设置Web容器的缓冲器大小; getBufferSize方法返回Web容器的缓冲器大小; resetBuffer方法清空并重置缓冲器,使用reset方法清空缓冲器、状态头信息,使用flushBuffer方法将缓冲器内的所有输出内容向客户传递。使用isCommitted方法判断是否响应已经被履行。“履行”的定义是指状态码冬耕信息已经被写入响应。
(4)setLocal方法设定响应的地域信息,主要在Web程序的国际货币国际化时使用。这个方法应该在getWriter之前被使用。默认的Web服务器的地域信息。
HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。
(1)setStatus方法用来设置Servlet向客户端返回的状态码,它用来设置没有出错的状态。如果Servlet运行出错,Servlet可以使用sendError方法设置状态码,如sendError(int sc)方法设置错误状态代码。sendError(int sc,String msg)方法除了设置状态码,还向客户发出一条错误信息。
(2)setHeader可以指定特定名称的头信息的值,addDateheader,addIntHeader,setDateHeader,setIntHeader可以加入或理性特定时间或整数型头信息。
(3)addCookie方法可以在Web服务器响应中加入Cookie对象,这个对象将被浏览器所保存。Cookie机制也被用来维护会话状态。
(4)sendRedirect方法向客户发出临时重新导向的响应。它生成的响应状态码为302。该响应给了客户一个新的URL风趣。如果缓冲器已经被清空,这个方法会弹出一个IllegalStateException例外。
内置对象是不需要声明,直接可以在JSP中使用的对象,JSP有以下几种内置对象:
request request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
application applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page page表示从该页面产生的一个servlet实例。
Servlet API中的几个对象
JSP提供了八个内部对象,而其中的五个内部对象对应于Servlet API中的七个对象,这也就使得我们正常理解并熟练使用Servlet中的这七个对象显得尤其重要。这五个JSP的内部对象和Servlet API中的对象的对应关系是:
request对象对应于:javax.servlet.http.HttpServletRequest和javax.servlet.ServletRequest
response对象对应于:javax.servlet.http.HttpServletResponse和javax.servlet.ServletResponse
session对象对应于:javax.servlet.http.HttpSession
application对象对应于:javax.servlet.ServletContext
config对象对应于:javax.servlet.ServletConfig
javax.servlet.http.HttpServletRequest
这是一个接口,在我们提到接口之前,还是让我们来复习一下Java中接口的一个初步的解释:
接口在语法上与类相似,但是接口没有实例,使用接口,只是指定类必须做什么而不是如何做。
HttpServletRequest接口用来处理一个对Servlet的HTTP格式的请求信息。
javax.servlet.ServletRequest
这也是一个接口,这个接口定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据。而javax.servlet.http.HttpServletRequest也只是该接口的一个扩展,也就是说,该接口的所有方法也可以被javax.servlet.http.HttpServletRequest所使用。
javax.servlet.http.HttpServletResponse接口
该接口用来描述一个返回到客户端的HTTP回应。
javax.servlet.ServletResponse接口
该接口用来定义一个Servlet引擎产生的对象,通过这个对象,Servlet对客户端的请求作出响应。这个响应应该是一个MIME实体,可能是一个HTML页、图象数据或其他MIME的格式。javax.servlet.http.HttpServletResponse接口是该接口的扩展。
javax.servlet.http.HttpSession接口
该接口用来描述一个session,至于什么是session我想在这里就没必要说了吧。
javax.servlet.ServletContext接口
该接口用来定义了一个Servlet的环境对象。也可是认为这是多个客户端共享的信息,它与session的区别在于应用范围的不同,session只对应于一个用户。
javax.servlet.ServletConfig接口
该接口定义了一个对象,通过这个对象,Servlet引擎配置一个Servlet。每一个ServletConfig对象对应着一个唯一的Servlet。
javax.servlet.http.Cookie类
这个类描述了一个cookie,cookie的作用其实与session很类似,只是cookie保存在客户端,session保存在服务器端
==========================
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
}
因为要用到HttpServletRequest中的方法,我对ServletRequest进行了强转,然后问题解决。可是后来一想不对啊,我们知道我们对子类实现进行向上转型得到父类对象是安全的,因为子类会完全继承父类的方法,我们向上转型为父类,当我们调用父类的方法其实在子类实现中是能完全找到的。反之向下转型是不安全的,我们子类除了完全继承父类的方法外还会拓展自己的方法,所以我们在调用子类方法时可能在父类实现中是找不到的,所以向下转型不安全。
可是本例中的实现却让我们困惑,我们不仅实现了向下转型,同时还调用了子类拓展的方法,是父类没有的,可是却实现了。这不是和我们所学矛盾吗?后来看了API和一些资料我终于明白了,这和我们所学其实并不冲突!我们先看API:
public interface HttpServletRequest extends ServletRequest
终于找到原因了,原来HttpServletRequest和ServletRequest都是接口,他们都只是定义了方法却没有提供相关实现。所以我们看到的ServletRequest request中的request对象其实并不是我们ServletRequest 的一个具体实现。
这里我们要看我们提出的问题是否安全,其实主要看request 对象的具体实现类究竟是继承的哪个接口,如果继承自HttpServletRequest接口那么我们向下转型使用HttpServletRequest接口的方法就是安全的。测试如下:
if(request instanceof HttpServletRequest){
System.out.println("我是右边类的实例");
}
输出:我是右边类的实例,证明我们的request对象的确是HttpServletRequest的一个实例。
分享到:
相关推荐
在实际开发中,我们经常需要使用ServletRequest和ServletResponse来获取请求信息和控制响应结果。例如,我们可以使用getRequestURL()方法来获取当前请求的URL,然后使用这个URL来实现页面的跳转;我们可以使用get...
1. `forward(ServletRequest request, ServletResponse response)`:将当前请求和响应对象转发给指定的资源。 2. `include(ServletRequest request, ServletResponse response)`:在当前请求处理过程中插入指定资源...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)...
private HttpServletResponse servletResponse; public void setRequest(Map, Object> request) { this.request = (Map, Object>) request; servletRequest = (HttpServletRequest) request.get(StrutsStatics....
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (encoding != null) { servletRequest.set...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest...
`javax.servlet.Filter`接口定义了过滤器的核心方法,如`doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`。过滤器链 (`FilterChain`) 允许一个过滤器调用下一个过滤器,直到请求...
- **service(ServletRequest request, ServletResponse response)**:此方法用于处理客户端的请求。根据请求类型(GET、POST等),可以选择不同的处理方式。 - **destroy()**:当 Servlet 不再被需要时,服务器会...
HttpServletResponse response = (HttpServletResponse) servletResponse; String method = request.getMethod(); if (HttpMethod.OPTIONS.toString().equals(method)) { response.setStatus...
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; ...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest...
方法包括`forward(ServletRequest request, ServletResponse response)`和`include(ServletRequest request, ServletResponse response)`,分别用于向前端控制器转发请求和包含指定资源。 **二、Servlet接口** ...
2. `void service(ServletRequest req, ServletResponse res)`: 这是Servlet接口中最核心的方法,它会根据HTTP请求的方法(GET、POST等)来调用相应的处理方法。如果请求是GET类型,它会调用`doGet()`;如果是POST,...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (encoding != null) { servletRequest.set...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest...
该接口定义了服务请求的方法如`service(ServletRequest request, ServletResponse response)`,以及初始化和销毁Servlet的方法`init(ServletConfig config)`和`destroy()`。 2. **GenericServlet类**:这是一个抽象...