[Java拾遗四]JavaWeb基础之Servlet_Request&&Response

今天来回顾下之前学过Servle的Resquest以及Response的知识.
1,Request和Response技术:

    rr的作用:
        request是请求,封装用户的请求信息.若想获取请求信息,找request就行了
        response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了
    rr的体系结构:
        request
        在servlet中有一个service(ServletRequest,ServletResponse)  抽象方法
        在HttpServlet中实现了service(ServletRequest,ServletResponse)
        并且重载了service(HttpServletRequest,HttpServletResponse)
       
        request的实现类 org.apache.catalina.connector.RequestFacade
        response的实现类 org.apache.catalina.connector.ResponseFacade
       
        request的体系
            ServletRequest(接口)
                |
                |
            HttpServletRequest(接口)
                |
                |
            RequestFacade(类 tomcat)
           
       response的体系
           ServletResponse(接口)
                |
                |
            HttpServletResponse(接口)
                |
                |
            ResponseFacade(类 tomcat)
2,Response
   (1)作用:响应
        http响应的格式:
            响应行 响应头 响应体
    (2)简单介绍api
        操作响应行:
            响应行的格式:
                协议/版本 状态码 状态码说明
                HTTP/1.1 200 OK
            常用的方法:
                setStatus(int)
                sendError(int)
                sendError(int,msg)
        操作响应头:
            响应头的格式:
                key:name
                key:name1,name2  --多个值的时候用逗号隔开
            常用的方法:
                setHeader(string,string)
                setIntHeader(string,int)
                addHeader(string,string)
                setDateHeader(string,long)
        操作响应体:
            响应题就是展示的内容
                getOutputStream()
                getWriter()
    (3)详解api
       a, 状态码:
            1xx:正在请求中
            2xx:完成请求响应
                200:成功完成
            3xx:还需浏览器进一步操作
                302:还需跳转
                304:浏览器去读缓存
            4xx:用户请求错误
                404:路径不存在
            5xx:服务器错误:
                500:服务器错误

        常用方法:
            对于非错误的状态码
                setStatus(int):例如 setStatus(304)
            对于的错误的状态码
                sendError(int)
                sendError(int,msg):返回错误的信息
        b,操作响应头:
            响应头的格式:
                key:name
                key:name1,name2  --多个值的时候用逗号隔开
            常用方法:
                setHeader(String key,String name):给响应设置指定的头信息
                addHeader(String key,String name1):若存在则追加,反之则设置
               
                setIntHeader(String key,int value):给响应设置指定的头信息(int类型的)
                addIntHeader(String key,int value):若存在则追加,反之则设置
               
                setDateHeader(String key,Long long):给相应头设置毫秒值的
        案例:
            重定向:
                302:还需要跳转
                需要用到location
                代码实现:
                    setStatus(302);
                    setHeader("location","跳转的路径");
                开发中时使用
                    sendRedirect(跳转的路径);
            刷新:
                response.setHeader("refresh","3;url=跳转的路径");
               
            重定向和刷新最后的效果是一样的,同样是发送了两次请求
代码案例:
使用location跳转:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setStatus(302);
    //设置跳转路径
    response.setHeader("location","/dayaugmentum10/loca2");
}

使用refresh跳转:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("refresh", "3;url=/augmentum/1.html");
}

c,操作响应体:
        常用的方法:
        ServletOutputStream getOutputStream():字节流
        PrintWriter getWriter():字符流
       
        通过流对象.println(任意内容);
    字符乱码的处理
        设置响应信息的编码格式
            response.setCharacterEncoding("utf-8"):
       
        设置响应信息的编码格式并且通知浏览器用什么编码打开
            response.setHeader("content-type","text/html;charset=utf-8");
            开发中使用
            response.setContentType("text/html;charset=utf-8"); ☆
           
        在页面添加
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    注意事项(针对流)
        字节流和字符流是互斥的.
        tomcat会帮我们关闭流
    验证码:
        作用:防止恶意暴力破解密码

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2     // 使用java图形界面技术绘制一张图片
 3
 4     int charNum = 4;
 5     int width = 30 * 4;
 6     int height = 30;
 7
 8     // 1. 创建一张内存图片
 9     BufferedImage bufferedImage = new BufferedImage(width, height,
10             BufferedImage.TYPE_INT_RGB);
11
12     // 2.获得绘图对象
13     Graphics graphics = bufferedImage.getGraphics();
14
15     // 3、绘制背景颜色
16     graphics.setColor(Color.YELLOW);
17     graphics.fillRect(0, 0, width, height);
18
19     // 4、绘制图片边框
20     graphics.setColor(Color.BLUE);
21     graphics.drawRect(0, 0, width - 1, height - 1);
22
23     // 5、输出验证码内容
24     graphics.setColor(Color.RED);
25     graphics.setFont(new Font("宋体", Font.BOLD, 20));
26
27     // 随机输出4个字符
28     Graphics2D graphics2d = (Graphics2D) graphics;
29      String s = "ABCDEFGHIGKLMNOPQRSTUVWXYZ01234567890";
30     Random random = new Random();
31
32     String msg="";
33     int x = 5;
34     for (int i = 0; i < 4; i++) {
35         int index = random.nextInt(26);
36         String content = String.valueOf(s.charAt(index));
37         msg+=content;
38         double theta = random.nextInt(45) * Math.PI / 180;
39         graphics2d.rotate(theta, x, 18);
40         graphics2d.drawString(content, x, 18);
41         graphics2d.rotate(-theta, x, 18);
42         x += 30;
43     }
44
45     // 6、绘制干扰线
46     graphics.setColor(Color.GRAY);
47     for (int i = 0; i < 5; i++) {
48         int x1 = random.nextInt(width);
49         int x2 = random.nextInt(width);
50
51         int y1 = random.nextInt(height);
52         int y2 = random.nextInt(height);
53         graphics.drawLine(x1, y1, x2, y2);
54     }
55
56     // 释放资源
57     graphics.dispose();
58
59     // 图片输出 ImageIO
60     ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
61
62
63 }

