Servlet-request and response

来源:互联网 发布:中世纪2 优化9 拜占庭 编辑:程序博客网 时间:2024/06/06 04:03



一、HttpServletResponse

Response就是代表的响应部分,响应包换响应消息行,响应消息头和响应正文。

1、响应行  HTTP/1.1   

   响应状态码200 = 服务器端OK

               404 = 此信息代表客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应且不知原因。

               500 = 服务器端代码错误

        setStatus(int sc)设置响应状态码

2、响应头

       ***** sendRedirect(String location)请求重定向

       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刷新

3、响应正文(主体)

       *** getWrite(); 字符输出流

      getOutputStream(); 字节输出流

      setCharacterEncoding(String charset) 告知服务器使用什么编码

        *****setContentType(String type)

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 {//服务器中默认的编码为ISO-8859-1,它不支持中文,tomcat规定的/*//告诉服务器应用使用UTF-8解析文本response.setCharacterEncoding("UTF-8");//告诉客户端要使用什么编码response.setHeader("content-type", "text/html;charset=UTF-8");*///告诉服务器应用使用UTF-8解析文本,告诉客户端要使用什么编码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);}}

解析编码原理图

                                                                   


文件下载,在网页中加入图片下载

 

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 ServletDemo3 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);//设置文件名的编码filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为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);}sos.close();fis.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

实现编写验证码

1登陆页面JSP编码


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><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.setAttribute("src","/day09_00_HttpServletResponse/servlet/demo4");//XML Dom 语法img.src = "/day09_00_HttpServletResponse/servlet/demo4?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="/day09_00_HttpServletResponse/servlet/demo4" onclick="changeCode()"/><a href="javascript:changeCode()" >看不清换一张</a><br><input type="submit" value="登录"/><br></form></body></html>

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;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;import cn.dsna.util.images.ValidateCode;public class ServletDemo4 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);String code = vc.getCode();//得到生成的字符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;}//添加9条干扰线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);}}

实现刷新功能
import java.io.IOException;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo5 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");       /*       response.setIntHeader("refresh", 1);//设置1秒钟刷新一次Random r = new Random();response.getWriter().write(r.nextInt()+"");              */response.getWriter().write("注册成功!3秒钟跳到主页");//设置3秒钟跳转response.setHeader("refresh", "3;url=/day09_00_HttpServletResponse/servlet/demo6");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

请求重定向


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 ServletDemo7 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("A:我要借钱!");System.out.println("B:我不有,但是我可以告诉你谁有");/*//告诉客户端要重新定向新的资源response.setStatus(302);//告诉浏览器要去访问哪个URLresponse.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*///请求重定向response.sendRedirect("/day09_00_HttpServletResponse/servlet/demo8");System.out.println("A: 我去了");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}




二,HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

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、请求正文(重要)

与获取表单数据相关的方法

          <input type="text" name="username" />

           getParameter(name) 根据表单中name属性的名,获取value属性的值方法

          getParameterValuesString name)专业为复选框取取提供的方法

          getParameterNames() 得到表单提交的所有name的方法

          getParameterMap 到表单提交的所有值的方法   //做框架用,非常实用

   一般我们获取表单数据的最终目的是将其传输到数据库中,所以把数据封装进对象中

          getInputStream  以字节流的方式得到所有表单数据


import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.lang.reflect.InvocationTargetException;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 org.apache.commons.beanutils.BeanUtils;import com.itheima.entity.User;public class ServletDemo3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//告诉服务器要使用什么编码,注:浏览器使用的是什么编码传过来的就是什么编码 request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码test1(request);}            //使用commons_beanutils包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();}}        //getparameterMap方法获取表单数据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);//得到setter属性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) {//获取所有的表单name的名子Enumeration names = request.getParameterNames();while(names.hasMoreElements()){String name = (String) names.nextElement();//得到每一个name名String[] values = request.getParameterValues(name);//根据name名,得到value值for (int i = 0;values!=null && i < values.length; i++) {System.out.println(name+"\t"+values[i]);}}}private void test1(HttpServletRequest request) throws UnsupportedEncodingException {//获取表单数据//根据表单中name属性的名,获取value属性的值方法 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");userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");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);}}




与操作非表单数据相关的方法(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)            //请求包含,两个资源当成一个来用


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 ServletDemo5 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");String str = "aaaaa";System.out.println("A:我想办事");System.out.println("B:我办不了,但我可以找人帮你办");//将非表单的数据添加到request的域中request.setAttribute("s", str);//将请求转发到demo6中//request.getRequestDispatcher("/servlet/demo6").forward(request, response);//注:请求转发不能跳转到其它应用//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);//使用重定向//response.sendRedirect(request.getContextPath()+"/servlet/demo6");//可以跳转到其它应用//response.sendRedirect("http://www.baidu.com");System.out.println("B:事办完了");//请求包含request.getRequestDispatcher("/servlet/demo6").include(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

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 ServletDemo6 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");System.out.println("这个事我能办");//将request对象中的移除//request.removeAttribute("s");//从request对象中获取s的值String s = (String) request.getAttribute("s");System.out.println(s);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}




request 与response对象解决乱码的应用

与请求编码相关的方法:

//解决post方式编码

request.setCharacterEncoding("UTF-8"); //告诉服务器客户端什么编码,只能处理post请求方式

 

//解决get方式编码

String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);

 




0 0