文章目录
概述
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 重量级服务器,价格昂贵。
关于Tomcat的介绍,可以看下面的博客:
Servlet
Java EE 规范:即 Servlet开发规范。
如何开发一个被用户进行远程调用的Java类?
- Servlet规范中,只有实现
Servlet接口
的类才可以被用户通过浏览器进行访问; - 根据当前用户使用的请求方式,重写Servlet接口中的doGet/doPost方法(服务方法,相当于main)
- 通知Tomcat,告诉它当前网站中存在了可以被用户远程访问的Java类;
继承关系
HttpServlet 的 源码在: javax.servlet-api.3.0.1-source.jar 包中;
[Servlet实现类] extends HttpServlet{
...
}
public abstract class HttpServlet extends GenericServlet{
...
}
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
...
}
Servlet的请求路径写法:四种写法
1. 具体请求路径写法
例子:OneServlet.java
<url-pattern>/test/one</url-pattern>
含义:如果当前请求从网络名称后面截取的【请求路径】,与当前请求路径完全一致,说明当前用户请求的是这个Servlet
例子:
http://localhost:8080/myWeb/test/one ok
http://localhost:8080/myWeb/bb/test/one 不予理睬
2. 前置条件请求路径写法
例子:OneServlet.java
<url-pattern>/test/*</url-pattern>
含义:如果当前请求从网站名称后面截取的【请求路径】以“/test/”为开头,表示本次请求是OneServlet; *代表任意字符串,包括没有;
例子:
http://localhost:8080/myWeb/test/meimei.jpg ok
http://localhost:8080/myWeb/bb/test/one 不予理睬
http://localhost:8080/myWeb/test/ ok
3. 后置条件请求路径写法
一定不能以斜线开头,习惯把Servlet资源后缀名默认为.do
例子:OneServlet.java
<url-pattern>*.do</url-pattern>
含义:如果当前请求从网站名称后面截取的【请求路径】,以".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}
【空白行】
【请求体】
4. 通配符请求路径
例子:OneServlet.java
<url-pattern>/*</url-pattern>
含义:对于当前网站任何资源的请求都要交给当前的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)
- 通过请求对象可以读取当前请求协议包中的内容
HttpServletResponse
待更新
Tomcat是如何管理Servlet实现类(生命周期)
1. Servlet实现类的实例对象的创建?
在一个Web工程中,所有的【Servlet实现类】都只能由Tomcat负责创建,没有任何一个new xxxServlet()这种写法。
2. Tomcat在何时创建了Servlet实现类的实例对象?
- 【默认情况】,只有当第一个用户来访问当前【Servlet实现类】时,Tomcat才会创建Servlet的实例对象
- 【人工干预】,指定对应的Servlet实现类在Tomcat启动时被创建: 添加下面的配置
作用:通知Tomcat在启动时创建该Servlet的实例对象;<servlet> <load-on-startup>1</load-on-startup> </servlet> # 默认为0,设置的值大于0,就会在启动的时候创建 # load-on-startup 的值越小,创建的优先级就越高
3. 在Tomcat运行期间,如果一个Servlet被多个用户进行访问时,此时Tomcat会为Servelet创建多少个实例对象?
在Tomcat运行期间,一个Servelet实现类只能被创建一个实例对象;
4. Servlet实现类的实例对象何时被销毁?
开发人员没有权利销毁Servlet,在Tomcat关闭之前,由Tomcat负责销毁掉所有的实例对象
Web工程中,Java类文件存放在哪里?
/WEB-INF/classes
get 和 post 请求有哪些区别?
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
常见问题及解决
1. 中文参数乱码问题
原因
浏览器采用【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,增加一个下面的属性:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
JSP
JSP:Java Server Page的简写
JSP 和 Servlet 有什么区别?
- JSP经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
- JSP更擅长表现于页面显示,servlet更擅长于逻辑控制。
- Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
- JSP是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
JSP内置对象及其作用
JSP有9个内置对象:
内置对象 | 作用 |
---|---|
request | 封装客户端的请求,其中包含来自GET或POST请求的参数; |
response | 封装服务器对客户端的响应; |
pageContext | 通过该对象可以获取其他对象; |
session | 封装用户会话的对象; |
application | 封装服务器运行环境的对象; |
out | 输出服务器响应的输出流对象; |
config | Web应用的配置对象; |
page | JSP页面本身(相当于Java程序中的this); |
exception | 封装页面抛出异常的对象。 |
JSP 的 4 种作用域
JSP中的四种作用域包括page、request、session和application,具体来说:
- page代表与一个页面相关的对象和属性。
- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
jsp对应的java文件和编译出来的类文件位置
<tomcat base>\work\Catalina\localhost\…\jsp
forward 和 redirect 的区别?
Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。
- 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
- 间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。