Web的了解和Servlet初次见面
一、知识链梳理
二、Web发展基础
web 相信大家都不陌生,平常我们浏览网页用的都是web服务。互联网起初的web就是非常简单的页面,但是随着客户需求越来越复杂,需要的功能越来越多,我们的服务器端需要处理的请求越来越多,需要区分不同的请求,还需要按照不同请求进行请求数据的提取以及资源的分配和运算还有逻辑的处理,最后还需要响应给客户端,这就使得服务器端 代码越来越复杂,实现越来越困难。
根据以往的经验,双方进行通信只需要遵循一定的规则就可以很明确地知道各部分数据的含义,于是出现了网络更上层的应用协议(后面讲的 HTTP 协议),规定 服务器 端和客户端通信的规则。客户端请求 服务器端和服务器端响应客户端,都按照固定的规则,那么接收请求和相应数据这部分操作就可以固定下来,交给特定的一段代码来执行,从而减少 服务器端的代码量,于是出现了各种web框架;如果大家想了解更加深入的话,就去了解web的发展历程吧,其中有不少有趣的小故事啊,这里就不详细赘述了。
三、服务器的出现
为了让大家更好的理解什么是服务器,先让我们回顾一下Socket编程,回顾Socket编程给我们最大的感受,是可以在多台电脑之间进行数据的传输,这就是网络编程的开端和基础,通过客户端请求服务器端通信,直观了解Web编程。
i.简单通信
/**
* 客户端:向服务器发送请求,并发送简单的消息
* @author Cushier
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 创建客户端 必须指定服务器+端口
Socket client = new Socket("localhost", 8888);
// 发送消息 请求资源
// 获取输出流
OutputStream os = client.getOutputStream();
// 使用缓冲字符输出流
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os));
// 写出消息,发送内容
String msg = "Hello, I am Client, I need some resources";
br.write(msg);
br.close();
}
}
/**
*服务端,接收客户端请求并给出简单的响应
*@authorCushier
**/
public class Server{
public static void main(String[] args) throws IOException{
//创建服务器,指定端口ServerSocket(intport)
ServerSocket socket = new ServerSocket(8888);
//接收客户端连接
Socket client = socket.accept();
System.out.println("******************");
//获取数据的输入流
InputStream is=client.getInputStream();
//使用缓冲字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
Stringmsg="";
while((msg=br.readLine())!=null){
System.out.println(msg);
}
br.close();
}
}
ii.不同请求
/**
* 客户端:向服务器发送请求,发送不同的请求
* @author Cushier
*
*/
public class Client2 {
public static void main(String[] args) throws IOException {
// 通过系统默认类型的 SocketImpl 创建未连接套接字
Socket socket = new Socket();
// 此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名
SocketAddress address = new InetSocketAddress("localhost", 8898);
// 将此套接字连接到服务器,并指定一个超时值。 或者不指定超时时间
socket.connect(address, 1000);
OutputStream os = socket.getOutputStream();
os.write("15".getBytes());
os.flush();
socket.close();
}
}
/**
* 服务端
* public class ServerSocketextends Object:此类实现服务器套接字。
* 服务器套接字等待请求通过网络传入。
* 它基于该请求执行某些操作,然后可能向请求者返回结果。
*
* @author Cushier
*
*/
public class Server2 {
public static void main(String[] args) throws IOException {
// 创建绑定到特定端口的服务器套接字。
ServerSocket server = new ServerSocket(8898);
// Socket accept() 侦听并接受到此套接字的连接。
Socket client = server.accept();
System.out.println("接收到连接");
InputStream is = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte[] req = new byte[1024];
// 接收客户端请求
int len = bis.read(req);
String reqStr = new String(req, 0, len);
System.out.println(reqStr);
if (Integer.parseInt(reqStr) > 15) {
System.out.println("开");
} else {
System.out.println("15个6");
}
client.close();
server.close();
}
}
iii.复杂请求
/**
* 客户端
*
* @author Cushier
*
*/
public class Client3 {
public static void main(String[] args) throws IOException {
// 通过系统默认类型的 SocketImpl 创建未连接套接字
Socket socket = new Socket();
// 此类实现 IP 套接字地址(IP 地址 + 端口号)。它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名
SocketAddress address = new InetSocketAddress("localhost", 8898);
// 将此套接字连接到服务器,并指定一个超时值。 或者不指定超时时间
socket.connect(address, 1000);
OutputStream os = socket.getOutputStream();
os.write("我要看跑男".getBytes());
os.flush();
// 接收响应, 显示结果
InputStream is = socket.getInputStream();
byte[] result = new byte[1024];
int len = is.read(result);
String resultStr = new String(result, 0, len);
System.out.println(resultStr);
socket.close();
}
}
/**
* 服务端
* @author Cushier
*
*/
public class Server3 {
public static void main(String[] args) throws IOException {
// 创建绑定到特定端口的服务器套接字。
ServerSocket server = new ServerSocket(8898);
// Socket accept() 侦听并接受到此套接字的连接。
Socket client = server.accept();
System.out.println("接收到连接");
InputStream is = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte[] req = new byte[1024];
// 接收客户端请求
int len = bis.read(req);
String reqStr = new String(req, 0, len);
System.out.println(reqStr);
// 将接收到的请求封装成对象, 传送给请求的类
MyRequest request = new MyRequest();
MyResponse response = new MyResponse();
OutputStream os = client.getOutputStream();
if (reqStr.equals("我要看首页")) {
// 根据请求的信息, 构造处理的类
MyServlet s1 = new ServletMoney();
s1.service(request, response);
// 通过client的响应, 将结果响应回客户端
os.write("<h1>这是好看的首页</h1><img src=“/>".getBytes());
os.flush();
} else if (reqStr.equals("我要看跑男")) {
// 根据请求的信息, 构造处理的类
MyServlet s2 = new ServletTime();
s2.service(request, response);
// 通过client的响应, 将结果响应回客户端
os.write("<video>跑男</video>".getBytes());
os.flush();
}
client.close();
server.close();
}
}
总结:当客户端请求的资源越来越丰富,需求越来越复杂,程序的核心就应该放在解决业务和计算响应数据上,于是出现了服务器统一接收客户端数据进行处理并分发到不同的资源,由各个资源进行处理,最后结果交由服务器响应。
从上面的描述可以发现,现在所说的服务器只是负责接收请求,对请求进行分发,以及最后将获取的数据进行相应的固定框架,至于数据怎么计算得出还得根据具体的业务需求编写(填充)代码。在没有业务需求的情况下就能将服务器准备出来,现在市面上的服务器有很多,比较常用的有:Tomcat、JBOOS、IBM的WebSphere、BEA的WebLogic以及Apache等
四、javaWeb简介
随着Java语言的流行,Java在网站和企业级应用的开发上应用得越来越普遍,Java Web开发已经成为Java企业级解决方案中不可或缺的重要组成部分。
Java Web是用Java技术来解决相关web互联网领域的技术总和。Web包括:web服务器和web客户端两部分。Java在客户端的应用有java applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。Web开发可以理解为做网站。
随着网络技术的不断发展,单机的软件程序已经难以满足网络计算的需要。为此,各种各样的网络程序开发体系应运而生。其中,运用最多的网络应用程序开发体系结构可以分为两种,一种是基于浏览器/服务器的B/S结构,另一种是基于客户端/服务器的C/S结构。
1.C/S体系结构
C/S是Client/Server的缩写,即客户端/服务器结构。在这种结构中,服务器通常采用高性能的PC机或工作站,并采用大型数据库系统(如Oracle或SQL Server),客户端则需要安装专用的客户端软件。这种结构可以充分利用两端硬件环境的优势,将任务合理分配到客户端和服务器,从而降低了系统的通信开销。在2000年以前,C/S结构占据网络程序开发领域的主流。
2、B/S体系结构
B/S是Browser/Server的缩写,即浏览器/服务器结构。在这种结构中,客户端不需要开发任何用户界面,而统一采用如IE、Firefox、Chrome等浏览器,通过Web浏览器向Web服务器发送请求,由Web服务器进行处理,并将处理结果逐级传回客户端。这种结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,从而节约了开发成本,是一种全新的软件体系结构。这种体系结构已经成为当今应用软件的首选体系结构。
3. C/S与B/S比较
C/S的优点与缺点:
优点:安全性比较好
缺点:软件更新时需要同时更新客户端和服务器,较麻烦
B/S的优点与缺点
优点:安全性较差
缺点:不需要维护客户端,主需要关注服务器即可
4.Web应用技术
在开发Web应用程序时,通常需要应用客户端和服务器端两方面的技术。其中,客户端应用的技术主要用于展现信息内容,而服务器端应用的技术,则主要用于进行业务逻辑的处理和与数据库的交互等。
1、客户端应用技术
在进行Web应用开发时,离不开客户端技术的支持。目前,比较常用的客户端技术包括HTML语言、CSS、Flash和客户端脚本技术。
2、服务器端应用技术
在开发动态网站时,离不开服务器端技术,比较传统和经典的Web服务器端技术主要有:CGI、ASP、SERVLET/JSP、PHP等。
五、Tomcat
1.什么是Tomcat?
Tomcat是一个符合JavaEE WEB标准的最小的WEB容器,所有的JSP程序一定要有WEB容器的支持才能运行,而且在给定的WEB容器里面都会支持事务处理操作Tomcat,简单的说就是一个运行Java的网络服务器,底层是Socket的一个程序,它也是JSP和Servlet的一个容器。
2、Tomcat的安装步骤
1.下载安装
-
首先,登录到Tomcat官方装包下载地址http://tomcat.apache.org
在【Download】目录下,找到并点击合适版本的Tomcat。
(由于我的JDK为1.8.0,因此我选择了下载Tomcat8版本)。
-
点击[tomcat8]后,根据自己电脑操作系统的位数,再选择右侧【core】下的压缩包进行下载,并保存。
-
因为下载的该压缩为免安装版Tomcat,下载完成后,将该压缩包解压即可。
(记住该解压文件的存放位置,后面环境变量配置会用到)
END
2.环境变量配置
鼠标右键点击【这台电脑】–>选择【属性】->【高级系统设置】–>【系统变量】。
然后,点击“系统变量”框下的【新建】按钮。
(1)新建CATALINA_BASE变量
变量名:CATALINA_BASE
变量值:C:\my\apache-tomcat-8.5.42-windows-x64\apache-tomcat-8.5.42
(Tomcat安装位置,即刚刚解压文件夹下bin文件所在位置)
(2)新建CATALINA_HOME变量
变量名:CATALINA_HOME
变量值:C:\my\apache-tomcat-8.5.42-windows-x64\apache-tomcat-8.5.42
(变量值同上,填Tomcat的安装位置)
(3)找到Path变量,点击编辑
变量名:Path
变量值: %CATALINA_HOME%\bin
(不要删除原有path变量值,直接在最后一行添加上这一句即可)
这样Tomcat就配置好了。
启动方式一:打开cmd命令提示符,输入startup后回车,就可以看到Tomcat成功启动了。
启动方式二:在tomcat安装目录的bin下使用startup.bat命令启动tomcat。
关闭Tomcat的方式:
(1)在tomcat安装目录的bin下使用shoudown.bat命令关闭tomcat
(2)打开cmd命令提示符,输入shoudown后回车,就可以看到Tomcat关闭了
(3)直接使用快捷键ctrl+c来关闭
注意事项
- 还可以在浏览器地址栏输入localhost:8080或127.0.0.1:8080,验证Tomcat是否配置成功。
3、Tomcat目录结构
- .bin:启动和关闭tomcat的bat文件
- .conf:配置文件server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host) web.xml文件配置与web应用(web应用相当于一个web站点)tomcat-user.xml配置用户名密码和相关权限.
- .lib:该目录放置运行tomcat运行需要的jar包
- .logs:存放日志,当我们需要查看日志的时候,可以查询信息
.webapps:放置我们的web应用 - .work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件