今日内容
- web服务器(tomcat)
- idea创建web项目并部署运行
- Servlet入门
如何创建Servlet
Servlet生命周期
Servlet进化史
- 使用Servlet实现登录案例
一.Web服务器介绍
(一)简介
Web服务器一般指网站服务器,也称之为WWW(World Wide Web)服务器。是指驻留于因特网上某种类型计算机的程序。这个服务器并不是硬件服务器,而是软件服务器。其主要功能是提供网上信息浏览服务,可以向发出请求的浏览器提供文档,也可以放置网站文件,让全世界浏览;还可以放置数据文件,让全世界下载等。
作用:Web服务器主要用来接收客户端发送的请求和响应客户端请求。
- 常见的服务器
- Tomcat(Apache):当前应用最广的JavaWeb服务器,专为javaweb提供;
- JBoss(Redhat红帽):支持JavaEE,应用比较广EJB容器 –> SSH轻量级的框架代替;
- GlassFish(Orcale):Oracle开发JavaWeb服务器,应用不是很广;
- Resin(Caucho): 支持JavaEE,应用越来越广;
- Weblogic(Orcale):要钱的!支持JavaEE,适合大型项目;
- Websphere(IBM):要钱的!支持JavaEE,适合大型项目。
二.Tomcat服务器
(一)介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat服务器实际上是JSP 页面和Servlet的容器,主要用来部署和运行Web应用。另外,Tomcat也具有处理HTML页面的功能。
- 下载使用
下载官网地址:https://tomcat.apache.org
注:tomcat版本可选,课程中使用8.5版本
下载后解压目录如下:
启动和关闭服务器
在Tomcat的bin目录下双击startup.bat文件
此时通过HTTP协议访问Tomcat服务,如果看到以下页面表示服务开启成功。
tomcat首页访问地址:http://localhost:8080
http: 协议名
Localhost: 地址
8080: 端口号
关闭服务可以直接将启动的Tomcat窗口关闭或双击bin目录下的shutdown.bat批处理文件。如果服务关闭,则无法访问tomcat服务首页。
注意事项:必须保证配置了JDK的环境变量,否则启动不成功或出现闪退情况。
- Idea中创建JavaWeb工程
(一)创建web工程
双击打开idea开发工具:
创建web工程:
如果不能直接创建web项目,先创建一个普通java工程,然后通过选中项目名,鼠标右键选择:add framework....转换成web项目工程。
项目目录结构:
- idea中配置tomcat
1.将tomcat添加到idea中
- 点击 Deployment,将项目添加到tomcat服务器
配置好tomcat就可以单击绿色箭头启动服务器
服务器启动成功后会自动弹出默认浏览器窗口访问项目首页:
- Servlet入门
- Servlet概念
Servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
简单理解:
我们之前讲的JDBC技术是用来实现Java语言和数据库之间的连接技术,而现在又涉及到Java和HTML进行连接,此时可以由HTML做前台,java做后台进行连接,这时候就需要一个中间件(Servlet)。
- Servlet入门案例
创建步骤:
- 创建一个普通类继承HttpServlet抽象类
- 重写HttpServlet抽象类中的service方法,快捷键Ctrl+O,选择要重写的方法确定
- 配置Servlet
- 访问Servlet:http://localhost:8080/first
注意:需要将tomcat目录下的servlet-api.jar包复制到WEB-INF/lib目录下
(三)Servlet执行原理
实现原理:
① 当服务器接收到客户端浏览器的请求后,先解析请求的url路径,获取访问Servelt的资源路径
② 查找项目的web.xml,根据资源路径匹配web.xml中的 <servlet-mapping>中的<url-pattern>
③ 如果没有匹配到报 404 ,如果匹配到了根据<servlet-mapping>中的<servlet-name>
④ 再去匹配 <servlet>中的<servlet-name> 如果没有匹配到 404
⑤ 如果匹配到了执行<servlet> 中的<servlet-class> 从而以反射的方式访问到指定的Servlet,调用其方法。
(四)Servlet生命周期
servlet生命周期:从创建到销毁的全过程。共分为三个阶段:
1、初始化
2、使用(提供服务)
3、销毁
案例:创建一个Servlet重写其内部的三个方法init()、service()、destroy()
package com.offcn.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override public void init() throws ServletException { System.out.println("==Servlet被初始化=="); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("==Servlet提供服务=="); } @Override public void destroy() { System.out.println("==Servlet被销毁=="); } } |
- 在web.xml文件中注册Servlet
<!-- 注册Servlet --> <servlet> <servlet-name>MyServlet</servlet-name><!-- Servlet名称 --> <servlet-class>com.offcn.servlet.MyServlet</servlet-class><!-- Servlet全路径 --> </servlet> <!-- 配置Servlet虚拟路径 --> <servlet-mapping> <servlet-name>MyServlet</servlet-name><!-- Servlet名称 --> <url-pattern>/myServlet</url-pattern><!-- 连接前台的虚拟访问路径 --> </servlet-mapping> |
- 测试查看Servlet生命周期
当我们启动tomcat服务器时,观察控制台并无打印消息,表示Servlet默认情况下在启动服务器时并未被创建。在浏览器地址栏中直接输入MyServlet的虚拟访问地址:
http://localhost:8080/day10/myServlet
此时观察控制台打印输出初始化与服务的相关信息,当多次访问该地址,发现服务方法被多次调用执行。
当我们关闭tomcat服务,会在控制台打印销毁方法的信息。
通过以上案例发现Servlet默认情况下是在第一次访问时被创建并初始化的,为了减少内存的压力,我们可否改变它的创建时机呢?
答案是肯定的。我们可以在web.xml文件中进行配置,使得Servlet在服务器启动时直接创建并初始化。
load-on-startup节点必须写在servlet节点的内部,且作为最后一个节点。取值必须是整数,如果是大于等于0的整数表示在服务器启动时就被创建并初始化,如果有多个Servlet设置了load-on-startup节点的值,那么值越小越优先执行;如果是负数则表示第一次被访问时创建并初始化,也就是默认情况,可以省略不写。
总结:
- init()初始化阶段:默情况当第一次访问Servlet时,Servlet容器(tomcat)会加载Servlet,加载完成后,Servlet容器(tomcat)会创建一个Servlet实例并调用init()方法进行初始化;如果需要改变创建时机,只需要在web.xml文件中配置load-on-startup节点值为大于等于0的整数即可。init()方法只会执行一次,也说明一个Servlet只有一个实例,即单例模式。
- service()服务阶段:当Servlet每被访问一次,service方法就会自动被调用一次,所以该方法可执行多次。
- Destroy()销毁阶段:当关闭服务或重启服务器时,destroy方法会被执行,这就标识着整个Servlet的生命周期到此结束。该方法仅被执行一次。
(五)Servlet进化史
1.第一阶段:猿人阶段(Servlet接口)
JavaEE规定了javax.servlet.Servlet接口,只要实现这个接口,那么实现类就是一个Servlet程序。
接口中有五个方法:
init():servlet程序出生时会执行的方法
service():servlet程序执行一次,一定会执行的方法
destroy():servlet程序销毁时,会执行的方法
getServletInfo():无关方法,获取Servlet说明信息
getServletConfig():无关方法,获取Servlet配置信息
程序员慢慢发现,Servlet接口中我们只关注编写service()方法,其他四个方法几乎用不到,每次实现接口又必须实现,特别麻烦。
2.第二阶段:古代社会阶段(GenericServlet抽象类)
为了不去关注Servlet接口中的其他无关方法,javaEE又提供了一个实现Servlet接口的抽象类javax.servlet.GenericServlet。
GenericServlet实现了接口中其他方法,只为程序员留下了service()方法。
这样程序员只需要写一个子类,继承GenericServlet,重写service()方法,就可以快捷创建并使用Servlet。
但慢慢出现了http协议,若要分别处理http协议的get和post请求,程序员还需要手动在service中书写大量代码判断。
3.第三阶段:现代社会阶段(HttpServlet抽象类)
为了能够自动分开处理http协议的get和post请求,javaEE又提供了GenericServlet的子类,javax.servlet.HttpServlet。HttpServlet仍是抽象类,但将service()方法进行了重写,并且判断请注方式是get还是post。若为get请求,调用doGet()方法,若为post请求,调用doPost()方法;程序员只需要写一个子类,继承HttpServlet,重写doGet()和doPost()方法,就可以轻松写出一个能够处理http协议的强大的servlet。
4.Servlet注解方式的使用
Java 注解(Annotation)又称 Java 标注,是 JDK1.5 引入的新特性。其主要作用是简化复杂的编码工作。Java 语言中的类、方法、变量、参数和包等都可以被标注,被标注的元素就具有了一些特定的功能。
Servlet的注解(@WebServlet)是Servlet3.0及以上版本支持的,主要目的是简化web.xml配置。
注意:一个Servlet的配置可以使用注解,也可以使用web.xml文件,但二者不能共存,只能任选其一,否则会报错。
(六)Servlet路径多元化
问题 : 一个Servlet是否可以配置多个访问路径? 答案是可以的
url-pattern配置方式共有三种:
1. 完全路径匹配(一层路径或多层路径) :以 / 开始
例如: /hello , /hello1, /aa/hello2
2. 目录匹配(多种路径都可以访问 排除已经指定的路径) :以 / 开始 需要以 * 结束.
例如: /*(所有), /aaa/* (aaa目录下的所有), /aaa/bbb/*
3. 扩展名匹配(后缀名) :不能以 / 开始 以 * 开始
例如: *.do , *.action , first.do 注意: 错误的写法 : /*.do
- Servlet登录案例
描述:用一个HTML页面将一个表单中的账号和密码传递到java类中并输出。
- 创建HTML页面并设计表单
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form action="login" method="post"> <p>账号:<input name="username" type="text"></p> <p>密码:<input name="password" type="password"></p> <p><input name="sub" type="submit" value="提交"></p> </form> </body> </html> |
- 创建LoginServlet类继承HttpServlet抽象类,并重写其service方法
package com.offcn.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+"\t"+password); } } |
- 在web.xml文件中注册Servlet,作为前后台连接的中间件
<!-- 注册Servlet --> <servlet> <servlet-name>LoginServlet</servlet-name><!-- Servlet名称 --> <servlet-class>com.offcn.servlet.LoginServlet</servlet-class><!-- Servlet全路径 --> </servlet> <!-- 配置Servlet虚拟路径 --> <servlet-mapping> <servlet-name>LoginServlet</servlet-name><!-- Servlet名称 --> <url-pattern>/login</url-pattern><!-- 连接前台的虚拟访问路径 --> </servlet-mapping> |
- 修改前台表单的action请求地址
5、通过浏览器输入:http://localhost:8080/day10/login.html访问
补充:分层开发
根据代码的功能,将项目分模块开发。最常用的三层:
表示层 : 负责数据的显示和接收 html jsp
业务逻辑层 :业务逻辑判断 (除了页面和数据访问代码以外)
数据访问层:实现对数据库的CRUD操作
好处:高内聚 低耦合 移植性好 方便项目后期维护和升级。
针对javaweb项目,MVC设计模式
M: model javabean(实体类)
V :view 视图
C:controller 控制层
如何创建分层项目:
表示层:web路径下的资源 V
控制层:com.ujiuye.servlet C
业务逻辑层:com.ujiuye.serivce
数据访问层:com.ujiuye.dao
数据模型:com.ujiuye.bean M
表示层--->控制层--->业务逻辑层--->数据访问层
五.搭建学生管理系统项目框架
- 创建一个javaweb项目
- 按层创建包
- 导jar包
- 先在bean包里创建Admin实体类
- 在dao包创建一个AdminDao,实现对admin表的crud操作
封装BaseDao工具类:
package com.ujiuye.dao; |
AdminDao:登录验证的方法login()
package com.ujiuye.dao; |
- 在service层中创建AdminServcie类,定义一login()方法,做简单的业务逻辑判断
package com.ujiuye.service; |
- 在控制层创建AdmiServlet
package com.ujiuye.servlet; |
页面login.html: