`

HttpServletRequest HttpServletResponse

阅读更多

 

 

 

ServletResponse/ServletReqeust接口不提供与协议相关的API,但HttpServletResponse/HttpServletReqeust是面向Http协议的,提供了与Http相关的API,ServletResponse/ServletReqeust的实现类不在JavaEE API中,而是由Servlet容器提供。

创建一个Servlet时,一般是继承HttpServet,然后覆写doGet()、doPost(),HttpServlet中service()方法签名为

 protected void service(HttpServletRequest req, HttpServletResponse resp)

HttpServletResponse继承了ServletResponse并且扩展了对Http协议的支持

public interface HttpServletRequest extends ServletRequest {}

 其中有4个比较重要的方法 

javax.servlet.http.HttpServletResponse
//设置响应状态码
public void setStatus(int sc);
//设置响应头信息
public void setHeader(String name, String value);
javax.servlet.ServletResponse
//获得响应体字符输出流
public PrintWriter getWriter() throws IOException;
//获得响应体字节输出流 
public ServletOutputStream getOutputStream() throws IOException;

 其中设置头信息还有一个方法 

public void addHeader(String name, String value);

 区别就是addHeader用于 一个key多个value 情况,比如key:value,value,value ... 在原有值添加新值,setHeader用于 一个key一个value 情况,用新的value 覆盖 之前value

  

案例一:302+Location完成请求重定向

设置响应码为302,设置头信息中Location完成客户端请求重定向

public class RedirectServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setStatus(302);
		resp.setHeader("Location", "/Servlet/index.html");
	}
}

 以上这种方式是通过分别设置响应码+头信息来完成的,还有一种更加简便的方式有HttpServetResponse提供

resp.sendRedirect("/Servlet/index.html");

 一行代码完成了设置响应头+头信息的工作

 

  案例二:refresh自动刷新

 通过设置都信息中的refresh完成

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setHeader("refresh", "3;url=/Servlet/index.html");
	}

 还有一种方式是使用html中<mate>标签,这种方式是在响应体中,因为<mate>作为页面的内容的一部分

<meta http-equiv="refresh" content="3;url=/Servlet/index.html" />

案例三:禁用浏览器缓存

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setHeader("Cache-Control", "no-cache");
		resp.setHeader("Pragma", "no-cache");
		// 1969 23:59:59
		resp.setDateHeader("Expires", -1);
	}

 

案例四:设置响应体内容的字符集编码

resp.setCharacterEncoding("utf-8");

 设置响应内容的编码集,但这种方式无法通知浏览器使用哪种编码查看页面,所以会造成浏览器用gbk2312或其他编码形式查看内容,但response用utf-8编码,所以浏览器还是有可能会出现乱码,另外一种方式是通过设置MIME类型时指定编码

resp.setContentType("text/html;charset=utf-8");

 这种方式会设置response的响应的MIME类型为html,同时告诉浏览器使用utf-8查看内容

 

 案例五:获取客户机信息

请求地址为

http://127.0.0.1:8080/Servlet/ClientInfoServlet?param=aaa

获取请求行中的信息,以及客户机信息

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 获得到客户机请求方式
		String method = req.getMethod();// GET
		// 获得HTTp协议
		String protocol = req.getProtocol();// HTTP/1.1
		// 返回请求行中的资源名部分
		String uri = req.getRequestURI();// /Servlet/ClientInfoServlet
		// 返回客户端发出请求完整URL
		String url = req.getRequestURL().toString();// http://127.0.0.1:8080/Servlet/ClientInfoServlet
		// 方法返回发出请求的客户机的IP地址
		String addr = req.getRemoteAddr(); // 127.0.0.1
		// 方法返回请求行中的参数部分
		String param = req.getQueryString();// param=aaa
		// 获得工程虚拟目录名称
		String contextPath = req.getContextPath();// /Servlet
		print(method, protocol, uri, url, addr, param, contextPath);
	}

 获取当前路径访问的资源信息,通过uri截取虚拟目录名称

request.getRequestURI().substring(request.getContextPath().length());// /ClientInfoServlet

 

案例6:获取请求参数

 常用的API

getParameter(name) //根据参数名称获得参数值 (一个值)
getParameterValues(name)  //根据参数名称获得参数值 (多个值)结合checkbox 一起使用
getParameterNames() //获得所有参数名称
getParameterMap() //将参数name和value 保存到一个map中,返回map

 创建一个复杂的form表单

<form method="post" action="/Servlet/ParamServlet">
	用户名 <input type="text" name="username" /><br/>
	密码 <input type="password" name="password" /><br/>
	性别 <input type="radio" name="gender" value="男" /> 男 
			<input type="radio" name="gender" value="女" />女 <br/>
	爱好 <input type="checkbox" name="hobby" value="体育" />体育
	<input type="checkbox" name="hobby" value="音乐" />音乐
	<input type="checkbox" name="hobby" value="读书" />读书<br/>
	城市 <select name="city">
		<option value="北京">北京</option>
		<option value="上海">上海</option>
		<option value="广州">广州</option>
	</select> <br/>
	个人简介 <textarea rows="5" cols="60" name="introduce"></textarea><br/>
	<input type="submit" value="提交" />
</form>

 post请求提交后处理中文乱码使用

req.setCharacterEncoding("utf-8");

 获取提交的请求参数

String username = req.getParameter("username");
String password = req.getParameter("password");
String gender = req.getParameter("gender");
String[] hobbies = req.getParameterValues("hobby");
String city = req.getParameter("city");
String introduce = req.getParameter("introduce");

 get请求乱码产生的原因:

1、客户端使用get请求时先对请求参数进行了utf-8的编码

http://127.0.0.1:8080/Servlet/ParamServlet?username=%E4%B8%AD%E6%96%87

2、tomcat默认使用iso-8859-1对请求参数进行解码

这就是乱码就产生的原因,有两种方式,方式一让Servlet容器支持utf-8编码,例如修改tomcat servlet.xml文件,使用tomcat使用utf-8作为编码

 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>

 方式二手工进行编码(iso-8859-1)-->解码(utf-8)

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String param = req.getParameter("username");
		String encode = URLEncoder.encode(param, "ISO-8859-1");
		String username = URLDecoder.decode(encode, "UTF-8");
		PrintUtils.print(username);
	}

 还有一种编解码的方式

String username = new String(req.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    HttpServletRequest和HttpServletResponse的必备包

    Java中,引入javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse包的必备jar包:org.apache.commons.httpclient.jar

    HttpServletRequest源码 HttpServletResponse源码

    在Java Web开发中,`HttpServletRequest`和`HttpServletResponse`是两个至关重要的接口,它们是Java Servlet API的核心组成部分,用于处理客户端(通常是Web浏览器)与服务器之间的HTTP通信。这两个接口提供了丰富的...

    深入解析Java Web中的HttpServletRequest与HttpServletResponse

    在Java Web应用开发中,HttpServletRequest和HttpServletResponse是两个核心的接口,它们扮演着至关重要的角色。这两个接口是Java Servlet API的一部分,为开发人员提供了处理HTTP请求和构造HTTP响应的丰富功能。...

    HttpServletRequest和HttpServletResponse的讲解

    `HttpServletRequest`和`HttpServletResponse`是两个核心的Servlet接口,它们是服务器与客户端之间交互的关键组件。下面我们将深入探讨这两个接口的功能、用法及实际应用案例。 `HttpServletRequest`接口代表了来自...

    java HttpServletRequest和HttpServletResponse详解

    在进行Java Web开发时,理解HttpServletRequest和HttpServletResponse的工作原理和使用方法至关重要,这有助于你有效地处理客户端和服务器之间的交互,提供正确的服务和反馈。这两个接口的熟练掌握是成为专业Java ...

    HttpServletRequest-response方法总结

    下面是对HttpServletRequest和HttpServletResponse的方法总结: HttpServletRequest: 1. getScheme():返回请求的计划,如http、https或ftp。 2. getServerName():返回被发送请求的服务器的主机名。 3. ...

    HttpServletRequest与HttpServletResponse的实现类.docx

    【HttpServletRequest与HttpServletResponse详解】 在Java Web开发中,HttpServletRequest和HttpServletResponse是Servlet API中的核心接口,它们分别代表了客户端的HTTP请求和服务器的HTTP响应。每次客户端向Web...

    user_login.java

    HttpServlet实现类 HttpServletRequest HttpServletResponse接口 Get Post方法使用 说明

    J2EE中文版.chm

    HttpServletRequest HttpServletResponse HttpSession HttpSessionBindingEvent HttpSessionBindingListener HttpSessionContext HttpUtils RequestDispatcher Servlet ServletConfig ServletContext ...

    HttpServletResponse and HttpServletRequest

    这是很好的HttpServletResponse HttpServletRequest.加强.ppt,实际例子,值得收藏!

    HttpServletResponse

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应内容类型和字符集 resp.setContentType("text/html;charset=UTF-8"); ...

    手机与服务器交互,服务器端代码

    HttpServletRequest HttpServletResponse 以最简单的this.response.getWriter().write(result); 进行服务器端返回。此时与服务器的交互流量最小。 一次下载包含了struts常用的jar。 嫌分多的就不要下载了。

    从HttpServletRequest获取各种路径总结

    ### 从HttpServletRequest获取各种路径总结 #### 一、概述 在Java Web开发中,通过`HttpServletRequest`对象可以获取客户端请求的各种信息,包括但不限于路径信息。这些路径信息对于开发者来说至关重要,尤其是在...

    Java Web程序设计入门课件-HttpServletResponse和HttpServletRequest.pptx

    在Servlet API中,`HttpServletResponse`和`HttpServletRequest`接口扮演着至关重要的角色。 `HttpServletResponse`接口是用来封装HTTP响应消息的,它扩展了`ServletResponse`接口。在处理HTTP响应时,我们主要关注...

    private void sendVideo(HttpServletRequest request, HttpServletResponse….pdf

    `HttpServletResponse`和`HttpServletRequest`是Java Servlet API的一部分,用于处理客户端请求和服务器响应。`getOutputStream()`方法用于获取用于发送响应的`ServletOutputStream`。 知识点七:数据传输过程 在...

    基于Spring的HttpInvoker实现改写egova_invoker.zip

     public void invoker(HttpServletRequest request, HttpServletResponse response) {  HttpInvoker.invoker(request, response, new InvokerProcess(){  public Object process(RemoteInvocation ...

    自学HttpServletResponse

    2. **HttpServletResponse与HttpServletRequest的关系** - **`HttpServletRequest`**: 表示客户端的HTTP请求。它包含了客户端的所有请求信息,如请求方法、请求URI、请求参数等。 - **`HttpServletResponse`**: ...

    Struts2在Action中获得Response对象的四种方法

    然而,与Struts1.x不同,Struts2的Action类不再直接接收HttpServletRequest和HttpServletResponse对象作为execute方法的参数。这使得在Action中直接获取Response对象变得稍显复杂。下面我们将详细介绍在Struts2中,...

    HTTP请求头概述(HttpServletRequest)

    以上代码展示了如何使用`HttpServletRequest`和`HttpServletResponse`接口来处理和设置请求头及响应头,这对于构建高效、安全且功能丰富的Web应用程序至关重要。通过对这些头信息的有效管理和利用,可以极大地提升...

    JAVAWEB-09:HttpServletRequest对象&会话管理之Cookie

    服务器可以通过`HttpServletResponse.addCookie()`方法设置Cookie,而`HttpServletRequest.getCookies()`则用于读取Cookie。Cookie通常包含键值对,例如用户名或会话ID。每个Cookie都有一个名称、值、过期时间、路径...

Global site tag (gtag.js) - Google Analytics