关于前端:Servlet

40次阅读

共计 5240 个字符,预计需要花费 14 分钟才能阅读完成。

Servlet

一、什么是 Servlet

Servlet 是由 SUN 公司提供的一门动静 Web 资源开发技术(标准, 接口)

动态 Web 资源: 不同的人去拜访看到的成果都是雷同的
    HTML/css/js 等
动静 Web 资源: 在不同的条件下看到的是不同的成果
    Servlet/JSP/.NET/PHP 等

Servlet 是实质上是一个 Java 程序, 但和咱们之前接触的 Java 程序不同的是,
Servlet 无奈独立运行(Servlet 中没有 main 函数)
须要将 Servlet 程序放在服务器中, 由服务器调用才能够执行!

运行在服务器中的 Servlet 程序作用是: 对服务器接管的申请进行解决(解决申请)

二、开发 Servlet 程序
1、开发 Servlet 程序的步骤

1)写一个类, 须要实现一个 Servlet 接口或者继承 Servlet 接口的子类
    Servlet
      |-- GenericServlet 实现了 Servlet 接口, 并实现了其中的办法
                  |-- HttpServlet 继承了 GenericServlet, 也实现了其中的办法
    在开发时, 咱们只须要继承 HttpServlet, 并继承其中的办法即可!

2)在 web.xml 文件中配置 Servlet 对外拜访的门路, 再将 Web 利用公布到服务器即可!

2、通过 Eclipse 创立一个 Web 利用

注意事项:
1)Dynamic Web Version: 抉择 2.5 版本, 因为 2.5 版本之后是通过注解配置 Servlet,
    注解配置 Servlet 是变简略了, 然而不好了解, 因而咱们抉择 2.5 版本,
    应用 xml 配置 Servlet(xml 配置 Servlet 的信息不必咱们手写, 会主动生成!)    

2)Web 我的项目举荐应用 Package Explorer 关上, 不要应用 Project Explorer!!

3)Web 我的项目在 Eclipse 中的目录构造
    CGB-Servlet-01(We 我的项目)
        |-- src: 其中用于寄存 java 源文件(xx.java), 也能够放配置文件(xml/properties)
        |-- build/classes: src 源码目录中的货色通过编译后, 会放到 classes 目录下
        |-- WebContent: 是 Web 利用的根目录, 其中能够寄存动态 Web 资源文件、编译后的 class 文件、Web 利用所依赖的 jar 包、web.xml 文件等
                |-- WEB-INF
                      |-- lib: Web 利用所依赖的 jar 包
                      |-- web.xml: web 利用的外围配置文件(配置 Servlet 等)

2、运行 Servlet 程序

第一种运行形式: 
    间接在要运行的文件 (html/jsp/servlet 等) 上 --> 右键 -->Run as-->Run On Server,
eclipse 会帮咱们做如下几件事儿:
1)将 Servlet 所在的 Web 我的项目 (CGB-Servlet-01) 公布到服务器中
2)再启动 tomcat 服务器
3)最初关上浏览器, 在地址栏输出门路去拜访这个 Servlet
Eclipse 默认用内置浏览器去拜访 Servlet, 然而这个内置浏览器有 bug, 最好是应用本地的浏览器去测试!

第二种运行形式: 能够本人手动将我的项目公布到服务器、启动服务器、关上浏览器输出地址进行拜访!

3、Servlet 在 web.xml 文件中的配置

全限定类名(全类名): 包名. 类名 或者 包名. 接口名 
<servlet>    
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.tedu.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
1)每创立一个 Servlet,eclipse 会帮咱们生成至多 8 行配置信息
    这 8 行配置信息由一个 Servlet 标签和一个 servlet-mapping 标签组成
    这两个标签中的 <servlet-name> 标签中的内容统一, 决定了它俩是一组配置
2)<servlet-class> 标签中配置的以后 Servlet 类的全类名(包名. 类名)
    未来服务器依据拜访门路找到这个全类名, 再利用反射 + 全类名能够获取以后 Servlet 类的实例    
