服务器,服务器与Servlet

1.软件结构

C/S: Customer/Server 基于客户端和服务端的软件。例如:QQ,酷狗音乐等等。

B/S: Browser/Server 基于浏览器和服务器的软件。例如:网站、OA管理系统、ERP管理系统、售票系统等等。

C/S和B/S结构软件的优缺点:

1)CS结构:

​ 优点:CS结构软件可以在本地上存储数据,减少数据在网络上传输;可以不依赖网络。

​ 缺点:要安装客户端。不能够跨平台。

2)BS结构:

​ 优点:不需要安装客户端,可以实现跨平台。

​ 缺点:必须要依赖网络。

2 服务器

2.1 服务器介绍

服务器也是一个应用软件。任何一台计算机上只要安装了该软件,那么这台计算机就是一台服务器。

常见的服务器:Websphere、WebLogic、JBOSS、Tomcat等等。

2.2 自定义服务器(socket网络编程)

浏览器与服务器之间的通信使用的是HTTP协议。HTTP协议是TCP的一个子协议。下面演示如何使用TCP协议实现服务器的网络通信。

package demo01实现简单服务器;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * tcp网络通信的实现步骤:
 * 	第一步:创建一个服务端的Socket,监听某一个端口。
 *  第二步:等待客户端的连接;
 *  第三步:如果有客户端连接进来,服务端就需要开启一个线程处理客户端的请求。
 *  第四步:处理完成后,向客户端返回数据;
 * 	第五步:关闭客户端的Socket。
 */
class ServerThread extends Thread {
    //创建客户端的Socket
	Socket socket;
	
	public ServerThread(Socket socket) {
		this.socket = socket;
	}
	
	// 运行要执行的任务代码
	// run方法不能够直接调用
	// 线程启动的时候自动调用
	@Override
	public void run() {
		// 如果浏览器请求过来,就给浏览器返回一张图片
		try {
			// 1.读取图片
			FileInputStream fis = new FileInputStream("d:/hello.html");
			// 2.获取客户端输出流
			OutputStream out = socket.getOutputStream();
			// 3.向客户端的输出写数据
			byte[] buf = new byte[8 * 1024];
			int len = fis.read(buf);
			// 如果len不等于-1,代表读取到图片数据,否则读完
			while (len != -1) {
				// 向客户端写数据
				out.write(buf, 0, len);
				// 读取图片数据
				len = fis.read(buf);
			}
			// 4.关闭文件输入流和客户端的socket
			fis.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}

public class ServerDemo {

	public static void main(String[] args) throws IOException {
		System.out.println("服务器启动了...");
		// 创建一个服务端的Socket,并监听8080端口
		ServerSocket ss = new ServerSocket(8080);
		while (true) {
			// 调用ServerSocket对象的accept方法监听客户端的连接,
			// 如果有客户端连接进来,该方法返回客户端的Socket
			Socket socket = ss.accept(); // 阻塞方法
			// 启动一条线程,处理客户端的请求
			ServerThread st = new ServerThread(socket);
			st.start();
		}
		
	}

}

2.3 Tomcat服务器安装

第一步:下载并解压缩apache-tomcat-8.0.49.zip到本地磁盘的任意目录下。

第二步:配置JAVA_HOME环境变量。

第三步:进入bin目录下,双击startup.bat启动tomcat服务器。

第四步:通过浏览器访问localhost:8080,如果可以看到tomcat管理平台,就代表安装成功。

2.4 Tomcat的目录结构

bin:存放可执行文件。

conf:存储Tomcat的配置文件。

lib:第三方jar包。

logs:Tomcat运行过程中产生的日志文件。

temp:存放临时文件的目录。

webapps:存放web项目的目录,该目录下的每一个文件夹都是一个Web项目。

work:存放jsp的翻译文件。

2.5 URL地址

URL地址的格式:

http://localhost:8888/aa/hello.html

http:// 协议名称

localhost: 域名,localhost代表本地IP地址(127.0.0.1)

8888:端口号,Tomcat默认端口号为8080

  • mysql:3306
  • Oracle:1521
  • ftp:21

​ 特殊的端口号:80,如果是80端口,URL地址可以不写端口号。

/aa:上下文路径,默认就是项目的名称。

/hello.html : 访问资源的路径。如果是静态资源,那么访问资源路径就是静态资源的目录所在路径。如果是动态资源(如Servlet),那么访问路径就是web.xml中url-pattern指定的路径。

静态资源和动态资源的区别?

静态资源的内容是写死在文件中,如果要修改文件的内容,就要修改源码。动态资源的数据一般都是保存数据库中,并且一般都会有一个后台管理系统。如果要修改动态资源的数据,一般都是通过后台管理系统进行修改。

3 Web和Servlet

3.1 Web项目的目录结构

在Tomcat的webapps目录下,按照以下结构创建一个Web项目。

web
	|- jsp
	
	|- resourses
		|- css
		|- js
		
	|- WEB-INF
        |- classes
		|- lib   # 存放项目依赖的第三方jar包

        |- web.xml


3.2 编写和配置Servlet

第一步:定义一个Java类,继承HttpServlet。

public class HelloServlet extends HttpServlet {

}

第二步:重写doGet或doPost方法。

  • doGet方法:接收Get请求;
  • doPost方法:接收Post请求;
/*
		request: 代表请求,它保存所有的请求的数据
		response:代表响应,可以向浏览器发送数据。
*/
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("doPost...");
	}

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

第三步:在web.xml文件中配置Servlet的请求路径。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">

    
	<!-- 配置Servlet -->
	<servlet>
		<!-- Servlet的名字,可以是任意 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- Servlet的完整类名(包名+类名) -->
		<servlet-class>demo02Servlet.HelloServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<!-- 必须要与上面的servlet-name相同 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- 访问资源路径 -->
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

</web-app>

3.3 Servlet的访问过程

  1. 当浏览器请求服务器的时候,浏览器会根据url地址的ip和端口号找到对应的服务器。
  2. 服务器接收到浏览器发送过来的请求后,会根据url地址的上下文路径查找webapps目录下是否存在与上下文名称相同的文件夹
  3. 如果存在,那么服务器就会在文件夹下查找web.xml文件,然后在该文件中查找所有的url-pattern节点。
  4. 如果url-pattern节点内容与url地址的访问路径相匹配,那么就通过servlet-name节点找到对应的Servlet-class节点。
  5. 获取Servlet-class节点内容,使用反射技术创建Servlet对象,并调用service方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6Hg3UmF-1569584853091)(C:\Users\lmc\Desktop\我的笔记\images\assets\1563845050730.png)]

3.4 在Eclipse中查看Servlet源码

第一步:按下Ctrl + t ,输入HttpServlet。

第二步:点击attachment按钮,在弹出对话框中选择external file,然后选择apache-tomcat-8.0.47-src.zip文件。最后点击确定即可。

通过查看HttpServlet源码看到,service方法会从request中获取请求方式,然后再根据不同的请求方式调用不同的doXxx方法。比如说,如果是get请求,就调用doGet方法,如果是Post请求,就调用doPost方法。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