软件体系结构
1. C/S模型
描述:客户端和服务器端程序都需要编写
优点:响应速度快,安全度高
缺点:用户需要安装客户端程序才能使用,软件更新时客户端与服务器端两边都要升级
代表作:聊天应用(QQ、WeChat)、大型网络游戏(LOL、CF)等
2. B/S模型
描述:程序员只需要编写服务器端程序
优点:软件更新和维护比较方便,用户只需要安装浏览器即可使用
缺点:安全度较低
Tomcat的安装与启动
Tomcat安装
Tomcat是Apache提供的免费服务器,这里推荐8.5以上的版本(支持较新的Servlet 4),并且推荐下载zip版,下完之后解压即可,推荐解压到D的根目录下(其他路径的话,要求路径中不包含中文或空格)。
Tomcat的启动
启动之前,请先确保已经安装jdk且已经配置好JAVA_HOME和Path,这是因为Tomcat启动需要jdk。
在Tomcat安装目录下的bin目录中双击startup.bat,这时cmd命令行就会多出一大堆信息,如果控制台上出现乱码,这是因为Tomcat向控制台输出的是UTF-8编码格式的信息,而cmd默认编码格式为GBK,这时需要先双击shutdown.bat关闭服务器,再转到Tomcat目录下的conf目录,打开里面的logging.properties并按下图将ConsoleHandler.encoding设为GBK。
Servlet
概述
Servlet是Java Web 三大组件(Servlet、Filter、Listener)之一,Servlet具有接收请求、处理请求、响应请求三大功能,例如用户发出的登录、注册等请求都有Servlet完成。定义Servlet的方式有以下三种
1. 实现javax.servlet.Servlet接口
2. 继承javax.servlet.GenericServlet抽象类
3. 继承javax.http.HttpServlet抽象类
无论是哪种方式,必然会实现Servlet接口,因为以上后两种方式提到的类都是Servlet的实现类。我们最终开发会经常使用最后一种方式,但为了更好地了解Servlet生命周期,我们先熟悉下第一种方式:实现Servlet接口
核心方法
1. void init(SevletConfig var1) 生命周期函数,首次访问时由Tomcat调用,负责创建Servlet。
2. void service(ServletRequest var1, ServletResponse var2) 生命周期函数,Servlet每访问一次,Tomcat都会调用一次,负责处理用户请求。
3. void destroy() 生命周期函数,Tomcat关闭服务前的最后一刻,就会执行这个函数,负责服务器关闭前销毁创建的Servlet
光实现Servlet接口还不够,对初学者而言还要在web.xml中加入<servlet>和<servlet-mapping>将Servlet类与Servlet路径绑定在一起
<servlet>
<!-- 名字随便取,一般取类名-->
<servlet-name>AServlet</servlet-name>
<servlet-class>com.reno.d1018.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 名字与servlet名一致 -->
<servlet-name>AServlet</servlet-name>
<!-- 绑定url:/路径 一般取 /类名 -->
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
继承HttpServlet
继承HttpServlet抽象类是定义Servlet最常用的方式,它已经帮我们实现了service()方法,同时提供了更为简便的doGet()与doPost(),我们通过继承HttpServlet的方式来定义Servlet的话,只需要覆盖doGet()和doPost()即可
示例:
package com.reno.d1018;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class BServlet 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 {
resp.getWriter().print("<h1> Brave </h1>");
}
}
<servlet>
<servlet-name>BServlet</servlet-name>
<servlet-class>com.reno.d1018.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 名字与servlet名一致 -->
<servlet-name>BServlet</servlet-name>
<!-- 绑定url:/路径 一般取 /类名 -->
<url-pattern>/BServlet</url-pattern>
</servlet-mapping>
这时登录localhost:8080/BServlet