3)<url-pattern> 标签中配置了外界该通过什么门路来拜访以后 Servlet。也就是说,这里配置什么门路,外界就得通过什么门路来拜访这个 Servlet!注意事项 1: Servlet 在 Web.xml 文件中的配置信息是在创立 Servlet 时,Eclipse 帮咱们生成的
    如果 Servlet 不是通过 Eclipse 创立(比方是复制过去的),Eclipse 不会生成 Servlet
    配置信息, Servlet 没有配置信息是无法访问的(应用注解开发除外)!

注意事项 2: 如果不晓得什么起因,tomcat 服务器启动失败了, 能够将 Eclipse 创立的 Server 删除,
    再从新创立一份(删除 Server 同时, 也将左侧的 Servers 我的项目从工作空间中删除!)

注意事项 3: 在将 tomcat 和 Eclipse 整合之后,tomcat 默认开启了热部署性能:
    在批改了代码后, 不必从新公布, 也不须要重启服务器, 就能够运行最新的成果!
    (如果是创立了新的 Servlet 类, 或者批改了 web.xml 文件, 则须要重启服务器, 才会失效!)

4、创立 Servlet3.0 或以上版本的我的项目

在 Servlet3.0 的我的项目中, 没有 web.xml 文件, 无奈通过 xml 文件配置 Servlet 信息
而是通过注解形式配置 Servlet 相干信息

@WebServlet("/SecondServlet")
public class SecondServlet extends HttpServlet{}

在 @WebServlet 这个注解内容所配置的内容就是(xml 形式)url-pattern 中配置的拜访门路
另外服务器通过扫描注解定位到以后这个 Servlet, 获取该类的全门路,
通过全门路从硬盘上加载这个类到内存中, 获取该类的字节码对象, 再利用反射 + 字节码对象创立该类的实例!

5、如何配置 eclipse 在右键 –>run as 运行一个 Web 资源之后, 用本地的浏览器拜访测试

点击 Window --> Web Browser --> 如果右侧有 Chrome 或者 Firefox 抉择其中的一个
如果没有 chrome 或者 firefox, 能够抉择 Default System..., 即零碎默认浏览器

Request

一、Request 和 Response 介绍

当浏览器向服务器发申请,服务器在调用 Servlet 的 service 办法解决申请之前,会创立代表申请的 Request 对象,和代表响应的 Response 对象。将这两个对象传递给 service 办法,在 service 办法解决申请的过程中,如果要获取申请信息,能够通过 request 提供的办法进行获取;如果要向浏览器响应数据,能够将数据先写入到 response 缓冲区,等 service 办法执行完结,服务器会主动到 response 对象中获取到要发送给浏览器的数据,依照 Http 协定的格局将数据发送给浏览器。

二、Request 罕用性能
1、获取申请参数
1.1. 什么是申请参数?

所谓的申请参数就是浏览器在发送申请时, 带给服务器的数据。例如:在地址栏 URL 地址的前面能够通过问号拼接参数,将数据带给服务器
    http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu
也能够通过表单, 将数据写入表单项中, 通过提交表单将数据带给服务器
无论通过哪种形式带参数给服务器, 参数都能够有多个, 多个参数之间用 & 分隔, 每一个参数都蕴含参数名和参数值

1.2. 如何获取申请参数?

http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu
1)request.getParameter(String paramName) -- 返回 String 字符串
-- 通过申请参数的名字, 获取对应的参数值。比方传入 "user", 返回 "zhangsan"
-- 如果获取的参数有多个值, 该办法只会返回第一个值, 比方传入 "like", 只返回一个 "lanqiu"
-- 如果获取的参数是不存在的, 该办法会返回 null, 比方传入 "uesr", 此时会返回 null 值

