Tomcat与Java Web开发技术详解

Tomcat

Servlet是Web应用与web服务器进行协作的标准接口,Tomcat(Servlet容器)负责把请求传给相应的Servlet

Servlet从ServletRequest中获取客户的请求信息,利用ServletResponse对象来生成响应结果

一、Servlet接口

Servlet是一个接口定义了5个方法,init、service、destroy和getServletConfig、getServletInfo

GenericServlet抽象类

GenericServlet抽象类为Servlet提供通用实现,只有service方法没有实现,init和destory都是空实现。除了实现Servlet外,还实现了ServletConfig和Serializable接口
两个init方法,一个是init()还有一个是init(ServletConfig config),它会赋值给私有变量ServletConfig和调用init()方法,Servlet还有一个getServletConfig方法,从而就可以调用ServletConfig接口的函数

HttpServlet类

HttpServlet类是GenericServlet的子类,在开发JavaWeb应用的时,自定义的Servlet类一般都扩展HttpServlet类,一般HttpServlet的子类,一般会针对客户端的请求方式,来覆盖HttpServlet父类中的响应doXXX()方法,为了使doXXX()方法能被Servlet容器访问,应该把访问权限设为public。

注意:

一般Servlet容器会调用service(ServletRequest req,ServletResponse res),在这个类中service(ServletRequest req,ServletResponse res)会调用service(HttpServletRequest req,HttpServletResponse resp),在这个函数中会调用doGet(HttpServletRequest req,HttpServletResponse resp)和doPost(HttpServletRequest req,HttpServletResponse resp)方法

ServletRequest接口

ServletRequest类表示来自客户端的请求,当Servlet容器接收到客户端要求访问的特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装成一个ServletRequest对象,当容器调用Servlet对象的service()方法时,就可以把ServletRequest对象作为参数传给service()方法。ServletRequest接口提供了一系列用于读取客户端请求数据的方法:比如getParameter(String name )

HttpServletRequest接口

它提供了用于读取HTTP请求中的相关信息的方法

它是ServletRequest接口的子接口,HttpServlet类的重载service方法以及doGet和doPost等方法都有一个HttpServletRequest类型的参数,它提供了用于读取HTTP请求中的相关信息的方法,比如getContextPath()、getCookies()、getHeader(String name)、getHeaderNames()、getMethod()、getRequestURI()、getQueryString()

ServletResponse接口

在ServletResponse接口中定义了一系列与生成响应结果有关的方法

Servlet通过ServletResponse对象来生成响应结果,当Servlet容器接收到到客户端要求访问特定的Servlet的请求时,容器会创建一个ServletResponse对象,并把它作为参数传给Servlet的Service()方法。 在ServletResponse接口中定义了一系列与生成响应结果有关的方法:

HttpServletResponse接口

HttpServletResponse接口是ServletResponse的子接口,HttpServlet类的重载service()方法以及doGet和doPost等方法都有一个HttpServletResponse类型的参数,有一些函数比如addCookie(Cookie cookie) setStatus(int sc)等

二、ServletConfig接口

当Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息,Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfiug对象作为参数传递给Servlet对象。

三、ServletContext接口

ServletContext是Servlet与Servlet容器之间直接通信的接口,Servlet在启动一个web应用时,会为它创建一个ServletContext对象。每个web应用都有唯一的ServletContext对象,可以把ServletContext对象形象的理解为web应用的总管家,同一个web应用中的所有Servlet对象都共享一个总管家,Servlet对象们可通过这个总管家来访问容器中的各种资源

四、总结:

GenericServlet实现Servlet接口和ServletConfig、Serializable接口,HttpServlet会继承GenericServlet接口
HttpServletRequest继承ServletRequest,它提供了用于读取HTTP请求中的相关信息的方法。HttpServletResponse继承ServletResponse接口, 在ServletResponse接口中定义了一系列与生成响应结果有关的方法。

五、Servlet容器响应客户请求访问特定Servlet的流程:

在这里插入图片描述

六、web.xml

在这里插入图片描述在这里插入图片描述在这里插入图片描述

七、JavaWeb应用必须采用固定的目录结构

为了让Servlet容器能找到JavaWeb应用中的各个组件,Servlet规范规定,JavaWeb应用必须采用固定的目录结构,即每种类型的组件在Web应用中有固定的存放目录。Servlet规范还规定,JavaWeb应用的配置信息存放在WEB-INF/web.xml文件中,Servlet容器从该文件中读取配置信息,在发布某些web组件(如Servlet)时,需要在web.xml文件中添加相应的关于这些web组件的配置信息。
在这里插入图片描述

八、转发和重定向

写的蛮好

1、转发

由服务器端进行的页面跳转
在这里插入图片描述转发的方法
在这里插入图片描述

转发的特点
  • 地址栏不发生变化,显示的是上一个页面的地址
  • 请求次数:只有1次请求
  • 请求域中数据不会丢失

