Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
HttpServletResponse
1、响应行 HTTP/1.1 200 OK
setStatus(int sc) 设置响应状态码
2、响应头
- sendRedirect(String location) 请求重定向
// //告诉浏览器要重新定向新的资源
// response.setStatus(302);
// //告诉浏览器要去访问那个url
// response.setHeader("location","/demo4");
response.sendRedirect("/demo4");
- setHeader(String name, String value) 设置响应头信息
//告知浏览器使用什么码表
response.setHeader("content-type", "text/html;charset=UTF-8");
//告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
Referesh刷新
response.setIntHeader("refresh",1); //1秒刷一次
//3秒后跳转
response.setHeader("refresh","3;url=/demo");
3、响应正文(主体)
- getWrite(); 字符输出流
- getOutputStream(); 字节输出流
- setCharacterEncoding(String charset) 告知服务器使用什么编码
- setContentType(String type)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
response.setHeader("content-type","text/html;charset=utf-8");
//告知服务器使用什么编
response.setCharacterEncoding("utf-8");*/
//可替代上面方法
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
out.write("hello world 你好啊");
}
-----------------------
//下载
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过路径得到一个输入流
String path = this.getServletContext().getRealPath("/WEB-INF/classes/haha.jpeg");
FileInputStream fis = new FileInputStream(path);
//创建字节输出流
ServletOutputStream sos = response.getOutputStream();
String filename = path.substring(path.lastIndexOf("/") + 1);
filename = URLEncoder.encode(filename,"utf-8");
response.setHeader("content-disposition","attachment;filename="+filename);
response.setHeader("content-type","image/jpeg");
//执行输出操作
int len = 1;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
sos.write(b,0,len);
}
}
例子:验证码
@WebServlet(name = "ServletDemo1", urlPatterns = "/demo1")
public class ServletDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第三方
ValidateCode vc = new ValidateCode(110, 25, 4, 9);
vc.write(response.getOutputStream());
System.out.println("1111111");
}
private void text1(HttpServletResponse response) throws IOException {
int width = 110;
int height = 25;
//在内存中创建一个内存
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.PINK);
g.fillRect(1,1,width - 2, height - 2);
g.setColor(Color.RED);
g.drawRect(0,0,width - 1,height -1);
g.setFont(new Font("宋体",Font.BOLD|Font.ITALIC,15));
g.setColor(Color.BLUE);
Random r = new Random();
for (int i = 0;i < 4;i++){
g.drawString(r.nextInt(10) + "",20 * (i + 1),20);
}
g.setColor(Color.DARK_GRAY);
for (int i = 0;i < 9; i++) {
g.drawLine(r.nextInt(width),r.nextInt(height),r.nextInt(width),r.nextInt(height));
}
//将图片元素以流的方式输出客户端
ImageIO.write(img,"jpg",response.getOutputStream());
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
<script type="text/javascript">
function changCode() {
var img = document.getElementById("img");
img.src = "/servlet/demo1?time=" + new Date().getTime();
}
</script>
</head>
<body>
<form action="#" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="pwd"><br>
验证码:<input type="text" name="code">
<a href="javascript:changCode()">看不清换一张</a><br>
<input type="submit" value="登录"><br>
</form>
</body>
</html>
HttpServletRequest
1、请求行
Get http://localhost:8080/day09/servlet/req1?username=zs http/1.1
getMethod(); 获得请求方式
getRequestURL();返回客户端发出请求时的完整URL。
getRequestURI(); 返回请求行中的资源名部分。
getContextPath(); 当前应用的虚拟目录 /day09_01_request
getQueryString() ; 返回请求行中的参数部分。
2、请求消息头
String getHeader(String name) 根据头名称得到头信息值
Enumeration getHeaderNames() 得到所有头信息name
Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
3、请求正文
与获取表单数据相关的方法
getParameter(name) 根据表单中name属性的名,获取value属性的值方法
getParameterValues(String name)专业为复选框取取提供的方法
getParameterNames() 得到表单提交的所有name的方法
getParameterMap 到表单提交的所有值的方法 //做框架用,非常实用
getInputStream 以字节流的方式得到所有表单数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String psd = request.getParameter("psd");
String sex = request.getParameter("sex");
String[] hobbys = request.getParameterValues("hobby");
String city = request.getParameter("city");
System.out.println(username);
System.out.println(psd);
System.out.println(sex);
System.out.println(city);
for (int i = 0; hobbys!=null && i < hobbys.length; i ++) {
System.out.println(hobbys[i]);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo5" method="post">
用户名:<input type="text" name="username"><br>
密码;<input type="password" name="psd"><br>
性别:<input type="radio" name="sex" value="男" checked="checked">男
<input type="radio" name="sex" value="女">女<br>
爱好:<input type="checkbox" name="hobby" value="basketball">篮球
<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="coding">编码<br>
所在城市:
<select name="city">
<option>--- 请选择 -----</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="zj">浙江</option>
</select>
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
与操作非表单数据相关的方法(request也是一个域对象)
*** void setAttribute(String name, Object value);
*** Object getAttribute(String name);
Void removeAttribute(String name);
与请求转发相关的方法
//得到请求转发或请求包含的协助对象
RequestDispatcher getRequestDispatcher(String path)
forward(ServletRequest request, ServletResponse response) //转发的方法
include(ServletRequest request, ServletResponse response) //请求包含
与请求编码相关的方法
//解决post方式编码
*****request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式
//解决get方式编码
String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);
网友评论