2)request.getParameterValues(String paramName) -- 返回 String[]数组
-- 通过申请参数的名字, 获取对应的所有参数值组成的数组。比方传入 "like", 返回
    {"lanqiu", "zuqiu"}
-- 如果获取的参数值只有一个, 该办法依然返回一个数组, 比方传入 "user", 返回 {"zhangsan"}
--  如果获取的参数是不存在的, 该办法会返回 null, 比方传入 "uesr", 此时会返回 null 值

1.3. 如何解决在获取申请参数时呈现的中文乱码问题?

GET 提交参数是通过 URL 地址前面拼接参数, 将参数提交给服务器
POST 提交参数是通过申请实体将参数提交给服务器
服务器在接管 GET 提交的参数时, 默认应用 UTF- 8 来进行接管(浏览器提交参数用的也是 utf-8), 因而获取 GET 提交的参数没有问题。但服务器在接管 POST 提交的参数时,默认应用 iso8859- 1 来进行接管, 而这个编码中没有中文字符, 因而在接管中文数据时, 会呈现乱码问题。解决办法是:告诉服务器接管 POST 提交的参数时,也通过 utf- 8 来进行接管
    request.setCharacterEncoding("utf-8");
留神: 这行代码要放在获取参数的代码之前执行!
    这行代码只对 POST 提交失效,GET 比拟不受任何影响!

2、实现申请转发

所谓的申请转发是服务器外部资源之间的跳转形式(从一个资源跳转到另外一个资源)
申请转发 (forward) 的特点:
1)转发是一次申请一次响应
2)转发前后地址栏地址不会发生变化
3)转发只能在同一个 Web 利用外部两个资源之间进行跳转
4)在转发的两个资源之间能够利用 request 域 (map) 传递数据

申请转发的实现代码:
    /* 将申请转发到 TestForward2 
     * TestForward2: http://localhost:8080/CGB-Servlet-03/TestForward2
     * 因为服务器会在转发的门路后面主动的拼上我的项目门路, 因而咱们在传门路时, 
     * 只须要传我的项目门路前面的门路, 我的项目门路及之前的门路不传
     */
    request.getRequestDispatcher("/TestForward2")
                .forward(request, response);

3、作为域对象应用(须要配合转发)

在申请转发时, 会将 request 对象传递给所转发的资源(A-- 转发 -->B, 会将 A 中的 request 传递给 B)
能够在转发之前, 往 request 的 map 中存入数据, 再转发, 因为转发时会将 request 带到所转发的资源
在转发的资源中, 能够通过 request 将 map 中携带的数据再取出来!

在 ServletA 中, 往 request 的 map 中存入数据:
    request.setAttribute(String name, Object value);
    // 将申请转发到 ServletB
    request.getRequestDispatcher("ServletB 的门路").forward(req,res);
在 ServletB 中, 能够通过 request 将 map 中的数据取出来:
    request.getAttribute(String name);

Response

1、实现申请重定向

申请重定向 (Redirect) 的特点:
1)重定向是两次申请两次响应
2)重定向前后地址栏地址会发生变化
3)进行重定向的两个资源没有限度, 能够是同一个 Web 利用, 也能够是不同的 Web 利用甚至能够是不同的服务器
4)在重定向的过程中不能够通过 request 的 map 汇合带数据到目的地
实习申请重定向:
    response.sendRedirect("所重定向到资源的地址");

实现定时刷新:
    response.getWriter().write("<h1> 祝贺您注册胜利,5 秒后将会跳转到登录页面...</h1>");
    response.setHeader("Refresh", "5;url=http://localhost:8080/CGB-Servlet-03/login.html");

    定时刷新和重定向的特点简直统一, 惟一区别就是, 重定向 (转发) 都是立刻跳转, 两头没有任何工夫距离, 定时刷新能够指定多少秒之后再进行跳转, 在跳转之前, 能够输入信息提醒用户(例如注册胜利后的提醒: 祝贺您注册胜利,5 秒后将会跳转到登录页面...)
    

正文完
 0