Servet最主要的作用就是处理客户端请求,并向客户端做出响应。 浏览器发送HTTP请求信息,Web服务器接收请求信息。Web服务器创建HttpServletRequest对象封装请求信息。Web服务器创建HttpServletResponse对象封装响应信息。Web服务器调用Serlet,通过service()方法从HttpServletRequest对象读取请求信息,将响应数据封装到HttpServletResponse对象。Web服务读取响应信息,发送HTTP响应信息给浏览器。浏览器解析给用户呈现出结果。
在Servlet API中,定义了一个HttpServletResponse接口,专门用于封装HTTP响应信息。HTTP响应信息分为状态行,响应信息头,消息体三部分。因此HttpServletResponse定义了向客户端发送响应状态码,响应信息头,响应消息体的方法。
html状态行的内容为: 格式:HTTP版本号 状态号 原因描述 举例:HTTP/1.1 200 OK 状态号解释
用该方法设置HTTP响应信息的状态码,并生成响应状态行。HTTP版本由服务器决定,状态原因描述和状态号有关因此,我们单独设置状态码就可以定义响应状态行。其中状态码默认为200。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub /* * 通过对不同状态码的设置,观察页面的不同显示状态。 */ response.setStatus(400); //response.setStatus(404); //response.setStatus(200); //response.setStatus(100); response.getWriter().append("Served at: ").append(request.getContextPath()); }这个方法用于发送错误信息的状态码,response对象中提供了两个重载sendError(int sc)的方法,
public void sendError(int code) throw java.io.IOException public void sendError(int code,String message) throw java.io.IOException方法1:用于发送错误信息的状态码 方法2:用于发送错误信息的状态码和错误信息提示
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub /* * 学习测试sendError发送状态码和提示错误原因信息的方法 */ response.sendError(404); //response.sendError(404,"你查找的资源不存在!!!"); //response.sendError(400,"请求错误!!!"); //response.sendError(200,"okokok!!!"); //response.getWriter().append("Served at: ").append(request.getContextPath()); }HTTP响应消息中第一行为响应状态行,然后是若干响应消息头。服务器根据不同情况可以发送不同的响应消息头。 html请求头响应头参考地址 html响应头信息 常见的响应头信息
参考链接 很多细节需要我们去学习,例如什么响应头需要add,什么响应头需要set。local如何使用?
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.addHeader("test", "yes"); response.getWriter().append("Served at: ").append(request.getContextPath()); }成功加入了一个响应信息头,test:yes
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.addHeader("Content-Type","text/html;charset=utf-8"); //response.setContentType("text/html;charaset=utf-8"); //另一种写法。 response.getWriter().append("我是大坏蛋").append(request.getContextPath()); }Content-Type表示后面的文档属于什么MIME类型,声明是html文档,并且编码是utf-8这样浏览器解释的时候不会出现乱码。
addIntHeader(string name,int value); //明显是与addHeader方法相似,不过这个响应信息是整形的。该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,他可以直接输出字节数组中的二进制数据。因此,要输出二进制格式的响应正文,就要使用getOutputStream()方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.addHeader("Content-Type", "text/html;charaset=utf-8"); OutputStream out = response.getOutputStream(); String data = "我很帅气;"; out.write(data.getBytes()); //response.getWriter().append("Served at: ").append(request.getContextPath()); //注意getWriter和getOutputStream方法都可以使用,但是不能同时使用否则就出现,java.lang.IllegalStateException异常 }这个方法获得的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.write("<html> <head> <title> getWriter学习测试 </title> </head>"); out.write("<body> <h1> 我有七个老婆 </h1> </body> </html>"); }向html文档中写入,html标记。
输出结果是??。response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表不支持中文,将中国编码为63,63。浏览器接收默认使用GB2312解码为?。因此我们需要修改response的编码方式和浏览器的解码方式。达成一致,首先浏览器可以修改默认解码方法。但是这样对用户不友好。所以有以下两种方式修改中文编码。 第一种方法:
//设置HttpServletResponse使用utf-8编码 response.setCharacterEncoding("utf-8"); //通知浏览器使用utf-8解码 response.setHeader("Content-Type","text/html;charset=utf-8");第二种方法:
//包含第一种方式的两种功能。 response.setContentType("text/html;charset=utf-8");显然第二种方式简洁不少。
Refresh头字段,通知浏览器在指定的视角内自动刷新并跳转到其他页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setHeader("Refresh", "2;URL=http://www.baidu.com"); response.getWriter().write("welcome to my html"); }2秒后自动跳转到百度
为了解决客户端的请求一个Servlet类无法完成全部工作。这时可以使用重定向来完成。具体是Web服务器接收到客户端请求后,无法访问当前请求URL所指向的web资源,指定一个新的资源路径让客户端重新发送。 使用方法
public void sendRedirect(java.lang.String location) throws java.io.IOExceptionlocation可以使用相对URL,服务器自动将相对URL翻译为绝对URL。 实现一个账户密码登录
登录页面
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> 登录页面 </title> </head> <body> <form action="/ServletTest/LoginServlet" method="post"> 用户名:<input type="text" name="username"></br> 密码:<input type="password" name="password"></br> <input type="submit" value="登录"> </form> </body> <html>跳转页面,密码正确跳转到百度,否则跳转会登录页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String username = request.getParameter("username"); String password = request.getParameter("password"); if(username.equals("123456")&&password.equals("123456")){ response.sendRedirect("http://www.baidu.com"); } else response.sendRedirect("/ServletTest/login.html"); }