2021-03-17

Servlet_1

1. 什么是javaweb程序?

   就是通过java和web技术的组合开发出来的应用程序。

   web(全球广域网)

2. 什么是B/S架构的程序?

   B/S----B【浏览器】S【服务器】

   通过浏览器来访问服务器上的程序的这种结构就是B/S架构的程序。

   C/S----C【客户端】S【服务器】

3. B/S架构的程序与C/S架构的程序比较

B/S架构

C/S架构

B【浏览器】S【服务器】

浏览器来访问服务器上的程序

C【客户端】S【服务器】

浏客户端访问服务器上的程序

本地磁盘空间的占用少

本地磁盘空间的占用多

维护成本低,容易维护

维护成本高,不容易维护

现在我们所开发的大部分程序都是基于B/S架构的程序。

4. Web程序发展过程

   早期web程序就是访问静态网页。结果是大家访问的静态网页中的内容不会随着个人需求发生变化。 【固定制式】

   随着人们需求的变化,要求访问的网页中的内容要根据个人的需求而发生变化。

   出现了动态网页技术,解决了要求网页中的内容要根据个人的需求而发生变化的问题。

5. 常见的动态网页技术

  1. CGI[通用网关接口]---动态网页技术【不支持多线程,基于进程】
  2. ASP 、 PHP、Servlet/JSP---动态网页技术 [支持多线程]

  ASP----C#语言

  PHP---PHP的语法

  Servlet/JSP---java语言

6. 什么是Servlet?

用java语言编写的运行在服务器上,处理用户请求做出相应小服务程序

7. 常见的Web服务器

ApacheTomcat   ---  开源

IIS(Internet信息服务)英文Internet Information  Server的缩写  --- 微软

Weblogic  ---  Oracle

WebSphere  --- IBM 

我们选择ApacheTomcat服务器作为我们的Servlet程序的运行服务器。

1.开源,免费

2.完美的支持Servlet/JSP

8. ApacheTomcat服务器的下载、安装、启动、测试、关闭

  ApacheTomcat服务器的下载 https://tomcat.apache.org/

  ApacheTomcat服务器的安装,将下载好的压缩包解压就安装好了。

  

bin---保存了启动/关闭服务器的处理文件。

conf---保存了服务器配置文件【server.xml】。

lib-----保存了Servlet/jsp的开发包。

logs---服务器运行日志目录。

temp---临时文件保存目录

webapps---部署web应用程序的目录。

work---jsp转换/编译之后的java源文件/字节码文件的保存目录。

ApacheTomcat服务器的启动,找到ApacheTomcat服务器的安装目录,进入bin文件夹,双击“startup.bat”,就可以启动服务器。

ApacheTomcat服务器的测试,打开浏览器,在地址栏中输入“http://127.0.0.1:8080/”、“http://localhost:8080/”,“http://192.168.1.200:8080/

  测试地址后面“8080”是tomcat服务器默认的访问端口。

  修改tomcat服务器的访问端口

1. 找到ApacheTomcat服务器的安装目录,进入conf文件夹,打开server.xml文件

2. 修改port属性值

<Connector port="9090" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

3. http://localhost:9090/

ApacheTomcat服务器的关闭,找到ApacheTomcat服务器的安装目录,进入bin文件夹,双击“shutdown.bat”,就可以关闭服务器。

 1. 开发一个简单的Servlet程序部署到服务器上运行

 2.打开Eclipse---file---new---Dynamic Web project

                         ----project----web----Dynamic Web project

2.创建新类,继承HttpServlet类

3.重写doGet/doPost方法

4.doGet方法调用doPost方法

5.doPost方法方法中编写请求处理代码

package com.wangxing.servlet;
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;
public class TestServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		//得到输出流
		PrintWriter out=resp.getWriter();
		out.println("<html>");
		out.println("<head><meta charset=\"utf-8\"><title>Servlet</title></head>");
		out.println("<body><center><center><h1>这是我的第一个Servlet程序</h1></center></body>");
		out.println("</html>");
		out.close();
	}
}