重定向

由浏览器端进行的页面跳转

在这里插入图片描述重定向方法
在这里插入图片描述

重定向特点
  • 地址栏:显示新的地址
  • 请求次数:2次
  • 请求域中的数据会丢失,因为是2次请求

转发和重定向的问题

  • 问:什么时候使用转发,什么时候使用重定向?
    如果要保留请求域中的数据,使用转发,否则使用重定向。
    以后访问数据库,增删改使用重定向,查询使用转发。

  • 问:转发或重定向后续的代码是否还会运行?

    无论转发或重定向后续的代码都会执行

九、读写Cookie(点心)

可以把Cookie和Session理解成客户端与服务端之间共享数据

Cookie指的是客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器送给客户的点心,服务器可以根据Cookie来跟踪客户状态。

Cookie的直观理解

去健身房健身,健身馆首先向来报名的客户发送一张会员卡,会员卡上存储了客户的编号、姓名和照片等信息,以后每次客户到健身馆来健身,先要出示会员卡,健身馆根据会员卡的信息来判断是否允许客户健身。

也就是说,当客户端首次访问服务器时,服务器在客户端存放包含客户的相关信息的Cookie,以后每次客户端访问服务器时,都会在HTTP请求数据中包含Cookie,服务器解析HTZTP请求中的Cookie,就能获取关于客户的信息。

Tomcat中的Cookie

存Cookie

Cookie用javax.servlet.http.Cookie来表示,玫瑰花Cookie对象包含一个Cookie名字和Cookie值。
通过HttpServletResponse的addCookie()方法,把Cookie添加到HTTP响应结果中。
Cookie cookie = new Cookie(“username”,“Tom”);
response.addCookie(cookie);

读取Cookie

如果Servlet想读取来自客户端的Cookie,可以通过Cookie cookies[] = request.getCookies()来获取HTTP请求中的所有的Cookie。

设置 的有效期

setMaxAge(int expiry):设置Cookie有效期

  • expiry>0表示浏览器在客户端硬盘上保存Cookie的时间为expiry秒

  • expiry=0,就指示浏览器删除当前Cookie

  • expiry<0,就指示浏览器不要把Cookie保存到客户端硬盘,Cookie仅存在于浏览器进程中,当浏览器关闭,Cookie也就消失。

    cookie.getMaxAge()获取Cookie的有效期

安全隐患

服务器对客户端进行读写Cookie操作,会给客户端带来安全隐患,服务器可能会向客户端发送包含恶意代码的Cookie数据,此外,服务器可能会根据客户端的Cookie来窃取用户的保密信息,因此出于安全起见,多数浏览器可以设置是否启用Cookie。

Cookie的读取

可以设置Cookie的读取范围,服务端发给客户端的Cookie,默认只能这个服务端读取,其他服务端不可以读取,但是是可以设置让其他服务端读取的。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

十、Session

HTTP会话的使用与管理

当客户访问Web应用时,在许多情况下,Web服务器必须能够跟踪客户的状态,比如有若干客户,以合法的账户登陆到电子邮件系统,然后分别进行收信、写信和发信等一系列操作,在这个过程中,假如某个客户请求查看收件箱,Web服务器必须能够判断发出请求的客户的身份,这样才能返回与这个客户相对应的数据。
Web服务器跟踪客户状态通常有四种方法:
1、在HTML表单中加入隐藏字段,它包含用于跟踪客户状态的数据
2、重写URL,使它包含用于跟踪客户状态的数据
3、用Cookie来传送用于跟踪客户状态的数据
4、使用会话机制

会话简介

在web开发领域,会话机制是用于跟踪客户状态的普遍解决方案,会话指的是在一段时间内,单个客户与Web应用的一连串的交互过程,在一个会话中,客户可能会多次访问Web应用的同一个网页,也有可能访问同一个web应用中的多个网页。
例如在电子邮件应用中,从一个客户登录到电子邮件系统,经过收信、写信和发信等一系列操作,直到最后退出邮件系统,整个过程为一个会话
在这里插入图片描述

Session标识的传递过程

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionI如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个sessionId将在本次响应中返回给客户端保存。

在这里插入图片描述如果一个Web组件支持会话,那就意味着:
当客户请求访问该Web组件时,Servlet容器会自动查找HTTP请求中表示Session ID的Cookie,以及向HTTP响应结果中添加表示Session Id的Cookie。Servlet容器还会创建新的HttpSession对象或者寻找已经存在的与Session ID对应的HttpSession对象

Session的创建(客户端第一次请求获得Session的时候创建)和删除

Session创建
(1). 对于Jsp: 若当前页面为浏览器(客户端)访问web应用的第一个资源页面且Jsp的Page指定的Session属性的值为true。
(2). 对于Servlet: 若当前Servlet为浏览器(客户端)访问web应用的第一个资源时,使用request.getSession()或者request.getSession(true)创建, 有些人不理解,为什么是通过request来获取session,可以这样理解,在获取session时,需要检测请求中是否有session标识,所以需要用request来获取

