servlet jsp

  • 知识点

1. Servlet

1.1 Response

1. Http中响应消息格式

       *格式:

                     HTTP/1.1 200 OK

                     Content-Type: text/html;charset=UTF-8

                     Content-Length: 101

                     Date: Wed, 06 Jun 2018 07:08:42 GMT

                     (空行)

                     <html>

                       <head>

                         <title>$Title$</title>

                       </head>

                       <body>

                          hello , response

                       </body>

                     </html>

              1) 响应行

                     1. 组成:协议/版本 响应状态码 状态码描述

                     2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

                            1. 状态码都是3位数字

                            2. 分类:

                                   1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码

                                   2xx:成功。代表:200

                                   3xx:重定向。代表:302(重定向),304(访问缓存)

                                   4xx:客户端错误。

                                          * 代表:

                                                 * 404(请求路径没有对应的资源)

                                                 * 405:请求方式没有对应的doXxx方法

                                   5xx:服务器端错误。代表:500(服务器内部出现异常)

                                  

              2) 响应头:

                     1. 格式:头名称: 值

                     2. 常见的响应头:

                            1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

                            2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据

                                   * 值:

                                          * in-line:默认值,在当前页面内打开

                                          * attachment;filename=xxx:以附件形式打开响应体。文件下载

                     3) 响应空行

                     4) 响应体:传输的数据

2. Response对象

HttpServletResponse继承ServletResponse接口,专门封装HTTP响应消息

3. Response功能

       1) 设置响应行

              1. 格式:HTTP/1.1 200 ok

              2. 设置状态码:setStatus(int sc)

       2) 设置响应头:setHeader(String name, String value)

       3) 设置响应体:

              * 使用步骤:

                     1. 获取输出流

                            * 字符输出流:PrintWriter getWriter()

                            * 字节输出流:ServletOutputStream getOutputStream()

                     2. 使用输出流,将数据输出到客户端浏览器

                            response.getWriter().println(“xxxx”);

       4)设置编码

              response.setContentType("text/html;charset=utf-8");

       5) 简单的重定向方法

              response.sendRedirect("/day15/responseDemo2");

              * 重定向的特点:redirect

                     1. 地址栏发生变化

                     2. 重定向可以访问其他站点(服务器)的资源

                     3. 重定向是两次请求。不能使用request对象来共享数据

              *forward 和  redirect 区别

Forward是服务器内部跳转,两个页面中数据互通,使用同一个request对象,但是地址栏中依然显示第一次请求的url地址,用户感觉不到页面进行了跳转,也只会发送一次请求。

sendRedirect是重定向,两个页面数据不互通,使用的不是同一个request对象,地址栏中显示的是第二个请求的url地址,会发送两次请求

重定向的特点:redirect

       1. 地址栏发生变化

       2. 重定向可以访问其他站点(服务器)的资源

       3. 重定向是两次请求。不能使用request对象来共享数据

转发的特点:forward

       1. 转发地址栏路径不变

       2. 转发只能访问当前服务器下的资源

       3. 转发是一次请求,可以使用request对象来共享数据

演示示例:Response_01

1.2 ServletContext

1. 概念

       代表整个web应用,可以和程序的容器(服务器)来通信

2. 获取

       1. 通过request对象获取        request.getServletContext();   

       2. 通过HttpServlet获取        this.getServletContext();

3. 功能   

       1. 获取MIME类型:       

              * MIME类型:在互联网通信过程中定义的一种文件数据类型

             * 格式: 大类型/小类型   text/html       image/jpeg

        * 获取:String getMimeType(String file)

   

       2. 域对象:共享数据

              1. setAttribute(String name,Object value)

              2. getAttribute(String name)

              3. removeAttribute(String name)

        * ServletContext对象范围:所有用户所有请求的数据

  

       3. 获取文件的真实(服务器)路径       

              1. 方法:String getRealPath(String path)

              String b = context.getRealPath("/b.txt");//web目录下资源访问                              System.out.println(b);               

              String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问                          System.out.println(c);               

              String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问                          System.out.println(a);

演示示例:ServletContext_01

1.3 HttpServlet底层原理

通过生命周期测试,大家发现,真正的Servlet接口中,并没有doGet()和doPost()方法

那么第一个程序中doGet()/doPost()为什么可以执行?

这个问题就发生在HttpServlet类中

HttpServlet中覆写了Servlet中的方法service()方法,并重载添加了一个service()方法,该方法参数为HttpServletRequest和HttpServletResponse

并在原生service()方法中对重载的方法进行调用,然后在重载的service()方法中,根据请求的方式(get/post)去调用doGet()或doPost()方法

所以就把doGet/doPost加入到了Servlet的生命周期中

在技术手册中也有很明白的解释

所以会有这样一个说法,就是service()方法优先级比doGet()和doPost()优先级高,如果servlet中同时覆写了service/doGet/doPost三个方法,那么只会执行service

额...这个也可以这样说吧,毕竟他们不是优先级的问题,如果我们覆写了service(),那么再多态执行的时候便不会去执行父类的方法,所以也就不会再对doGet/doPost方法进行调用的