6.在web.xml配置文件中配置Servlet访问路径

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test</url-pattern>
</servlet-mapping>

7.基于Eclipse开发工具部署运行Servlet程序

选中服务器右键Start按钮,就启动了服务器。

打开浏览器访问测试Servlet程序。

http://localhost:8080/TestServlet1/test

8.打包程序成war包,并部署到tomcat服务器上运行。

选中项目右键Export--web---WAR file

将生成好的war包“TestServlet1.war”,复制到tomcat安装目录下的webapps文件夹中。

运行tomcat服务器,找到ApacheTomcat服务器的安装目录,进入bin文件夹,双击“startup.bat”,就可以启动服务器。

打开浏览器访问测试Servlet程序。

http://localhost:8080/TestServlet1/test

Servlet_2

  1. Servlet的生命周期

 Java 中,任何对象都有生命周期,Servlet 也不例外。Servlet 的生命周期如图 1 所示。

Servlet 的生命周期。按照功能的不同,大致可以将 Servlet 的生命周期分为四个阶段,分别是加载实例化阶段、初始化阶段、运行阶段【处理请求】和销毁阶段。

  1. 加载实例化阶段

当Servlet容器启动以后,会加载项目的web.xml配置文件,并解析得到所有配置好的servlet-class中配置的包名+类名,通过反射机制就实例化好了包名+类名对应的Servlet类对象。

  2. 初始化阶段

当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象,如果有,则直接使用该 Servlet 对象,如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作。需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次。

  3. 运行阶段【处理请求】

这是 Servlet 生命周期中最重要的阶段,在这个阶段中,Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法。
service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。
在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是说,service() 方法在 Servlet 的整个生命周期中会被调用多次。

  4. 销毁阶段

当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源。在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次。

需要注意的是,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁。

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class TestServlet2 extends HttpServlet{
	@Override
	public void init() throws ServletException {
		System.out.println("初始化阶段调用 init() 方法实现 Servlet 的初始化工作");
	}
	@Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		System.out.println("运行阶段Servlet 容器都会调用一次 Servlet 的 service() 方法,完成请求处理");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源");
	}
}

Servlet的service方法与doGet/doPost方法的关系

1.service方法与doGet/doPost方法都是HttpServlet类的方法

  1.service(ServletRequest req, ServletResponse resp)---来自于Servlet接口

  2.service(HttpServletRequest req, HttpServletResponse resp)---自己定义的

  3.doGet(HttpServletRequest req, HttpServletResponse resp)----自己定义的

4.doPost(HttpServletRequest req, HttpServletResponse resp)----自己定义的

  在具体处理请求的时候Servlet容器会默认调用来自于Servlet接口的.service(ServletRequest req, ServletResponse resp)方法来出里请求。HttpServlet类中会在用来自于Servlet接口的.service(ServletRequest req, ServletResponse resp)方法中调用HttpServlet自己定义的service(HttpServletRequest req, HttpServletResponse resp),这是处理请求的时候,HttpServlet自己定义的service(HttpServletRequest req, HttpServletResponse resp)就执行了,此时HttpServlet自己定义的service(HttpServletRequest req, HttpServletResponse resp)方法中用过HttpServletRequest 对象得到请求提交方式,判断请求提交方式调用对应的doGet/doPost方法处理请求。

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";
    @Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		HttpServletRequest arg0=(HttpServletRequest)req;
		HttpServletResponse arg1=(HttpServletResponse)resp;
		service(arg0,  arg1); 
	}
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		String method=arg0.getMethod();
		if(method.equals("get")){
			doGet(arg0, arg1);
		}
		if(method.equals("post")){
			doPost(arg0, arg1);
		}
	}
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
   ..........
}

Servlet配置虚拟路径映射

Servlet 的多重映射指同一个 Servlet 可以被映射成多条虚拟路径。也就是说,客户端可以通过多条路径实现对同一个 Servlet 的访问。Servlet 多重映射的实现方式有以下两种。

1)配置多个 <servlet-mapping> 元素

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http://localhost:8080/TestServlet3/test3

http://localhost:8080/TestServlet3/test33