Session删除
(1). 调用session.invalidate()方法
(2). 卸载web应用程序
(3). 超过了HttpSession的过期时间

Session例子

import javax.servlet.http.HttpSession;
import java.io.IOException;

public class ServletDemo extends javax.servlet.http.HttpServlet {
    HttpSession session;
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

    session = request.getSession();
    String renjie = (String) session.getAttribute("renjie");


    if(renjie==null)
    {
        System.out.println("第一次没得到Session");
        session.setAttribute("renjie","123");

    }
    else
    {
        System.out.println("得到session啦");
        System.out.println(session.getAttribute("renjie"));
    }



}

protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    doPost(request,response);
}

HttpSession接口

在这里插入图片描述在这里插入图片描述

十、JSP

当客户端请求访问jsp文件时,Servlet容器先把它编译成Servlet类,然后调用它的程序代码。

在传统的HTML文件中加入Java程序片段和JSP标记,就构成了JSP文件。
例子:hello.jsp

helloapp hello,<%= request.getParameter("username")%>

hello.jsp中的<%= request.getParameter(“username”)%>采用了JSP的语法,其作用是向网页上输出requst.getParameter(“username”)的返回值。

当Servlet容器接收到客户端的要求访问特定JSP文件的请求时,容器按照以下流出来处理客户请求:
1、查找与JSP文件对应的Servlet,如果已经存在,就调用它的服务方法。
2、如果JSP文件对应的Servlet还不存在,就解析系统中的JSP文件,把它翻译成Servlet源文件,接着把Servlet源文件编译成Servlet类,然后在初始化并运行Servlet。

Tomcat把由JSP生成的Servlet源文件和类文件放在<CATALINA_HOME>/work下。

JSP虽然看上去像HTML文件,但是本质上是Servlet。

JSP语法

在Servlet类中可以通过import导入Java包,而在JSP中,可以通过以下page指令来引入Java包:
<%@ page import=“java.util.Hashtable”%>

在Servlet类中可以通过以下方式设置响应正文的类型
response.setContextType(“text/html;charset=GB2312”);
在JSP中,可以通过以下page指令设置响应正文的类型
<%@ page contextType=“text/html;charset=GB2312”%>

在JSP文件(扩展名为.jsp)中除了可以直接包含HTML文本,还可以包含以下内容:
1、JSP指令
2、JSP声明
3、Java程序片段
4、Java表达式
5、JSP隐含对象

JSP指令

JSP指令(在“<%@”和“%>”内)用来设置和整个JSP网页相关的属性,如网上的编码方式和脚本语言等,JSP指令的一般语法形式为
<%@ 指令名 属性=“值” %>

1、page指令

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2、include指令

JSP可以通过include指令来包含其他文件的内容,被包含的文件可以是JSP文件或HTML文件,include指令的语法为:
<%@ include file=“目标组件的绝对URL或相对URL”%>

在开发网站时候,如果多数网页包含相同的内容,则可以把这部分相同的内容单独放在一个文件中,其他的JSP文件可以通过include指令即可将这个文件包含进来,这样做可以提高代码的重用性,避免重复编码,从而提高开发网站的效率,而且便于维护。

在这里插入图片描述
在这里插入图片描述

JSP声明

JSP声明(在“<%!”和“%>”内)用于声明与JSP对应的Servlet类的成员变量和方法,语法如下:
<%! declaration;(declaration)] …>

例如:

在这里插入图片描述

Java程序片段

JSP文件中,可以在"<%“和”%>"标记间直接嵌入任何有效的Java程序代码。如果在page指令中没有指定method属性,那么这些程序片段默认为与JSP对应的Servlet类的service方法中的代码块。
在这里插入图片描述

Java表达式

Java表达式的标记为"<%="和“%>”,如果在JSP文件的模版文本中使用该标记,那么它能把表达式的值输出到网页上,表达式中的int或者float类型的值都自动专程字符串再进行输出。
在这里插入图片描述

注意

如果hitcount在JSP声明中定义,那么为实例对象,count变量在程序片段中定义,则为局部变量。

隐含对象

Servlet可以自由访问Servlet容器提供的ServletContext、ServletRequest和ServletResponse等对象,在JSP的程序片段中,如何访问这些对象呢,对于JSP程序片段,这些对象称为隐含对象,每个对象都被固定的引用变量引用,JSP不需要做任何变量声明,就可以直接通过固定的引用变量来引用这些对象。下表列出了所有隐含对象的引用变量和类型之间的对应关系。

在这里插入图片描述

请求转发

JSP采用jsp:forward标签来实现请求转发,转发的目标组件可以为HTML文件、JSP文件或者Servlet。jsp:forward的语法是:
<jsp:forward page=“转发的目标组件的绝对URL或者相对URL”/>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值