那么下面我们就简单模拟一下HttpServlet的实现

演示示例:MyHttpServlet

1.4 初始化数据

我们可以在web.xml中准备servlet需要用到的数据

有两种方式,一种是数据只能让某一个servlet使用,需要通过ServletConfig对象获取

Web.xml设置 :

    <servlet>

       <servlet-name>_07_InitParam</servlet-name>

       <servlet-class>com.tledu.zrz.servlet._07_InitParam</servlet-class>

       <!-- 这种参数,只能让当前这一个Servlet去使用,并且获取方式通过ServletConfig对象 -->

       <init-param>

           <param-name>name</param-name>

           <param-value>张三</param-value>

       </init-param>

</servlet>

Java中获取 :

servletConfig.getInitParameter("name");

另一种是数据可以让所有的serlvet使用,需要通过ServletContext对象获取

Web.xml设置 :

    <context-param>

       <param-name>password</param-name>

       <param-value>root</param-value>

</context-param>

Java中获取 :

servletConfig.getServletContext().getInitParameter("password");

演示示例:_07_InitParam

2. JSP

2.1 jsp解决了什么问题

       Servlet中,要想将数据等内容打印到客户端页面中,需要在java代码中拼接大量的html代码,非常的不合理。

       Jsp就是解决这个问题。只需要把数据交给jsp,由jsp来完成数据的展示工作。

2.2 简介

JSP---Java Server Pages

拥有servlet的特性与优点(本身就是一个servlet)

直接在HTML中内嵌JSP代码

JSP程序由JSP 引擎先将它转换成Servlet代码,接着将它编译成类文件载入执行

只有当客户端第一次请求JSP时,才需要将其转换、编译

优点:

优良的性能
       优于CGI,PHP,ASP

平台无关性
       操作系统无关,Web服务器无关

可扩展性
       tag的扩展机制,简化页面开发

2.3 简单语法

<%! %> 表示servlet的类体

<% %> 表示service()方法体

<%= %> 表示 println(); 用于向页面输出内容

演示示例:_01_Hello.jsp和_02_gbColor.jsp

<%@ pager %> 指令,比如导包,嵌套页面等

常用属性

contentType 设置类型和字符编码

contentType=”text/html;charset=UTF-8”

errorPage 定义错误页面,出错的时候发生跳转

errorPage=”xxxx.jsp”  被跳转的页面需要设置isErrorPage属性

isErrorPage 可以设置true/false,表示此页面是否为错误页面

演示示例:_03_errpage.jsp和_03_errtest.jsp

Import 导包, import=”java.util.*”

Language 定义脚本语言,目前只能用java

pageEncoding 设置字符编码 pageEncoding=”UTF-8”

<%@include file=“fileURL%> 静态包含其他页面,两个页面合并为一个页面,只生成一个class文件

与之类似的还有<jsp:include page=“fileURL” flush="true">  动态包含,两个页面生成两个class , 动态调用

*(flush属性,默认为 false,设置为true时,服务器端会做页面缓冲。服务器在解释jsp文件时是一步一步进行的,默认不做缓冲时,解释生成一句html就会发送给客户端一句,做了缓冲后,会一部分一部分的发送,缩短客户端延迟,避免数据泄露造成错误)

静态包含

演示示例:_04_include.jsp和_04_includetest.jsp

动态包含

演示示例:_05_include.jsp和_05_includetest.jsp

<%@ taglib %>  导入别的扩展包,比如 JSTL

2.4 九大内置对象

       内置对象,在jsp中默认内置好的java对象,可以直接使用。在servlet中,一些对象,需要我们手动创建对象,并不能直接使用,比如说session对象。那在jsp中,如何使用session等对象呢。直接用即可。这也是为什么叫内置对象。

       变量名                               真实类型                                          作用

* pageContext                      PageContext                          当前页面共享数据,还可以获取其他八个内置对象

* request                            HttpServletRequest                    一次请求访问的多个资源(转发)

* session                             HttpSession                               一次会话的多个请求间

* application                       ServletContext                           所有用户间共享数据

* response                                 HttpServletResponse                 响应对象

* page                                       Object                                当前页面(Servlet)的对象this

* out                                         JspWriter                            输出对象,数据输出到页面上

* config                                     ServletConfig                      Servlet的配置对象

* exception                                Throwable                                 异常对象

Out : 内置对象是一个缓冲的输出流,用来给客户端返回信息。它是javax.servlet.jsp.JspWriter的一个实例

用于向页面输出内容

常用方法

println():向客户端输出各种类型数据

newLine():输出一个换行符

jsp的newLine()函数只是在组装html代码的时候对html的源代码进行了换行

close():关闭输出流

out.clear()是直接清空缓冲区数据,不输出到客户端且刷新缓存时抛出异常

out.flush()先输出缓冲区数据再清空

out.clearBuffer() 清空缓冲区,不输出到客户端

*缓冲问题:

分析:如果按没有jsp缓存和servlet缓存的话,输出的结果应该是abc,但是输出的却是bac,为什么呢?按照我们上面所说的原理进行分析,out对象是先将其输出到JSP缓存中,所以a加入了jsp缓存,response.getWriter().print("b")是直接将b输出到servlet缓存中,然后又使用out对象将c输出到jsp缓存,到程序结束,servlet缓存中有b,然后jsp会将缓存中的内容就刷新到servlet缓存中,serlvet就是bac了,然后到浏览器也就得到我们的输出结果了。如果将out.flush()注释去掉,答案就是abc。原因是我们手动的将jsp缓存里面的数据刷新到servlet缓存里面了。

Request :内置对象表示的是调用JSP页面的请求。通常,request对象是javax.servlet.http.HttpServletRequest接口的一个实例

常用方法

getMethod():返回客户端向服务器端传送数据的方法

getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration)

getParameterValues(String  name):获得指定参数的所有值,由name指定

getRequestURI():获得发出请求字符串的客户端地址

getRemoteAddr():获取客户端的IP地址

getRemoteHost():获取客户端机器名称

getServerName():获取服务器的名字

getServletName():客户端所请求的脚本文件路径

getServerPort():获取服务器端的端口

getContextPath() 获取当前项目名  /xxx

Response : 表示的是返回给客户端的响应

是javax.servlet.http.HttpServletResponse接口的一个实例

经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP 重定向和编码URL

常用方法:

addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息

addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端

containsHeader(String name):判断指定名字的HTTP文件头是否存在

sendError(int):向客户端发送错误的信息

sendRedirect(String url):重定向JSP文件

和<jsp:forward>的区别

sendRedirect通过客户端发起二次申请,不同的request对象

Jsp:forward是同一个request,在服务器内部转发

setContentType(String contentType):设置MIME类型与编码方式

session和application

<% @page session=“true”%>--表示session功能已经在jsp页面中启动,一次会话

session常用方法:

void setAttribute(String name,Object value)

Object getAttribute(String name)

boolean isNew() 判断是否是新建的session

application

就是ServletContext,全局作用域

Exception : 异常对象,如果有什么异常信息,页面可以使用exception直接获取

config   : ServletConfig  配置对象

pager   : Object  pager =  this , 也是域,代表当前页面有效

可以参考运行jsp之后生成的java文件,在TomCat的work下,所谓内置对象,其实就是在生成的Servlet中service()方法中的局部变量

2.5 jsp实现跳转方式

跳转我们经常用到,不管是页面之间跳转还是页面跳转到java后台,还是在java后台跳转到对应的页面,都经常用到

而跳转方式又被分为两种,Forward和 sendRedirect

Jsp写法

重定向跳转

<%

response.sendRedirect("_06_page.jsp");

后面的代码依旧会执行,和跳转页面用的是同一个request对象

会请求两次,并且地址栏会变成跳转的页面的地址

如果 对页面传值 比如 A.jsp?name=222 在 被跳转页面 request.getParameter 是获取不到数据的

同理  调用request.setAttribute("aa", 11); 方法设置的值,在被跳转页面 依然获取不到

因为 是两次请求,两个request对象,数据不互通

%>

演示示例:_06_page.jsp和_07_sendRedirect.jsp

Forward跳转

<jsp:forward page="/xxx" />

后面代码不会执行,并且和跳转页面不是同一个request对象

只会请求一次,并且地址栏不变

通过地址栏传递值  A.jsp?name=222 在 被跳转页面                request.getParameter 可以获取数据

同理  调用request.setAttribute("aa", 11); 方法设置的值,在被跳转页面 依然能获取到数据

因为 是1次请求,1个request对象,数据互通

演示示例:_06_page.jsp和_08_forward.jsp

总结 : response.sendRedirect 和jsp:forward的区别

1 前者后面代码会执行,后者不会执行

2 前者地址栏会发生变化,显示被跳转页面的路径,后者不变,依旧是请求的页面地址

3 前者是两个request对象,数据不互通,后者是1个对象,数据互通

4 前者需要客户端往返,后者直接在服务器内部跳转

Java写法

sendRedirect :

response.sendRedirect( request.getContextPath() + "/xxx.jsp" );

这里  /  默认定位到 webapps 下,也就是服务器根目录,所需 需要加上项目名进行访问

如果不加 / 就是相对路径,相当于请求的上级

比如 是请求 a/b 到的这个servlet 那么如果直接写 response.sendRedirect("c.jsp" );

就会去找 a/c.jsp

演示示例:_06_page.jsp和_09_sendRedirect.java

运行地址 127.0.0.1:8080/JSP_01/sTj

Forward:

this.getServletConfig().getServletContext()

                     .getRequestDispatcher("/xxx").forward(request, response);

必须加 / ,代表项目根目录(webroot)

并且 跳转后面的代码,会执行,jsp的不会执行,是因为生成servlet的时候,自动加了return,

演示示例:_06_page.jsp和_10_forward.java

运行地址 127.0.0.1:8080/JSP_01/sTjf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值