上面这两个不同的路径就可以访问同一个Servlet程序。

2)配置多个 <url-pattern> 子元素

在<servlet-mapping> 元素进行配置,配置多个 <url-pattern>

 <servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http://localhost:8080/TestServlet3/test3

http://localhost:8080/TestServlet3/test33

上面这两个不同的路径就可以访问同一个Servlet程序。

Servlet映射路径中使用通配符

在实际开发过程中,开发者有时会希望某个目录下的所有路径都可以访问同一个 Servlet,这时,可以在 Servlet 映射的路径中使用通配符“*”。

通配符的格式有两种,具体如下。

   1. 格式为“*.扩展名”,例如 *.do 匹配以 .do 结尾的所有 URL 地址。

匹配以 .hello 结尾的所有 URL 地址。

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>*.hello</url-pattern>
  </servlet-mapping>

http://localhost:8080/TestServlet3/abc.hello

http://localhost:8080/TestServlet3/hello.hello

   2. 格式为 /*,例如 /abc/* 匹配以 /abc 开始的所有 URL 地址。

匹配所有 URL 地址

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/*</url-pattern>
  </servlet-mapping>

http://localhost:8080/TestServlet3/test3

http://localhost:8080/TestServlet3/test33

http://localhost:8080/TestServlet3/abc

http://localhost:8080/TestServlet3/hello

匹配以 /test开始的所有 URL 地址。

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test/*</url-pattern>
  </servlet-mapping>

http://localhost:8080/TestServlet3/test

http://localhost:8080/TestServlet3/test/abc

需要注意的是,这两种通配符的格式不能混合使用,例如,/abc/*.do 是不合法的映射路径。

另外,当客户端访问一个 Servlet 时,如果请求的 URL 地址能够匹配多条虚拟路径,那么 Tomcat 将采取最具体匹配原则查找与请求 URL 最接近的虚拟映射路径。

例如,对于如下所示的一些映射关系:

/abc/* 

Servlet1

/*

Servlet2

/abc 

Servlet3

*.do

Servlet4

当请求 URL 为 /abc/a.html----/abc/* 和 /* 都可以匹配这个 URL,Tomcat 会调用 Servlet1.

当请求 URL 为 /abc----/*、/abc/* 和 /abc 都可以匹配这个URL,Tomcat 会调用 Servlet3。

当请求 URL 为 /abc/a.do-----/*、*.do 和 /abc/*都可以匹配这个URL,Tomcat 会调用 Servlet1。

当请求 URL 为 /a.do--------/* 和 *.do 都可以匹配这个URL,Tomcat 会调用 Servlet2。

当请求 URL 为 /xxx/yyy/a.do----*.do 和 /* 都可以匹配这个URL,Tomcat 会调用 Servlet2。

默认Servlet

如果某个 Servlet 的映射路径仅仅是一个正斜线(/),那么这个 Servlet 就是当前 Web 应用的默认 Servlet。Servlet 服务器在接收到访问请求时,如果在 web.xml 文件中找不到匹配的 <servlet-mapping> 元素的 URL,则会将访问请求交给默认 Servlet 处理,也就是说,默认 Servlet 用于处理其他 Servlet 都不处理的访问请求。

需要注意的是,在 Tomcat 安装目录下的conf文件夹中 web.xml 文件中也配置了一个默认的 Servlet,配置信息如下所示:

<servlet>
    <servlet-name>default</servlet-name>
    <serlet-class>org.apache.catalina.servlets.DefaultServlet</serlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在上面的配置信息中,org.apache.catalina.servlets.DefaultServlet 被设置为默认的 Servlet,它对 Tomcat 服务器上所有的 Web 应用都起作用。
当 Tomcat 服务器中的某个 Web 应用没有默认 Servlet 时,都会将 DefaultServlet 作为默认的 Servlet。当客户端访问 Tomcat 服务器中的某个静态 HTML 文件时,DefaultServlet 会判断 HTML 是否存在,如果存在,则会将数据以流的形式回送给客户端,否则会报告 404 错误。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值