验证码模版

3,Request
    请求.若想获取请求信息,找我就可以了
    请求的格式:
        请求行 请求头 请求体
    (1)api简介
        a,请求行
            格式:请求方式 资源路径 协议/版本
            例如:GET /augmentum/1.html HTTP/1.1
            常用方法:
                getMethod()
                getRequestURI()
                getProtocol()
                getQueryString()
       b, 请求头
            格式:
                key:name1[,name2]
            常用方法:
                String getHeader(key)
                Enumeration getHeaders(key)
                Enumeration getHeaderNames();
               
                getIntHeaders(key)
       c, 请求体
            只有post才有请求体,存放就是post请求的参数
            例如 username=tom&password=123&hobby=eat&hobby=sleep
            常用方法:
                String getParameter(key)
                Enumeration getParameterNames()
                Map<String,String[]> getParameterMap();
                String[] getParameterValues(key);
           
    (2)api详解
        a,请求行:
            常用方法:
                getMethod():获取请求的方式
                getRequestURI():获取的从项目名开始到请求参数参数之前(?)
                getProtocol():获取协议和版本
                getQueryString():以字符串的形式获取请求参数
                结果:   
                    GET
                    /augmentum/row
                    HTTP/1.1
                    login=tom&password=123

GET /augmentum/form.html HTTP/1.
            常见的请求方式:post和get
                区别:
                  1.get请求的参数会出现在地址栏上,post不会,post相对安全
                  2.get请求参数的大小有限制,post理论上没有.
                  3.只有post有请求体.
            获取用户信息:
                getRemoteAddr():获取用户ip
                getRequestURL():获取请求路径(带协议的路径 URL)
                getContextPath():获取项目名
                结果:
                    192.168.40.1xx
                    http://192.168.40.97/augmentum/row
                    /augmentum

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2     /*//获取请求方式
 3     String method = request.getMethod();
 4     System.out.println(method);
 5     //获取请求资源路径
 6     String uri = request.getRequestURI();
 7     System.out.println(uri);
 8     //获取协议版本
 9     String pro = request.getProtocol();
10     System.out.println(pro);
11     //获取get请求的请求参数
12     String s = request.getQueryString();
13     System.out.println(s);*/
14
15     //获取用户ip
16     String addr = request.getRemoteAddr();
17     System.out.println(addr);
18     //获取请求路径
19     String url = request.getRequestURL().toString();
20     System.out.println(url);
21     //获取项目名
22     String contextPath = request.getContextPath();
23     System.out.println(contextPath);
24 }

b,请求头:
            格式:
                key:name1[,name2]
            常用方法:
                String getHeader(key):获取指定的头信息
                int getIntHeader(key):
                long getDateHeader(key):
                Enumeration getHeaders(key):以Enumeration形式获取指定头的信息
                Enumeration getHeaderNames();返回所有的请求头的名称
            防盗链
                使用的 referer请求头

    String referer = request.getHeader("referer");
    if (referer==null) {
        System.out.println("地址栏来的 可以访问");
    }else if(referer.startsWith("http://localhost/augmentum")){
        System.out.println("站内访问");
    }else{
        System.out.println("站外访问");
    }
}

