HttpServletResponse
- PrintWriter getWriter()
- void setContentType(String type)
- 下面Servlet代码展示了当客户端请求对应的url-pattern时,接收文本,并确保其显示不乱码
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.write("你好!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- ServletOutputStream getOutputStream()
- void setHeader(“content-disposition”, String value)
- void setHeader(“content-type”, String value)
- 下面Servlet代码展示了当客户端请求对应的url-pattern时,提示下载文件
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");
FileInputStream fis = new FileInputStream(path);
ServletOutputStream sos = response.getOutputStream();
String filename = path.substring(path.lastIndexOf("\\")+1);
if(request.getHeader("user-agent").toLowerCase().contains("msie")){
filename = URLEncoder.encode(filename, "UTF-8");
}else{
filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");
}
response.setHeader("content-disposition", "attachment;filename="+filename);
response.setContentType(this.getServletContext().getMimeType(filename));
int len = 1;
byte[] b = new byte[1024];
while((len=fis.read(b))!=-1){
sos.write(b,0,len);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package servlet;
import cn.dsna.util.images.ValidateCode;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setIntHeader("expires", 0);
ValidateCode vc = new ValidateCode(110, 25, 4, 9);
vc.write(response.getOutputStream());
}
private void test1(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.setColor(Color.BLUE);
g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15));
Random rand = new Random();
int position = 20;
for (int i = 0; i < 4; i++) {
g.drawString(rand.nextInt(10)+"", position, 20);
position+=20;
}
for (int i = 0; i < 9; i++) {
g.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height));
}
ImageIO.write(img, "jpg", response.getOutputStream());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 单纯上面的代码只是实现了生成验证码的效果,将其加到HTML网页当中
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function changeCode(){
var img = document.getElementsByTagName("img")[0];
img.src = "/TestWeb/demo3?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"/>
<img src="/TestWeb/demo3" onclick="changeCode()"/><a href="javascript:changeCode()" >看不清换一张</a><br>
<input type="submit" value="登录"/><br>
</form>
</body>
</html>
- void setHeader(“refresh”, String value)
- 下面代码实现网页的跳转功能
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("注册成功!3秒钟跳到主页");
response.setHeader("refresh", "3;url=/TestWeb/homePage");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
response.setStatus(302);
response.setHeader("location", "/TestWeb/anotherPage");
response.sendRedirect("/TestWeb/anotherPage");
HttpServletRequest
- String getMethod()
- StringBuffer getRequestURL()
- String getRequestURI()
- String getContextPath()
- String getQueryString()
- 以上是一些请求消息行方面的方法
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getMethod());
System.out.println(request.getRequestURL());
System.out.println(request.getRequestURI());
System.out.println(request.getContextPath());
System.out.println(request.getQueryString());
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
GET
http://localhost:8080/TestWeb/demo
/TestWeb/demo
/TestWeb
name=haha
String getHeader(String name)
根据消息头名字获取相应内容Enumeration<String> getHeaderNames()
获取所有消息头的名字- 以上是一些请求消息头方面的方法
package servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test1(request);
}
private void test2(HttpServletRequest request) {
Enumeration names = request.getHeaderNames();
while(names.hasMoreElements()){
String e = (String) names.nextElement();
System.out.println(e+":"+request.getHeader(e));
}
}
private void test1(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
System.out.println(header);
if(header.toLowerCase().contains("msie")){
System.out.println("你使用的是IE浏览器");
}else if(header.toLowerCase().contains("firefox")){
System.out.println("你使用的是火狐浏览器");
}else if(header.toLowerCase().contains("chrome")){
System.out.println("你使用的是谷歌浏览器");
}else{
System.out.println("你使用的是其它浏览器");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 以下是请求消息体方面的方法
String getParameter(String name)
根据表单中元素的名字获取其值String[] getParameterValues(String name)
根据表单中元素的名字获取其值(复选框)Enumeration<String> getParameterNames()
获取所有表单名字Map<String, String[]> getParameterMap()
获取所有表单与其值组成的Map集合- 以下代码实现了提交表单数据,并根据HttpServletRequest对象获取提交的内容
package servlet;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.User;
import org.apache.commons.beanutils.BeanUtils;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
test4(request);
}
private void test4(HttpServletRequest request) {
try {
User u = new User();
System.out.println("封装数据前:"+u);
BeanUtils.populate(u, request.getParameterMap());
System.out.println("封装数据后:"+u);
} catch (Exception e) {
e.printStackTrace();
}
}
private void test3(HttpServletRequest request) {
try {
User u = new User();
System.out.println("封装数据前:"+u);
Map<String,String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> m : map.entrySet()) {
String name = m.getKey();
String[] value = m.getValue();
PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
Method setter = pd.getWriteMethod();
if(value.length==1){
setter.invoke(u, value[0]);
}else{
setter.invoke(u, (Object)value);
}
}
System.out.println("封装数据后:"+u);
} catch (Exception e) {
e.printStackTrace();
}
}
private void test2(HttpServletRequest request) {
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String name = (String) names.nextElement();
String[] values = request.getParameterValues(name);
for (int i = 0;values!=null && i < values.length; i++) {
System.out.println(name+"\t"+values[i]);
}
}
}
private void test1(HttpServletRequest request) {
String userName = request.getParameter("userName");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
String[] hobbys = request.getParameterValues("hobby");
String city = request.getParameter("city");
System.out.println(userName);
System.out.println(pwd);
System.out.println(sex);
for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
System.out.print(hobbys[i]+"\t");
}
System.out.println();
System.out.println(city);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 以上代码还需要用到用来注册的HTML文件,和用来封装表单提交数据的User类
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/TestWeb/demo" method="post">
用户名:<input type="text" name="userName"/><br/>
密码:<input type="password" name="pwd"/><br/>
性别:<input type="radio" name="sex" value="男" checked="checked"/>男
<input type="radio" name="sex" 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>------请选择------</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz">广州</option>
</select>
<br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
package entity;
import java.util.Arrays;
public class User {
private String userName;
private String pwd;
private String sex;
private String[] hobby;
private String city;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "User [userName=" + userName + ", pwd=" + pwd + ", sex=" + sex
+ ", hobby=" + Arrays.toString(hobby) + ", city=" + city + "]";
}
}
- 操作与非表单相关的数据相关的方法。与ServletContext相类似,HttpServletRequest也维护了一个Map集合;可以向其中添加和取出键值对,可以用在请求转发当中操作非标单数据。
void setAttribute(String name, Object o)
Object getAttribute(String name)
RequestDispatcher getRequestDispatcher(String path)
void forward(ServletRequest request, ServletResponse response)
- 请求转发和请求重定向的区别:
- 请求转发只能在本项目内转发,不能访问其他应用
- 而请求重定向则可以跳转其他应用
- 请求转发可以转发数据,而请求重定向则不能