Servlet - 基础篇

简介: Servlet - 基础篇

1.JSP与Servlet的不同

a、JSP在本质上就是SERVLET,但JSP是Servlet的一种简化,JSP由HTML代码和JSP标签构成,可以方便地编写动态网页。

b、Servlet完全是由JAVA程序代码构成流程控制和事务处理。

c、Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。JSP侧重于视图,Servlet主要用于控制逻辑。

2.Servlet 简介

 - Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器。

 - 用Java编写的服务器端程序。

 - 主要功能在于交互式地浏览和修改数据,生成动态Web内容。

3.Servlet 路径问题

<%StringbasePath=request.getScheme()+":"+"//"+request.getServerName()+":"+request.getServerPort()+"/"+request.getServletContext().getContextPath()+"/";
%><formaction="<%=basePath %>LoginServlet"method="post"></form>

Ps:注意:此处的/可以去掉,因为getContextPath()返回值有/。

Servlet 生命周期

i、Servlet生命周期分为三个阶段:

   1、初始化阶段调用init()方法。

   2、响应客户请求阶段调用service()方法,其实。

   3、终止阶段调用destroy()方法。

image.png

Ps:如果项目从Tomcat中移除,才会调用 destroy方法,并不是关闭程序(不会调用destroy方法)。

5.为什么会这样?image.png

Ps:总结:这样写代码是不是很繁琐,所以Servlet主要用于业务逻辑处理,JSP用于展示内容。

6.JSP内置对象和Servlet中类的对应关系image.png7.注解:@WebServlet("/LifeServlet") 相当于

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>cn.java.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/LoginServlet</url-pattern></servlet-mapping>

8.Servlet - service 方法重写问题

9.请求与响应

- 浏览器对服务器的一次访问称之为一次请求,请求用 HttpServletRequest  对象来表示。

 - 服务器给浏览器的一次反馈称之为一次响应,响应用HttpServletResponse对象来表示。

10.ServletContext 与 ServletConfig

 1 Java是一门面向对象的语言,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。

packagecn.java.servlet;
importjava.io.IOException;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet("/Demo1Servlet")
publicclassDemo1ServletextendsHttpServlet {
protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
// 获取代表某一个JavaWeb工程的ServletContext对象// Context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放的数据ServletContextcontext=this.getServletContext();
// 往context域对象中存放数据context.setAttribute("username", "张三");
    }
protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
doGet(request, response);
    }
}
packagecn.java.servlet;
importjava.io.IOException;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet("/Demo2Servlet")
publicclassDemo2ServletextendsHttpServlet {
protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
ServletContextcontext=this.getServletContext();
// 取出key=username所对应的值Objectresult=context.getAttribute("username");
System.out.println(result);
    }
protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
doGet(request, response);
    }
}
Input:localhost:8888/imooc_servlet1/Demo2ServletConsole:张三

2 我们可以在web.xml文件中给某一个Servlet配置一些配置信息,当服务器被启动的时候,这些配置信息就会被封装到某一个ServletConfig对象中去。因此ServletConfig表示的是某一个Servlet的配置文件。

<!--web.xml--><servlet><servlet-name>Demo3Servlet</servlet-name><servlet-class>cn.java.servlet.Demo3Servlet</servlet-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></servlet><servlet-mapping><servlet-name>Demo3Servlet</servlet-name><url-pattern>/Demo3Servlet</url-pattern></servlet-mapping>
packagecn.java.servlet;
importjava.io.IOException;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassDemo3ServletextendsHttpServlet {
protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
// 首先需要获取ServletConfig对象ServletConfigsc=this.getServletConfig();
// 获取sc这个对象中封装的参数信息Stringencoding=sc.getInitParameter("encoding");
System.out.println("encoding="+encoding);
    }
protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
doGet(request, response);
    }
}
Input:localhost:8888/imooc_servlet1/Demo3ServletConsole:encoding=utf-8

 3 总结:ServletContext对象:表示的是整个JavaWeb工程;ServletConfig对象:表示的是某一个Servelt中的配置文件。

11.转发与重定向的区别【★★★★★】

 - 实现转发调用的是HttpServletRequest对象中的方法,实现重定向调用的是HttpServletResponse对象中的方法。

- 转发时浏览器中的url地址栏不会发生改变,重定向时浏览器中的url地址会发生改变。

 - 转发时浏览器只请求一次服务器,重定向时浏览器请求两次服务器。

 - 转发可以通过 request、session、application 传输数据,重定向可以通过 session、application 传输数据。

 - 转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求 ——> web服务器接受此请求 ——> 调用内部的一个方法在容器内部完成请求处理和

转发动作 ——> 将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求 ——> web服务器接受后发送302状态码响应及对应新的location给客户浏览器 ——> 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址 ——> 服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

附:重定向,其实是两次request:

第一次,客户端request A,服务器响应,并 response 回来,告诉浏览器,你应该去B。这个时候浏览器可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。


- 通俗版解释,假设你去办理某个执照...

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

