JavaWeb学习笔记(一)【Javaweb应用概念 | Servlet】

208 阅读6分钟

JavaWeb应用的概念

  • 由一组 Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。
  • Java Web应用中可以包含如下内容
    • Servlet
    • JSP
    • 实用类
    • 静态文档如HTML、图片等
    • 描述Web应用的信息( web. xml)

Servlet与Servlet容器

Servlet容器

  • Servlet容器为 JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。
  • Servlet容器也称为JavaWeb应用容器,或者Servlet / JSP容器
  • 目前最流行的 Servlet容器软件括
    • Tomcat(流行)Apache旗下
    • Resin
    • J2EE服务器(如 Weblogic)中也提供了内置的 Servlet容器

Servlet简介

  • Java Servlet 是和平台无关的服务器端组件,它运行在 Servlet容器中。
  • Servlet容器负责 Servlet 和客户的通信以及调用 Servlet 的方法,Servlet和客户的通信采用” 请求 / 响应" 的模式。
  • Servlet可完成如下功能:
    • 创建并返回基于客户请求的动态HTML页面
    • 创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
    • 与其它服务器资源 (如数据库或基于Java的应用程序)进行通信。

1 开发动态的 WEB 工程

环境:Eclipse(JavaEE)( JavaWEB项目)

  • 把开发选项切换到 JavaEE
  • 可以在 Window-> Show View中找到 Package Explorer,并把其拖拽到开发区的左边
  • 在 Servers面板中新建 Tomcat服务器.一定要关联到 Tomcat安装的根日录
  • 新建一个 Dynamic Web Project,其中 Target Runtime需选择 Tomcat...
  • 开发 Java WEB 应用
  • 可以通过 run on server 来运行 WEB 项目,

2 Servlet 的 HelloWorld

  • 创建一个 Servlet接囗的实现类 public class Helloservlet implements servlet
  • 在web,xm1文件中配置和映射这个 Servlet
<!--配置和映射 Servlet-->
<servlet>
    <!-- Servlet注册的名字-->
    <servlet-name>helloservlet</servlet-name>
    <!--5 servlet的全类名-->
    <servlet-class>com.atguigu.javaweb.Helloservlet</servlet-class>
</servlet>
<servlet-mapping>
    <!--需要和某一个 servlet节点的 serlvet-name子节点的文本节点一致-->
    <servlet-name>helloservlet</servlet-name>
    !--映射具体的访问路径:/代表当前WEB应用的根目录
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

3 Servlet 容器:

运行Servlet,JSP,Filter 等的软件环境。

  • 可以来创建 Servlet, 并调用 Servlet 的相关周期方法
  • JSP,Filter,Listener,Tag ...

4 Servlet 生命周期方法:

以下方法都是由 Servlet 容器负责调用

  • 构造器:只被调用一次
  • init方法:只被调用一次,在创建好实例后立刻被调用,用于初始化当前 Servlet。
  • service:被多次调用,每次请求都会调用 service 方法,实际用于响应请求
  • destroy:只被调用一次,在当前 servlet 所在的 WEB 应用被卸载前调用,用于释放 Servlet 所占用的资源

5 load-on-startup 参数:

  • 配置 Servlet 节点中:
  <servlet>
      <!-- Servlet注册的名字 -->
      <servlet-name>helloServlet</servlet-name>
      <!-- Servlet的全类名 -->
      <servlet-class>com.suen.javaweb.HelloServlet</servlet-class>
      <!-- 可以指定Servlet被创建的时机 -->
      <load-on-startup>1</load-on-startup>
  </servlet>
  • load-on-startup: 可以指定 Servlet 被创建的时间, 若为负数,则在第一次请求时被创建, 若为0或正数,Servlet 容器加载时创建实例,且数值越小被越早创建。

6 Servlet 的注册与运行

  • Servlet 程序必须通过 Servlet 容器来启动运行,并且储存目录有特殊要求,通需要存储在 <WEB应用程序目录>\WEB-INF\classes 目录中

  • Servlet 程序必须在 WEB应用程序的 web. xml 文件中进行注册和映射其访问路径,才可以被 Servlet 引擎加载和被外界访问。

  • 一个元素用于注册一个 Servlet,它包含有两个主要的子元素:

    <servlet-name> 设置 Servlet 的注册名称

    <servlet-class> Servlet 的完整类名

  • 一个元素用于映射一个已注册的Servlet 的一个对外访问路径,它包含有两个子元素:

    <servlet-name> 指定Sere的注册名称

    <url-pattern> Servet的对外访问路径

细节:

  • 同一个 Servlet 可以被映射到多个URL上,即多个 <servlet-mappIng> 元素的 <servlet-name> 子元素的设置值可以是同个 Servlet 的注册名。
  • 在 Servlet 映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“扩展名”,另一种格式是以正斜杠(/)开头并以“/”结尾。
<servlet-mapping>
    <servlet-name>AnyName</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>AnyName</servlet-name>
    <url-pattern>/action/</url-pattern>
</servlet-mapping>

7 ServletConfig:

封装了 Servlet 的配置信息,并且可以获取 ServletContext 对象

  • 获取 Servlet 的初始化配置
<!-- 配置 Servlet 的初始化参数,且该节点必须在load-on-startup 节点的前面 -->
<init-param>
    <!-- 参数名 -->
    <param-name>user</param-name>
    <!-- 参数值 -->
    <param-value>root</param-value>
</init-param>
  • 获取初始化参数:

    getInitParameter(Sting name):获取指定参数名的初始化参数 getInitParameterNames():获取参数名组成的 Enumeration 对象

  • 获取 Servlet 的配置名称(了解)

8 ServletContext

  • 可以由 ServletConfig 获取
  • 该对象代表当前 WEB 应用:可以认为 ServletContext 是当前应用的一个大管家,可以从中获取当前 WEB 应用的各方面的信息

①. 获取当前 WEB 应用的初始化参数

设置初始化参数

<!-- 配置当前 WEB 应用的初始化参数 -->
<context-param>
    <param-name>driver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
</context-param>

方法:

getInitParamter getInitParamterNames

ServletContext servletContext = servletConfig.getServletContext();
System.out.println("driver" + driver);

Enumeration<String> names = servletContext.getInitContext.getInitParameterNames();
while (names.hasMoreElements()) {
    String name = names.nextElement();
    System.out.println("-->" + name);
}

②. 获取当前 WEB 应用的某一个文件的绝对路径

getRealPath(String path);

代码:

String realPath =  servletContext.getRealPath("/note.txt" );

③. 获取当前 WEB 的应用名称

getContextPath();

代码:

String contextPath = servletContext.getContextPath(); 

④. 获取当前 WEB 应用的某一个文件对应的输入流

getResourceAsStream(String path) : path 的 / 为当前 WEB 应用的根目录

代码:

InputStream is = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");

9 如何在 Servlet 中获取请求信息

  • Servlet 的 service() 方法用于应答请求:因为每次调用都会调用 service() 方法
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException

ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。 ServletResponse:封装了相应信息,如果想给用户什么相应,具体何以使用该接口的方法实现

这两个接口的实现类都是服务器给予实现的,并在服务器调用 Service 方法是传入的**

ServletRequest

  • 获取请求参数:

    String getParameter(String name):根据请求参数的名字,返回参数值

    若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值

    String[] getParameterValues(String name):根据请求参数的名字,返回请求参数对应的字符串数组

    Enumration getParameterNames():返回参数名对应的 Enumeration 对象,类似于 ServletConfig(或ServletContext)的 getInitParamterNames()

    Map getParameterMap():返回请求参数的键值对:key 参数名, value:参数值,String[]。

  • 获取请求的URL:

    httpServletRequest.getRequestURI()

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String requestURL = httpServletRequest.getRequestURI();
    System.out.println(requestURL);
    

    HttpServletRequest:是ServletRequest的子接口,针对于HTTP请求所定义,里面包含了大量获取HTTP请求相关的方法

  • 获取请求方式:

    String method = httpServletRequest.getMethod();
    System.out.println(method);
    
  • 获取 GET 请求 参数对应的那个字符串, 即 “ ?” 后面的字符串(POST为null)

  • 和 attribute 相关的几个方法

ServletResponse

getWeiter():返回PrintWriter对象,调用该对象的print()方法,将把print中的参数直接打印到客户的浏览器上。

设置响应的内容类型:response.setContentType()

void sendRedirect(String location):请求的重定向(此方法为HttpServletResponse 定义,需要强转)

GenericServlet

  1. 是一个Servlet,是Servlet 接口和ServletConfig 接口的实现类,且是一个抽象类,其中的service 方法为抽象方法
  2. 如果是新建的 Servlet 程序直接继承 GenericServlet 会使开发更简洁
  3. 具体实现 0. 在GenericServlet 中声明了一个 ServletConfig 类型的成员变量,在init(ServletConfig) 对其进行了初始化 0. 利用servletConfig 成员变量的方法实现了 ServletConfig

HttpServlet

  1. 是一个serv1et,继承自 GenericServlet, 针对于 HTTP 协议所定制
  2. 在 service()方法中直接把 ServletReuqest和 ServletResponse 转为 HttpservletrequesT和 Httpservletrespol 并调用了重载的 service ( HttpservletReuest, HttpservletResponse)
  3. 在 service( Httpservletrequest, Httpservletresponse)获取了请求方式; request. getMethod().根据请求方式有创建了 doXxx() 方法 (XXX为具体的请求方式,比如doGet, doPost)

浅谈请求的转发和重定向:

本质区别:

请求的转发请求的重定向
请求次数一次请求两次请求
地址栏是初次发出请求的地址不再是初次发出的请求地址,地址栏为最后响应的那个地址
Servlet中的request对象和中转的那个 request是同一个对象在最终的servlet中, request对象和中转的那个 request不是同一个对象,