文章目录
Java Web 的核心底层技术是Jave Servlet (Java 服务器小程序),是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理(Servlet不能独立运行,它必须部署到Servlet容器中,由容器来实例化和调用Servlet的方法),用于生成动态的内容。
Servlet容器有时候也叫做 Servlet引擎。
后期JSP技术推出后,管理和运行Servlet/JSP的容器,也称为Web容器。
支持JSP的服务器很多,Tomcat,Resin,Weblogic,WebSphere等,
Tomcat,Resin 开源免费。Weblogic,WebSphere 重量级服务器,价格昂贵。
JAVA EE 规范 — Servlet开发规范
如何可以开发一个被用户进行远程调用的Java类
- Servlet规范中,只有【Servlet接口】的实现类才可以被用户通过浏览器进行访问;
- 根据当前用户使用的请求方式,重写【Servlet接口】中的doGet/doPost方法(服务方法,相当于main)
- 通知Tomcat,告诉它当前网站中存在了可以被用户远程访问的Java类;
【Servlet实现类】与【Servlet接口】的关系 -【源码分析】
HttpServlet 的 源码在: javax.servlet-api.3.0.1-source.jar 包中;
【Servlet实现类】extends HttpServlet
HttpServlet extends GenericServlet
GenericeServlet implements Servlet接口
Web工程中,Java类文件存放在哪里?
/WEB-INF/classes
Tomcat是如何管理【Servlet实现类】 -----【生命周期】
- 【Servlet实现类】的实例对象的创建
- 在一个Web工程中,所有的【Servlet实现类】都只能由Tomcat负责创建
没有任何一个new xxxServlet()这种写法;
- Tomcat在何时创建了【Servlet实现类】的实例对象
- 【默认情况】,只有当第一个用户来访问当前【Servlet实现类】时,
此时Tomcat才会创建Servlet的实例对象 - 【人工干预】,指定对应的【Servlet实现类】在Tomcat启动时被创建: 添加下面的配置
作用:通知Tomcat在启动时创建该Servlet的实例对象;
(默认为0,设置的值大于0,就会在启动的时候创建)
***********load-on-startup>的值越小,创建的优先级就越高
- 在Tomcat运行期间,如果一个【Servlet】被多个用户进行访问时,此时Tomcat会为【Servelet】创建多少个实例对象
【结论】:在Tomcat运行期间,一个【Servelet实现类】只能被创建一个实例对象; - 【Servlet实现类】的实例对象何时被销毁
开发人员没有权利销毁Servlet,在Tomcat关闭之前,由Tomcat负责销毁掉所有的实例对象
【Servlet的请求路径写法】四种写法
-
具体请求路径写法:
OneServlet
/test/one
【含义】:如果当前请求从网络名称后面截取的【请求路径】,与当前请求路径完全一致,说明当前用户请求的是这个Servlet
例子:
http://localhost:8080/myWeb/test/one ok
http://localhost:8080/myWeb/bb/test/one 不予理睬 -
前置条件请求路径写法:
OneServlet
/test/*
【含义】:如果当前请求从网站名称后面截取的【请求路径】以“/test/”为开头,表示本次请求是OneServlet; *代表任意字符串,包括没有;
例子:
http://localhost:8080/myWeb/test/meimei.jpg ok
http://localhost:8080/myWeb/bb/test/one 不予理睬
http://localhost:8080/myWeb/test/ ok -
后置条件请求路径写法:一定不能以斜线开头,习惯把Servlet资源后缀名默认为.do
OneServlet
*.do
【含义】:如果当前请求从网站名称后面截取的【请求路径】,以".do"为结尾,表示本次请求是OneServlet
例子:
http://localhost:8080/myWeb/test/one.do ok
http://localhost:8080/myWeb/test/one.do?name=mike ok
http请求协议包:
【请求行】:
请求地址:http://localhost:8080/myWeb/test/one.do
请求方式:get
【请求头】{name:mike}
【空白行】
【请求体】 -
通配符请求路径:
OneServlet【吃瓜群众】
/*
【含义】:对于当前网站任何资源的请求都要交给当前的Servlet
例子:
http://localhost:8080/myWeb/test/one.htm ok
http://localhost:8080/myWeb/bb/test/one.do ok
http://localhost:8080/myWeb ok
四种请求路径执行的优先级
http://localhost:8080/myWeb/test/one.do
【具体请求路径】>【前置条件】>【通配符条件】>【后置条件】
Servlet中使用工具对象 -----------HttpServletRequest
- 开发人员,习惯于将【HttpServletRequest类型修饰的对象】称为【请求对象】
- 【请求对象】只能由Tomcat负责创建,并把它作为参数传入到当前Servlet中的服务方法(doGet/doPost)
- 通过【请求对象】可以读取当前【请求协议包中的内容】
-
【请求对象】读取【请求协议包中内容】
【请求行】:请求文件地址
使用的请求方式
【请求头】和【请求体】:请求参数 -
中文参数乱码问题:
【原因】:
浏览器采用【GET】发送请求,请求参数保存在【请求头】,【请求头】中的内容是由Tomcat来负责组装,Tomcat 9.0默认使用的字符集utf-8
浏览器采用【POST】发送请求,请求参数保存在【请求体】,【请求体】内容是由请求对象负责组装的。请求对象默认使用 ISO-8859-1(欧洲语境的内容)
【解决方案】:
针对【post】方式:在request进行装箱操作之前,为其指定正确的字符集: 用下面的代码
request.setCharacterEncoding(“utf-8”)
request.getParameter(“参数名”)
老版本Tomcat,【get】方式,通知Tomcat使用正确的字符集
修改Tomcat/conf/server.xml,增加一个下面红色的属性: