JAVA servlet是和平台无关的服务器端组件,运行在Servlet容器中,比如Tomcat
Servlet容器作用:
- 创建servlet实例,调用servlet相关生命周期方法
- 负责Servlet和客户的通信,以及调用Servlet的方法
- Servlet和客户的通信采用请求/响应模式
- 运行JSP, Filter, Servlet等软件环境
Servlet可完成如下功能:
- 创建并返回基于客户请求的动态HTML页面
- 创建并嵌入到现有HTML页面的部分HTML页面(HTML片段)
- 与其他服务器资源(如数据库或基于java的应用程序)进行通信
Servlet生命周期的方法: (以下方法都是由Servlet容器负责调用)
- 构造器: 只有第一次请求Servlet时,创建Servlet实例,调用构造器,这说明Servlet是单实例
- init方法: 只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet
- service: 被多次调用,每次请求都会调用service方法,实际用于响应请求的
- destory:只被调用一次,在当前Servlet所在的Web项目被卸载前调用,用于释放当前Servlet所占用的资源
web.xml中的load-on-startup参数,配置在<servlet>节点中,如使用时<load-on-startup>1</load-on-startup> 可以指定Servlet被创建的时机,若为负数,则在第一次请求时创建,若为0或正数时,则在当前web应用被Servlet容器加载时创建实例,且数值越小,越早被创建
ServletConfig: 封装了Servlet配置信息,并且可以获取ServletContext对象
1. 配置Servlet的初始化参数
<!--配置servlet的初始化参数,要放在<servlet>内,且必须在load-on-startup节点前-->
<init-param>
<param-name>user</param-name>//参数名
<param-value>root</param-value>//参数值
</init-param>
<init-param>
<param-name>password</param-name>//参数名
<param-value>123</param-value>//参数值
</init-param>
2. 获取初始化参数
getInitParameter(String name) 获取指定参数名的初始化参数
getInitParameterNames() 获取参数名组成的Enumeration对象
ServletContext:
- 可以由ServletConfig获取
- 该对象代表当前web应用,可以认为ServletContext是当前web应用的大管家,可以从中获取到当前web应用的各个方面的信息
<!--配置当前web应用的初始化参数,在web.xml中配置-->
<context-param>//相当于全局参数,所有servlet都可用
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
使用Get和Post方式传递参数
Get方式: 把请求参数放在URL后边,用?连接;传送的数量有限制,一般限制在1KB以下
Post方式: 请求参数在请求体中,传递的数量远大于Get
MVC(Model View Control): 是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
Model指的是jdbc+mybatis,做数据映射,完成具体的业务操作,如查询数据库,封装对象;
View指的是html+js+jquery | jsp(java server page)(java+html)进行数据展示;
Control指的是servlet(java class)(data interface explosion)获取View的请求,调用模型将数据交给视图进行展示;
Protocol(协议):
最底层协议:TCP/IP transfer controll protocol/internet protocol传输控制协议/网络协议
新增了解UDP协议: user datagram protocol 用户数据包协议:
应用范围:TCP属于有状态协议,在客户端与客户端间可见服务状态,因此需要服务器来中转
UDP协议属于两个用户点对点通信,不需要单独的服务器维护
SMTP协议: simple mail transfer protocol 简单右键传输协议
FTP协议: File transfer protocol 文件传输协议
SFTP协议
HTTP(S)协议:Hyper text transfer protocol 超文本传输协议,含义超出文本范畴,比如设计音乐,视频;本质是基于单次HttpServletrequest和HttpServletresponse的协议,底层封装TCP协议,单次request连接单独服务器,获取单次response后断开,属于无状态协议
会话: Session(HttpSession) 是内置对象,维护用户状态
3. Serviets是一个类,包含两个内置对象(HttpServletrequest和HttpServletresponse),属于Control的核心
Web Container(Web容器):
Tomcat local host | 127.0.0.1 | 本地IP地址 端口号=视配置 webapps
Websphere,Weblogic等装载Web项目
Servlet开发与运行
- Servlet程序必须通过Servlet容器启动运行
- Servlet程序必须在web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问
- 一个<servlet>元素用于注册一个Servlet,它包含两个主要的子元素<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名
- 一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个主要的子元素<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径
- 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名
- Servlet映射到的URL也可以使用*通配符,只能有两种固定格式,*.扩展名,/扩展名/*
Servlet的开发流程
1. 编写一个java类,继承HttpServlet类,并重写HttpServlet类的doGet方法和doPost方法
2. 配置web.xml文件,或者使用注解对servlet进行配置
a. web.xml配置servlet内容,配置信息需写在webapp内部
<webapp>
<servlet> //servlet的配置 相当于局部参数
<servlet-name>Commodity</servlet-name>// servlet注册的名字
<servlet-class>controller.Commodity</servlet-class>//servlet的类全名
</servlet>
<servlet-mapping>//servlet的映射配置
<servlet-name>Commodity</servlet-name>//需要和某一个servlet节点的servler-name子节点的文本节点一致
<url-pattern>/fa.do</url-pattern>// 映射具体的访问路径,/代表当前web应用的根目录
</servlet-mapping>
</webapp>
当访问/fa.do的时候,服务器自然就会把请求交给Commodity进行处理了.
b. 使用@注解配置
@WebServlet(name = "Commodity",urlPatterns = {"/fa.do"})
public class LoginServlet extends HttpServlet {
}
相当于写java类时,直接加注解,当访问/fa.do的时候,服务器同样就会将处理交由Commodity进行处理
4. jsp的四个作用域
xxx.setAttribute(key,value)
xxx value=xxx.getAttribute(key)
5. java
pagecontext 页面级
request 单次请求级
session 会话级
application 应用级
三端缓存
idea缓存 File——invalidate cashes
浏览器缓存——设置——清除浏览器数据
tomcat缓存——webapps——ROOT——删除内部内容
JSP标签
SuperTagName>(TagName[attr=val, attr2=val2...]{text})*N
>表示父子关系
()表示组合关系
+表示同辈关系
[] 表示属性
{}表示文字内容
6. 请求方式
restful: 请求风格 GET/POST/PUT/DELETE/HEAD...Springweb通过过滤器实现
7. 前后端数据交互方式
http://localhost:8080/action.do?k1=v1&k2=v2 GET
window.location.href=/action.do?k1=v1&k2=v2 GET
ajax{url:"action.do", type:"get|post", data:{k1:v1,k2:v2}} GET|POST
<a herf="/action.do?k1=v1&k2=v2">...</a> GET
<form action="/action.do" method="get|post"> GET|POST
<input type="text|password|radio|checkbox..." name="k1"/>
<input type="text|password|radio|checkbox..." name="k2"/>
...
</form>
class XxxServlet extends HttpServlet{
public void doGet|doPost|service(HttpServletRequest req, HttpServletResponse resp){
//省略字符编码设置
//值提取
T v1=req. getParameter(k1);
T v2=req. getParameter(k2);
...}
后端——到前端
class XxxServlet extends HttpServlet{
public void doGet|doPost|service(HttpServletRequest req, HttpServletResponse resp){
//省略字符编码设置
//值提取
//调用service方法提取数据库内容
T v=new XxxService().xxx();
req. setParameter(key,v);
req. getRequestDispatcher("/action.do|xxx.jsp").forward(req,resp)转发,和前端请求保持一致
}
} xxx.jsp
----------------------------------------------------------------------------------
${requsterScope.key}
----------------------------------------------------------------------------------
<a herf="/action.do?k1=v1&k2=v2">...</a> 指向action.do=后台转发 指向 /action2.do=。。。指向xxx.jsp
侦听器Listener:Tomcat启动时初始化,关闭释放连接池资源
过滤器Filter:过滤用户的请求,客户端请求先至过滤器,经权限验证/统一初始化设置后滤,请求再转到servlet