c,请求体:
            只有post请求才有,用来存放请求参数.
            get请求和post通用的方法:
            获取用户参数:
                String getParameter(key):获取指定的参数信息
                String[] getParameterValues(key):以string[]的格式返回指定的参数信息
               
                Map<String,String[]> getParameterMap();以map的形式返回所有的参数
                Enumeration getParameterNames();以Enumeration形式返回所有的参数名称
               
                例如:
                    姓名:tom
                    爱好:[drink, sleep]
                    ----------------------
                    username:[tom]
                    password:[1234]
                    hobby:[drink, sleep]
                    ----------------------
                    username:[tom]
                    password:[1234]
                    hobby:[drink, sleep]

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取姓名
    String username = request.getParameter("username");
    System.out.println("姓名:"+username);
    //获取爱好
    String[] hobby=request.getParameterValues("hobby");
    System.out.println("爱好:"+Arrays.toString(hobby));
    //获取所有
    System.out.println("----------------------");
    Map<String,String[]> map=request.getParameterMap();
    for (String name : map.keySet()) {
        System.out.println(name+":"+Arrays.toString(map.get(name)));
    }
    System.out.println("----------------------");
    //获取所有的参数名称
    Enumeration<String> params = request.getParameterNames();
    while(params.hasMoreElements()){

        String name = params.nextElement();
        System.out.println(name+":"+Arrays.toString(request.getParameterValues(name)));
    }
}

d,域对象:
            request:
                一次请求中,响应之前.
                请求串,请求链
                request.getRequestDispatcher("转发路径").forward(request,response)
                服务器内部跳转
                客户端的路径:   /工程名/编写的路径
                服务器的内部路径:   /编写的路径
            常用方法:
                xxxAttribute()
                setAttribute(String,Object);
                Object getAttribute(String)
                removeAttribute()

请求转发与重定向的区别
       1.请求转发是服务器内部跳转,地址栏不会发生改变
        重定向地址栏会发生改变。

        2.请求转发,只有一次请求,一次响应.
        重定向,有两次请求,两次响应。

        3.请求转发存在request域,可以共享数据.
        重定向不存在request域。

        4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。
        重定向可以访问站外资源,也可以访问站内资源.

        5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()
        重定向是由response 发起的  response.sendRedirect();

        6.请求转发与重定向时路径写法不一样.
        重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源
        请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源
可用如下图来表示:

请求的中文乱码:
    浏览器地址栏使用utf-8编码
    tomcat7使用的iso8859-1编码
   
    参数使用utf-8编码,tomcat使用iso-8859-1进行解码出现了乱码.
    解决的思路:
        把接受的参数先iso-8859-1编码,然后使用utf-8进行解码
        对于post请求和get请求可以通过
            new String(name.getBytes("iso8859-1"),"utf-8");
        对于post请求还可以使用
            request.setCharacterEncoding("utf-8");
       
        乱码解决过程       
        String s="赵四";
        String s1=URLEncoder.encode(s,"utf-8");
        String s2=URLDecoder.decode(s1, "iso8859-1");
        System.out.println(s2);
       
        //先使用iso8859-1编码
        String s3 = URLEncoder.encode(s2, "iso8859-1");
        //使用utf-8解码
        String s4 = URLDecoder.decode(s3, "utf-8");
        System.out.println(s4);

时间: 2024-10-16 04:28:33

[Java拾遗四]JavaWeb基础之Servlet_Request&&Response的相关文章

[Java拾遗三]JavaWeb基础之Servlet

Servlet    1,servlet介绍        servlet是一项动态web资源开发技术.        运行在服务器端.        作用:处理业务逻辑,生成动态的内容,返回给浏览器.        本质就是一个类     servlet的入门        1.编写servlet(类)--- 继承HttpServlet        2.编写关系--- web.xml(在WEB-INF下)        3.访问:            路径:http://localhost

[Java面试三]JavaWeb基础知识总结.

1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. • 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同. l 静态web资源开发技术 • Html l 常用动态web资源开发技术: • JSP/Servlet.ASP

JavaWeb基础: 学习大纲

JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb基础:Servlet JavaWeb基础:Servlet Request JavaWeb基础:Servlet Response JavaWeb基础: Cookie

《Thinking In Java第四版》拾遗

<Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC%AC%E5%9B%9B%E7%89%88-%E6%8B%BE%E9%81%97) 近日重读了<Thinking In Java第四版>(可能版本比较老),发现一些有趣的和值得注意的地方,在此作个记录. 返回值过载 不能用返回值对函数进行overload,因为有可能调用方并不关心返回值,这就造成了

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过

javaweb基础(6)_servlet配置参数

一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet.study.ServletConfigDemo1<

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons

2015年33期Java/Spring/Struts2/web/基础/就业班视频

一.基础班课程(掌握Java核心课程) 日期        星期        课程(空内容表示放假)        上课老师2014/12/8        星期一        [开学典礼].Java开发前奏        钟太潋2014/12/9        星期二        Java语言基础        钟太潋2014/12/10        星期三                2014/12/11        星期四        Java语言基础        钟太潋2

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons