1.相关概念

HTML

全称 Hyper Text Markup Language超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等,可以统一理解为静态Web资源。

JSP

全称JavaServer Pages动态网页创建标准,部署于网络服务器上,Jsp以Java语言作为脚本,为用户的Http请求提供服务,并且与服务器上的其他Java程序共同处理复杂的业务需求,生成动态HTML。

问题:

用户在访问静态数据(图片,文字...)的时候直接返回静态页面,用户访问在访问动态数据的时候需要连接数据库,进行相应的逻辑处理,拿取用户请求的数据,那么服务器是如何识别处理逻辑的呢?(通过Servlet)
image

Servlet

全称Servlet Applet服务器连接器,用Java语言编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容,狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
image

2.Servlet和JSP区别和联系

1.Web容器将Jsp编译成了jvm能够识别的Servlet(Java类),Jsp的本质是Servlet。
2.Jsp侧重于前端的视图,Servlet侧重于逻辑控制。
3.Servlet没有内置对象。
4.Jsp中的内置对象由HttpServletRequest,HttpServletResponse,HttpServlet对象的到。
image

3.Servlet项目的开发

步骤一:创建Servlet实现Servlet的一个接口或者继承Servlet的子类(GenericServlet/HttpServlet),并实现其方法。

image
image
web工程目录文件的说明
image

(1) Servlet: 工程名称/项目名称
(2) src: 源码目录, 创建的java源文件、配置文件(properties、xml文件等)都可以放在src源码目录下
(3) build/classes: 编译文件的输出目录, src源码目录中的文件编译后会输出到classes目录下。
    其中的classes目录在发布时会放在WEB-INF目录下,随着项目一起发布到服务器中
(4) WebContent: 就是Web应用的目录,其中可以存放 html、css、js、jsp、图片以及编译后的class文件、jar包、web.xml文件等. 将来发布项目到服务器,其实就是将WebContent中的所有内容一起发布到服务器中。
(5) WebContent/WEB-INF/lib: 用于存放当前项目所依赖的jar包。比如要访问mysql数据库,需要导入mysql驱动包,直接将jar包拷贝到lib目录下即可!(也不用再去做 build path --> add to build path)
步骤二:创建Web的访问路径,即配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ServletDemo</display-name>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>MTingCat.pra.ServletDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/ServletDemo</url-pattern>
  </servlet-mapping>
</web-app>

a) Eclipse每创建一个Servlet,就会在web.xml文件中添加两个标签:<servlet>和<servlet-mapping>标签(可以将这两个标签看成一个组的标签)

b) <servlet>和<servlet-mapping>标签内都会有一个<servlet-name>标签,标签的内容可以更改,但要求更改后的这两个<servlet-name>标签的内容也必须一致。

c) <servlet-class>标签用于配置Servlet类的全限定类名(即包名+类名)

需要注意:如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常

d) <url-pattern>标签用于配置浏览器以什么路径访问当前Servlet(即Servlet对外访问的路径),默认的路径是:/类名

例如:上面为HelloServlet配置的<url-pattern>为/HelloServlet,因此我们在浏览器中的访问路径则为:

[http://主机名/web]项目访问路径http://localhost:8089/Servlet/ServletDemo

步骤三:运行于Web端服务器(Tomcat)

image.png
image.png

步骤四:发布

更改默认发布路径【wtpwebapps】改为【webapps 】
image.png

4.Servlet请求方式:请求转发和重定向

4.1 请求转发

请求转发和重定向指的是服务器内部资源的跳转方式,但是资源的跳转方式有所不同。
请求转发指的是浏览器请求服务器资源的时候,服务器上的ServletA接收请求,再将请求转发给ServletB,由ServletB进行业务逻辑的处理,再生成动态页面做出响应。

请求转发特点

image

(1)转发是一次请求,一次响应
(2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器--访问--> A --转发--> B,地址栏地址始终指向A的地址)
(3)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A--转发-->B,A和B必须属于同一个Web应用!)
(4)在转发时,可以带数据到目的地(比如,从A转发到B,可以从A带数据给B,需要配合域对象才可以)
域对象

request在实现转发时,通过request.setAttribute方法和request.getAttribute方法带数据到目的地时,就是通过request对象中的map集合带数据,这个request对象上的map集合以及request对象所在的范围即称之为是一个域对象。

request.setAttribute(String attrName, Object attrValue);
-- 往request域中存入一个域属性,属性名(key)只能是字符串,属性值(value)可以是任意类型。
request.getAttribute(String attrName);
-- 根据属性名(key)获取对应的属性值(value)。返回的是一个Object类型的对象。
域对象的特征
生命周期

从一次请求开始到做出响应:在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。

作用范围

在一次请求范围内,可以通过request域带数据到目的地。

主要功能

和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)

实现
request.getRequestDispatcher(url地址/转发到资源的地址).forward(req, res);

4.2 重定向

重定向指的是浏览器再访问服务器的资源时,不能直接得到想要的数据,而是拿到服务器返回的数据,再一次访问服务器拿到数据。
image

重定向特点
(1)重定向是两次请求、两次响应
(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
(3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。)
(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)
实现
response.sendRedirect(所重定向到资源的URL地址);
总结:请求转发(forward)和重定向(redirect)的区别?
(1)请求转发是一次请求,一次响应; 而重定向是两次请求两次响应
(2)请求转发前后地址栏地址不会发生变化; 而重定向前后地址栏地址会发生变化
(3)请求转发前后的request对象是同一个,可以配合request域对象带数据到目的地; 而重定向前后的request对象不是同一个, 不能结合request域对象在重定向前后带数据.
(4)请求转发要求两个资源必须属于同一个Web应用; 而进行重定向的两个资源可以是同一个Web应用,也可以不是同一个Web应用,甚至可以是来自于不同的主机或服务器.
总结:什么时候用请求转发(forward)?什么时候用重定向(redirect)?
(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址栏地址会发生变化, 只能使用重定向
(2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
(3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响应,可以减少访问服务器的次数,降低服务器的压力)

5. Servlet接收前端请求

案例
package MTingCat.pra;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * author: MTingCat@tedu.cn
 * datetime: 2021年2月1日 下午7:08:02
 */
public class Test01 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unused")
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String user = request.getParameter("user").trim();
        System.out.println(user);
        String[] like = request.getParameterValues("like");
        System.out.println( "like="+Arrays.toString(like));
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
请求
http://localhost:8089/Servlet/Test01?user=MTingCat&like=Baskateball&like=Football
结果

image.png

6. Servlet模板的创建

配置好Servlet的模板之后,每次需要创建时只需要输入servlet,Alt+/就可以。
image

package ${enclosing_package};

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;

/**
 * author: MTingCat@tedu.cn
 * datetime: ${date} ${time}
 */
public class ${primary_type_name} extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Ring1270
1 声望1 粉丝

引用和评论

0 条评论