这篇博客我会初步介绍Tomcat的配置及Servlet的使用,后面还会写篇博客:用我们学的这些知识,自己做一个简单的网站出来
Servlet
- 学习的主要内容就是如何接收客户端发出的请求,以及如何对请求作出响应.
1.什么是服务器
- 服务器就是一台高性能的电脑,在电脑上安装了xxx服务的软件,就称为xxx服务器
- 常见服务器:
- 邮件服务器: 在电脑上安装了邮件收发服务的软件
- ftp服务器: 在电脑上安装了文件上传下载服务的软件
- 数据库服务器: 在电脑上安装了DBMS(MySQL,Oracle…)
- web服务器: 在电脑上安装了webServer
- WebServer做了那些事儿
- 负责建立底层的网络连接
- 负责将客户端请求的文件找到,并且返回给客户端
- 负责根据客户端请求的路径找到对应的Servlet并执行响应
1.Tomcat 介绍
- Tomacat是由Apache推出的一款免费开源的Servlet容器,可实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。
- Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,在处理静态Html上的能力略逊一筹。
- 简单理解:Tomcat就是一个容器,空壳,它的用处就是用来装东西的,它自己做不了任何事,一般的我们Tomcat是装Servlet的,Servlet简单理解就是一个处理单个业务的程序,所以我们一个网站有很多的业务处理,也就有很多的Servlet,下面会详细介绍!
2. Servlet
2.1 什么是 Servlet
- Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
- Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
- 总结:,这个servlet是运行在服务器上的一个小程序,用来处理服务器请求的.进一步讲,我们知道,一般的网页程序,是由我们通过浏览器访问来实现的,在这个过程中,我们的浏览器发送访问请求,服务器接收请求,并对浏览器的请求作出相应的处理.这就是我们熟悉的B/S模型(浏览器-服务器模型).而servlet就是对请求作出处理的组件,运行于支持Java的应用服务器中.
2.1 Servlet的开发流程
我们可以简单理解:servlet是servlet是java语言实现的一个类,所以我们就要根据这个类进行相应的扩展开发.
开发流程如下:
- 1、编写一个java类,继承HttpServlet类
- 2、重写HttpServlet类的doGet方法和doPost方法
- 3、配置web.xml文件,或者使用注解对servlet进行配置
2.2 Servlet的配置
配置简单理解就是:客户端/浏览器给我们服务器发送请求,那我们哪个servlet会去处理这个业务呢,这时候配置的作用就体现了
配置servlet一共有两种方式,一种是使用web.xml文件配置,另外一种就是使用注解配置,下面我们来详解介绍这两种配置方式
- 1、使用web.xml文件配置
- 2、 使用@注解配置(常用,这里主要使用),新版本的servlet支持使用注解进行配置,这样极大的简便了开发.
注解配置如下:
@WebServlet(name = "LoginServlet",urlPatterns = {
"/login"})
public class LoginServlet extends HttpServlet {
}
然后,你在访问/login的时候,服务器同样就会将处理交由LoginServlet进行处理了.
2.3 Servlet映射路径的配置问题
- 精确匹配
精确匹配就是我们上面用的那种方式,使用固定的url来访问这个servlet - 模糊匹配
模糊匹配就是比较有意思的了,通过模糊匹配,我们可以让好多路径映射到同一个servlet,模糊匹配一般有如下格式
/* 任意路径都映射到这个servlet
/roobtyan/* /roobtyan下的任意路径映射到该servlet
*.(*.do *.action *.html) 是这样的:/任意路径.do/action/html
下面我们搭建web项目,配置 tomcat容器
3.创建web工程
-
下载Tomcat,在D盘创建一个java文件夹, 然后解压到当前文件夹
附:需要Tomcat压缩包的,可以留言qq邮箱;因为压缩包文件数目多,上传必须需要开通百度网盘会员,所以不能上传!
-
创建Maven工程 选择webapp骨架
-
创建完工程,第一次时间会比较久 直到pom.xml文件中出现60多行数据
-
给工程创建Java和Resources文件夹
-
打开工程设置 File——>Project Structure
-
配置Tomcat
-
添加Tomcat相关jar包 打开工程设置页面
-
点击Idea里面 Tomcat旁边的播放按钮 等一会儿 直到浏览器中显示HelloWord说明成功
- 补充:解决Tomcat控制台提示乱码问题
解决:找到Tomcat安装包目录 里面的conf文件夹中的logging.properties 找到最后一个UTF-8改成GBK即可
java.util.logging.ConsoleHandler.encoding = GBK
4.Servlet响应流程
- 用户在客户端浏览器中向http://localhost:8080/hello这个路径发出请求,请求先被Tomcat拦截, Tomcat会取出请求路径中的子地址/hello ,拿着字地址找到对应的HelloServlet(Servlet3.0之前版本是通过web.xml配置文件找到对应的Servlet, 之后版本通过注解的方式找到Servlet),找到Servlet后可以得到Servlet的完整类名,然后通过反射的方式实例化HelloServlet,然后会调用里面的service方法, 方法里面会判断请求方式,如果请求方式是get则调用doGet方法,如果请求方式为post则调用doPost方法.
实现:
- 我们创建一个servlet,url地址就是 /hello,当客户端向/hello地址发送请求时,此时Servlet会响应,我们给客户端返回一句话就好了
代码:
//urlPatterns:设置和当前Servlet关联的路径
//当客户端向/hello地址发送请求时,此时Servlet会响应
@WebServlet(name = "HelloServlet",urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型 文本或者html标签
response.setContentType("text/html;charset=utf-8");
//获取输出对象
PrintWriter pw = response.getWriter();
//输出数据
pw.println("恭喜你访问成功<h1>我是h1<h1>");
//关闭资源
pw.close();
}
}
结果:
5.客户端浏览器中发出请求的几种方式
- 在浏览器地址栏中输入请求路径 直接发出请求 get
- 在html页面中通过超链接发出请求 get
- 通过form表单发出请求 get/post
6.请求方式Get和Post
- GET请求: 请求参数放在请求地址的后面(由于提交的参数可见,所以不推荐传递敏感信息),请求参数大小受限 只能传递4k以内的数据
- 浏览器地址栏发出get请求
- 超链接发出get请求
- form表单默认发出的是get请求,或者method=“get” 也是发出get请求
- POST请求: 请求参数放在请求体里面(用户看不见 所以安全性较高),请求参数大小无限制(一般用于传递敏感信息或上传文件)
- form表单 method=“post”
下面我们用一个简单案例来应用下上面讲解的知识点
7.注册,登录,查找,删除等功能的实现
工程目录:
准备工作:
- 先创建一个 user 表,表的创建格式如下:
- 在我们工程目录 resources下导入配置文件:jdbc.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/newdb3?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
db.username=root
db.password=root
db.maxActive=10
db.initialSize=2
- 在 pom.xml 文件导入依赖:
<!-- 连接MySQL数据库的依赖 驱动:这就是数据库对接口的实现类 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
- 添加工具类:DBUtils 里面封装的就是:读取配置文件,配置连接池,然后创建数据库链接,给我们返回
public class DBUtils {
private static DruidDataSource ds;
static {
//1、读取配置文件
Properties p = new Properties();
InputStream ips = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
p.load(ips);
} catch (IOException e) {
e.printStackTrace();
}
String driver = p.getProperty("db.driver");
String uri = p.getProperty("db.url");
String username = p.getProperty("db.username");
String password = p.getProperty("db.password");
//2、创建连接池
//从配置文件中:读取连接池相关信息
String maxsize = p.getProperty("db.maxActive");
String initsize = p.getProperty("db.initialSize");
//创建连接池对象
ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(uri);
ds.setUsername(username);
ds.