packagecn.java.servlet;
importjava.io.IOException;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
@WebServlet("/Demo4Servlet")
publicclassDemo4ServletextendsHttpServlet {
protectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
// 转发带数据给某个jsp页面// request.setAttribute("username", "王二麻子 ");// request.getRequestDispatcher("/demo.jsp").forward(request, response);// 通过重定向带数据过去ServletContextsc=request.getServletContext();
sc.setAttribute("goods", "娃娃");
response.sendRedirect("/imooc_servlet1/demo.jsp");
    }
protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)
throwsServletException, IOException {
doGet(request, response);
    }
}
<%@pagelanguage="java"contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"><title>转发与重定向获取数据</title></head><body><!--取出Demo4Servlet中传递过来的数据--><%--<%Stringusername= (String)request.getAttribute("username");
out.print(username);
%>--%><%Stringgoods= (String)application.getAttribute("goods");
out.print(goods);
%></body></html>

12.Servlet - 映射多地址实现跳转

13.JavaWeb - JSP、Servlet、Request、Response、Get、Post 中文乱码问题

14.web.xml 中 load-on-startup 标签的含义

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。

i、当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

ii、当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;

iii、非负数的值越小,启动该servlet的优先级越高。

Example:
<servlet><servlet-name>initservlet</servlet-name><servlet-class>com.bb.eoa.util.initServlet</servlet-class><init-param><param-name>log4j-init-file</param-name><param-value>config/log.properties</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

15.不需要servlet处理的配置:default

<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern></servlet-mapping>

16.待更新...

目录
相关文章
|
9天前
|
Java 关系型数据库 MySQL
Servlet 教程 之 Servlet 数据库访问 1
本教程聚焦Servlet数据库访问,需预先了解JDBC。确保配置MySQL驱动,可下载`mysql-connector-java-5.1.39-bin.jar`。在Eclipse Web项目中,需将该jar包放入Tomcat的lib目录。首先创建名为`websites`的表,含站点名称、URL、Alexa排名和国家等字段,然后插入示例数据,包括Google、淘宝、百度等网站的信息。
105 58
|
9天前
|
Java 关系型数据库 MySQL
Servlet 教程 之 Servlet 数据库访问 2
本教程讲解如何在Servlet中实现数据库访问。首先确保了解JDBC并配置MySQL驱动(如mysql-connector-java-5.1.39-bin.jar),在Eclipse Web项目中需将驱动放入Tomcat的lib目录。创建名为`websites`的数据库表,插入测试数据。之后展示了一个Servlet示例,该示例连接到数据库,执行SQL查询以获取`websites`表中的`id`、`name`和`url`,并将结果输出到HTML响应中。要运行Servlet,需在web.xml中配置并访问指定URL。
12 4
|
25天前
|
Java 容器
Servlet 教程 之 Servlet 生命周期 6
Servlet生命周期包括初始化(init())、处理请求(service())和销毁(destroy())。当首个请求到达时,容器加载Servlet并调用init()。之后,多个线程共享同一Servlet实例,每个线程独立调用service()处理请求。最后,销毁前调用destroy(),实例由JVM回收。
16 2
|
25天前
|
Java
Servlet 教程 之 Servlet 生命周期 4
Servlet生命周期包括初始化、服务和销毁三个阶段:init()方法在创建时调用,service()方法处理客户端请求,destroy()方法在销毁前执行。对于POST请求,doPost()方法处理HTML表单数据。当Servlet不再使用时,由JVM的垃圾回收器自动清理。
25 5
|
25天前
|
Java 数据库连接
Servlet 教程 之 Servlet 生命周期 5
Servlet生命周期包括初始化(init())、服务(service())和销毁(destroy())三个阶段。destroy()方法在Servlet即将销毁时执行,用于资源释放和清理工作,如关闭数据库连接。之后,Servlet对象等待垃圾回收。
20 4
|
26天前
|
Java
Servlet 教程 之 Servlet 生命周期 1
Servlet生命周期包括初始化、服务和销毁三个阶段:init()方法在Servlet创建时调用,仅初始化一次;service()方法处理客户端请求,每次请求都创建新线程;destroy()方法在Servlet销毁前执行。Servlet实例在首次请求时创建,可通过配置在服务器启动时加载。init()方法用于设置一次性初始化数据。
29 3
|
26天前
|
Java
Servlet 教程 之 Servlet 生命周期 3
Servlet生命周期包括初始化(init())、服务(service())和销毁(destroy())三个阶段。doGet()方法处理GET请求,接收HttpServletRequest和HttpServletResponse参数。当Servlet不再使用时,由JVM的垃圾回收器自动清理。
24 5
|
8月前
|
小程序 Java 应用服务中间件
Servlet技术
Servlet技术
43 0
|
11月前
|
Java API
Servlet的环境及实现Servlet的三种方式
Servlet的环境及实现Servlet的三种方式
120 0
|
12月前
|
Java 应用服务中间件 UED
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)
都2023年了,Servlet还有必要学习吗?一文带你快速了解Servlet(一)
142 0