Java WEB
Servlet核心技术
基本概念
C/S架构优点:
客户端的界面和功能可以很丰富
应用服务器负载较轻
相应速度较快
C/S架构缺点:
适用面窄,用户群体确定
维护和升级成本高,所有客户端都需要升级版本
B/S架构的优点:
无需安装客户端,只要有浏览器即可。
适用面广,用户群不固定。
通过权限控制实现多客户访问的目的,交互性较强。
维护和升级的成本低,无需更新所有客户端版本。
B/S架构的主要缺点:
应用服务器的负荷较重。
浏览器的界面和功能想要达到客户端的丰富程度需要花费大量的成本。
在跨浏览器上不尽如人意,适配比较麻烦。
HTTP协议的概念
- HTTP协议(超文本传输协议)是用来规范浏览器与Web服务器之间如何通讯的数据格式,主要涉及浏览器的发请求格式和服务器的响应格式。
- HTTP协议通常承载于TCP协议之上,而承载于TLS或SSL协议层之上的协议就是常说的HTTPS协议。
- HTTP默认的端口号为80,HTTPS默认的端口号为443。
HTTP请求格式:客户端发送一个HTTP请求到服务器的请求消息主要包括:请求行、请求头、空白行和请求体。
HTTP响应格式:通常情况下服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息,主要包括:响应行、响应头、空白行和响应体。
Tomcat服务器
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选
Servlet的概念和使用
- Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写的服务器端程序,换句话说,Servlet就是运行在服务器上的Java类。
- Servlet用来完成B/S架构下客户端请求的响应处理,也就是交互式地浏览和生成数据,生成动态Web内容。
Servlet的编程步骤:
- 建立一个Java Web Application项目并配置Tomcat服务器。
- 自定义类实现Servlet接口或继承 HttpServlet类(推荐) 并重写service方法。
- 将自定义类的信息配置到 web.xml文件并启动项目
** Servlet接口**
基本概念:javax.servlet.Servlet接口用于定义所有servlet必须实现的方法。
方法声明 | 功能介绍 |
---|---|
void init(ServletConfig config) | 由servlet容器调用,以向servlet指示servlet正在被放入服务中 |
void service(ServletRequest req, ServletResponse res) | 由servlet容器调用,以允许servlet响应请求 |
ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此servlet的初始化和启动参数 |
String getServletInfo() | 返回有关servlet的信息,如作者、版本和版权 |
void destroy() | 由servlet容器调用,以向servlet指示该servlet正在退出服务 |
GenericServlet类:
- javax.servlet.GenericServlet类主要用于定义一个通用的、与协议无关的servlet,该类实现了Servlet接口。
- 若编写通用servlet,只需重写service抽象方法即可。
方法声明 | 功能介绍 |
---|---|
abstract void service(ServletRequest req, ServletResponse res) | 由servlet容器调用允许servlet响应请求 |
HttpServlet类
- javax.servlet.http.HttpServlet类是个抽象类并继承了GenericServlet类。
- 用于创建适用于网站的HTTP Servlet,该类的子类必须至少重写一个方法。
方法声明 | 功能介绍 |
---|---|
void doGet(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的GET请求 |
void doPost(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的POST请求 |
void init() | 进行初始化操作 |
void service(HttpServletRequest req, HttpServletResponse resp) | 根据请求决定调用doGet还是doPost方法 |
void destroy() | 删除实例时释放资源 |
Servlet 的生命周期
构造方法只被调用一次,当第一次请求Servlet时调用构造方法来创建Servlet的实例。
init方法只被调用一次,当创建好Servlet实例后立即调用该方法实现Servlet的初始化。
service方法被多次调用,每当有请求时都会调用service方法来用于请求的响应。
destroy方法只被调用一次,当该Servlet实例所在的Web应用被卸载前调用该方法来释放当前占用的资源。
POST和GET请求
GET请求特点:会将请求数据添加到请求URL地址的后面,只能提交少量的数据、不安全
** POST请求特点**:请求数据添加到HTTP协议体中,可提交大量数据、安全性好
ServletRequest接口
- javax.servlet.ServletRequest接口主要用于向servlet提供客户端请求信息,可以从中获取到任何请求信息。
- Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servlet的service方法。
方法声明 | 功能介绍 |
---|---|
String getParameter(Stringname) | 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值 |
String[] getParameterValues(String name) | 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值 |
Enumeration getParameterNames() | 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举 |
Map<String, String[]>getParameterMap() | 返回请求参数的键值对,一个键可以对应多个值 |
String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的IP地址 |
int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
HttpServletRequest接口
- javax.servlet.http.HttpServletRequest接口是ServletRequest接口的子接口,主要用于提供HTTP请求信息的功能。
- 不同于表单数据,在发送HTTP请求时,HTTP请求头直接由浏览器设置。
- 可直接通过HttpServletRequest对象提供的一系列get方法获取请求头数据。
方法声明 | 功能介绍 |
---|---|
String getRequestURI() | 返回此请求的资源路径信息 |
StringBuffer getRequestURL() | 返回此请求的完整路径信息 |
String getMethod() | 返回发出此请求的HTTP方法的名称,例如GET、POST |
String getQueryString() | 返回路径后面请求中附带的参数 |
String getServletPath() | 返回此请求中调用servlet的路径部分 |
** ServletResponse接口**
- javax.servlet.ServletResponse接口用于定义一个对象来帮助Servlet向客户端发送响应。
- Servlet容器创建ServletResponse对象,并将其作为参数传递给servlet的service方法。
方法声明 | 功能介绍 |
---|---|
PrintWriter getWriter() | 返回可向客户端发送字符文本的PrintWriter对象 |
String getCharacterEncoding() | 获取响应内容的编码方式 |
void setContentType(String type) | 如果尚未提交响应,则设置发送到客户端响应的内容类型。内容类型可以包括字符编码规范,例如text/html;charset=UTF-8 |
HttpServletResponse接口
- javax.servlet.http.HttpServletResponse接口继承ServletResponse接口,以便在发送响应时提供特定于HTTP的功能。
方法声明 | 功能介绍 |
---|---|
void sendRedirect(String location) | 使用指定的重定向位置URL向客户端发送临时重定向响应 |
Servlet接收中文乱码
解决POST接收乱码
接收之前设置编码方式: request.setCharacterEncoding(“utf-8”)
必须在调用request.getParameter(“name”)之前设置
解决GET接收乱码
将接收到的中文乱码重新编码:
// 接收到get请求的中文字符串
String name = request.getParameter("name");
// 将中文字符重新编码,默认编码为ISO-8859-1
String userName = new String(name.getBytes(“ISO-8859-1”),“utf-8");
ServletConfig接口
javax.servlet.ServletConfig接口用于描述Servlet本身的相关配置信息,在初始化期间用于将信息传递给Servlet配置对象。
配置方式:
<!-- 在web.xml中配置ServletConfig初始化参数 -->
<servlet>
<servlet-name>actionservlet</servlet-name>
<servlet-class>com.lagou.demo01.ActionServlet</servlet-class>
<!-- 配置 Serlvet 的初始化参数 -->
<init-param>
<!-- 参数名 -->
<param-name>config</param-name>
<!-- 参数值 -->
<param-value>struts.xml</param-value>
</init-param>
</servlet>
方法声明 | 功能介绍 |
---|---|
String getServletName() | 返回Servlet的别名 |
String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回null Enumeration |
getInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举 |
ServletContext getServletContext() | 返回对调用方正在其中执行的ServletContext的引用 |
ServletContext接口
- avax.servlet.ServletContext接口主要用于定义一组方法,Servlet使用这些方法与它的Servlet容器通信。
- 服务器容器在启动时会为每个项目创建唯一的一个ServletContext对象,用于实现多个Servlet之间的信息共享和通信。
- 在Servlet中通过this.getServletContext()方法可以获得ServletContext对象。
方法声明 | 功能介绍 |
---|---|
String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回null |
EnumerationgetInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举 |
String getRealPath(String path) | 返回包含给定虚拟路径的实际路径的字符串 |
String getContextPath() | 返回与此上下文关联的主路径 |
InputStream getResourceAsStream(String path) | 将位于指定路径的资源作为InputStream对象返回 |
void setAttribute(String name, Object object) | 将指定的属性名和属性值绑定到当前对象 |
Object getAttribute(String name) | 根据执行的属性名获取属性值 |
void removeAttribute(String name) | 删除指定的属性名信息 |
Servlet+JDBC应用
Servlet+JDBC应用
重定向和转发
重定向
实现重定向需要借助javax.servlet.http.HttpServletResponse接口中的以下方法
方法声明 | 功能介绍 |
---|---|
void sendRedirect(String location) | 使用指定的重定向位置URL向客户端发送临时重定向响应 |
重定向的特点
- 重定向之后,浏览器地址栏的URL会发生改变。
- 重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象。
- 重定向的URL可以是其它项目工程。
转发
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发的各个组件会共享Request和Response对象
转发的实现
绑定数据到Request对象
方法声明 | 功能介绍 |
---|---|
Object getAttribute(String name) | 将指定属性值作为对象返回,若给定名称属性不存在,则返回空值 |
void setAttribute(String name,Object o) | 在此请求中存储属性值 |
获取转发器对象
方法声明 | 功能介绍 |
---|---|
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象充当位于给定路径上的资源的包装器 |
转发操作
方法声明 | 功能介绍 |
---|---|
void forward(ServletRequest request, ServletResponse response) | 将请求从一个servlet转发到服务器上的另一个资源(Servlet、JSP文件或HTML文件) |
转发的特点
- 转发之后浏览器地址栏的URL不会发生改变。
- 转发过程中共享Request对象。
- 转发的URL不可以是其它项目工程。
Servlet线程安全
- 服务器在收到请求之后,会启动一个线程来进行相应的请求处理。
- 默认情况下,服务器为每个Servlet只创建一个对象实例。当多个请求访问同一个Servlet时,会有多个线程访问同一个Servlet对象,此时就可能发生线程安全问题。
- 多线程并发逻辑,需要使用synchronized对代码加锁处理,但尽量避免使用。
Cookie技术
- 浏览器向服务器发送请求时,服务器将数据以Set-Cookie消息头的方式响应给浏览器,然后浏览器会将这些数据以文本文件的方式保存起来。
- 当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。
使用javax.servlet.http.Cookie类的构造方法实现Cookie的创建。
方法声明 | 功能介绍 |
---|---|
Cookie(String name, String value) | 根据参数指定数值构造对象 |
使用javax.servlet.http.HttpServletResponse接口的成员方法实现Cookie的添加。
方法声明 | 功能介绍 |
---|---|
void addCookie(Cookie cookie) | 添加参数指定的对象到响应 |
使用javax.servlet.http.HttpServletRequest接口的成员方法实现Cookie对象的获取。
方法声明 | 功能介绍 |
---|---|
Cookie[] getCookies() | 返回此请求中包含的所有Cookie对象 |
使用javax.servlet.http.Cookie类的构造方法实现Cookie对象中属性的获取和修改。
方法声明 | 功能介绍 |
---|---|
String getName() | 返回此Cookie对象中的名字 |
String getValue() | 返回此Cookie对象的数值 |
void setValue(String newValue) | 设置Cookie的数值 |
Cookie的生命周期
默认情况下,浏览器会将Cookie信息保存在内存中,只要浏览器关闭,Cookie信息就会消失。
方法声明 | 功能介绍 |
---|---|
int getMaxAge() | 返回cookie的最长使用期限(以秒为单位) |
void setMaxAge(int expiry) | 设置cookie的最长保留时间(秒) |
** Cookie的路径问题**
浏览器在访问服务器时,会比较Cookie的路径与请求路径是否匹配,只有匹配的Cookie才会发送给服务器。
访问的请求地址必须符合Cookie的路径或者其子路径时,浏览器才会发送Cookie信息。
方法声明 | 功能介绍 |
---|---|
void setPath(String uri) | 设置cookie的路径信息 |
Cookie的特点
Cookie技术不适合存储所有数据,程序员只用于存储少量、非敏感信息,原因如下:
- 将状态数据保存在浏览器端,不安全。
- 保存数据量有限制,大约4KB左右。
- 只能保存字符串信息。
- 可以通过浏览器设置为禁止使用。
Session技术
- 浏览器访问服务器时,服务器会为每一个浏览器都在服务器端的内存中分配一个空间,用于创建一个Session对象,该对象有一个id属性且该值唯一,我们称为SessionId,并且服务器会将这个SessionId以Cookie方式发送给浏览器存储。
- 浏览器再次访问服务器时会将SessionId发送给服务器,服务器可以依据SessionId查找相对应的Session对象
使用javax.servlet.http.HttpServletRequest接口的成员方法实现Session的获取
方法声明 | 功能介绍 |
---|---|
HttpSession getSession() | 返回此请求关联的当前Session,若此请求没有则创建一个 |
使用javax.servlet.http.HttpSession接口的成员方法实现判断和获取。
方法声明 | 功能介绍 |
---|---|
boolean isNew() | 判断是否为新创建的Session |
String getId() | 获取Session的编号 |
使用javax.servlet.http.HttpSession接口的成员方法实现属性的管理
方法声明 | 功能介绍 |
---|---|
Object getAttribute(String name) | 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定,则返回空值 |
void setAttribute(String name, Object value) | 使用指定的名称将对象绑定到此会话 |
void removeAttribute(String name) | 从此会话中删除与指定名称绑定的对象 |
Session的生命周期
- 为了节省服务器内存空间资源,服务器会将空闲时间过长的Session对象自动清除掉,服务器默认的超时限制一般是30分钟。
- 使用javax.servlet.http.HttpSession接口的成员方法实现失效实现的获取和设置。
方法声明 | 功能介绍 |
---|---|
int getMaxInactiveInterval() | 获取失效时间 |
void setMaxInactiveInterval(int interval) | 设置失效时间 |
Session的特点
- 数据比较安全。
- 能够保存的数据类型丰富,而Cookie只能保存字符串。
- 能够保存更多的数据,而Cookie大约保存4KB。
- 数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务器的性能。
JSP核心技术
** JSP的概念**
JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。
** JSP的语法**
JSP语法结构
== 声明区==:
基本语法:
<%! %>
说明:可以定义全局变量、方法、类。
程序代码区:
基本语法:
<%程序代码区%>
说明:可以定义局部变量以及放入任何的Java程序代码。
表达式:
基本语法:
<%=… …%>
说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。
注意:不需要以;结束,只有一行
注释:
格式:
<%–… …–%> JSP文件的注释,浏览器看不到
<%//… …%> Java语言中的单行注释,浏览器看不到
<%/… …/%> Java语言中的多行注释,浏览器看不到
注释的内容不会被执行
指令和动作:
指令格式:
<%@指令 属性=“属性值”%>
指令的属性可以设定多个。
JSP常用指令有:page、taglib、include
page指令
page指令用于导包和设置一些页面属性
taglib指令
taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
include指令
include指令用于引入另一个JSP程序或HTML文件等
jsp:include/jsp:param
jsp:include动作用于引入另一个JSP程序或HTML文件等。
执行到include时,被include的文件才会被编译。
如果include的是jsp文件,那它不会被转换成Servlet文件。
include指令和include动作的区别
include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)。
include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入
jsp:forward/jsp:param
forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
JSP内置对象
- 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
- 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。
** 对象名称**
方法声明 | 功能介绍 | 作用 |
---|---|---|
out | JSPWriter | 输出流 |
request | HttpServletRequest | 请求信息 |
response | HttpServletResponse | 响应信息 |
session | HttpSession | 会话 |
application | ServletContext | 全局的上下文对象 |
pageContext | PageContext | JSP页面上下文 |
page | Object | JSP页面本身 |
config | ServletConfig | Servlet配置对象 |
exception | Throwable | 捕获网页异常 |
out内置对象
out内置对象是一个缓冲的输出流,用来给客户端输出信息。
request内置对象
request对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
该对象的属性值只在一个请求中保存。
response内置对象
response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
session内置对象
session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
application内置对象
application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
在整个服务器上保存数据,所有用户共享。
pageContext内置对象
pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
只在一个页面中保存数据。
exception内置对象
exception 对象是Throwable的实例,表示的是JSP的异常信息。
如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
JavaBean组件
使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” />
保存范围有:page|request|sessin|application,默认为page范围。
使用jsp:setProperty的方式设置javaBean的属性值
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>
MVC设计模式
MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
C:主要负责流程控制 和 页面跳转,通常由Servlet完成。