Servlet(前后端交互)
回顾:
1.B/S:通过浏览器访问服务器的项目.eg:京东,淘宝,门户网站.使用和升级比较方便,对客户 端电脑配置要求低.服务器端压力大,界面粗糙.
C/S:通过客户端访问服务器的项目.eg:QQ,lol,tota. 可以充分复用客户端的个人电脑减轻 服务端压力,界面比较精美.
2.web项目静态资源:页面上数据是固定不变.eg:html+css+js
web项目动态资源:页面上数据从后台获取实时更新的.eg:servlet,jsp
3.服务器容器:本质是一种软件,它可以将web项目发布到网上去.
eg:tomcat,glassfish,websphere,weblogic,Jboss,resin
4.tomcat:是apach公司的子项目,是与sun一起开发的.开源,免费,体积小.最新java技术在 tomcat可以得到完美支持和体现.
5.tomcat的目录:bin,conf,lib,logs,temp,webapps,work.
1.Servlet:
是服务器端程序,作用是实现前后台交互.本质是一种特殊Java程序.
2.Servlet家族系谱图:
3.手动创建Servlet:
3.1:创建一个java类,让这个java类继承或实现Servlet家族中任意一代.
3.2:在Servlet类中重写init(),destroy(),处理请求doGet()和doPost();
3.3:在项目的web.xml中注册Servlet并配置映射路径
<!-- 注册Servlet -->
<servlet>
<!-- servlet注册名,自定义 -->
<servlet-name>aa</servlet-name>
<!-- 当前注册的servlet在项目中路径 -->
<servlet-class>com.qf.day14.servlet.FirstServlet</servlet-class>
</servlet>
<!-- 配置Servlet映射路径 -->
<servlet-mapping>
<!-- servlet名称,与注册名称一致-->
<servlet-name>aa</servlet-name>
<!-- 当前这个Servlet供前端访问路径,路径名自定义 -->
<url-pattern>/a1</url-pattern>
</servlet-mapping>
4.Web项目执行原理:
5.Servlet的生命周期:
5.1:客户端发送http请求到服务器容器(tomcat).
5.2:服务器容器接收请求并处理
5.3:由服务器容器找到对应Servlet并调用Servlet构造方法(只调用一次)
创建Servlet实例
5.4:由服务器容器通过Servlet实例调用init()初始化方法(只调用一次)
5.5:由服务器容器通过Servlet实例调用处理请求的方法service()下面派生doGet()
和doPost();
5.6:由Servlet实例将请求处理的结果返回给服务器容器
5.7:服务器容器将请求处理的结果响应给客户端
5.8:由服务器容器通过Servlet实例调用destory()方法(只调用一次)销毁Servlet,释放 资源.
6.Servlet的生命阶段:
6.1:实例化阶段:由服务器容器找到对应Servlet并调用Servlet构造方法创建Servlet实例.
6.2:初始化阶段:由服务器容器通过Servlet实例调用init()初始化方法
6.3:请求处理阶段:由服务器容器通过Servlet实例调用处理请求的方法service()下面分发 doGet()和doPost();
6.4:服务终止阶段:由服务器容器通过Servlet实例调用destory()方法销毁Servlet,释放资源.
7.Servlet是单例的,可以供多个线程来访问.
8.Servlet的初始化参数:
8.1:初始化参数的配置
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>com.qf.day14.servlet.FirstServlet</servlet-class>
<!-- 声明初始化变量,在类加载时加载,作用等同于成员变量 -->
<init-param>
<param-name>sname</param-name>
<param-value>小白菜</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>aa</servlet-name>
<url-pattern>/a1</url-pattern>
</servlet-mapping>
8.2:获得初始化参数的value值:在当前Servlet
//获得FirstServlet中初始化变量
String name=this.getInitParameter("sname");
System.out.println("FirstServlet中初始化变量sname="+name);
9.Web项目上下文对象ServletContext的使用:相当整个web项目全局对象,web项目任意地方都 可以共享这个全局对象中数据.
9.1:在web.xml中这个节点中任意地方配置全局参数
<!-- 全局参数 -->
<context-param>
<param-name>studentName</param-name>
<param-value>冯尉明</param-value>
</context-param>
9.2:在web项目中通过上下文对象在任何地方获取全局参数
//获得全局参数,this代表当前类的对象,FirstServlet的对象
ServletContext sc= this.getServletContext();//先用当前Servlet对象获得上下文对象
String stuName=sc.getInitParameter("studentName");//用上下文对象获得全局参数的值
System.out.println("全局参数studentName="+stuName);
9.3:可以用上下文对象存值(整个web项目共享的值),也可以上下取出存的值.
eg://用上下文对象存值,按key-value方式存值,key名自定义,value是我们要存的值
sc.setAttribute("studentAge", 18);
sc.setAttribute("studentHobby", "篮球");
//从上下文对象中按Key名取出对应value
Object studentAge=sc.getAttribute("studentAge");
Object studentHobby=sc.getAttribute("studentHobby");
System.out.println("1年龄:"+studentAge+",爱好:"+studentHobby);
//从上下文对象中按Key名移除Key-value对
sc.removeAttribute("studentAge");
//从上下文对象中按Key名取出对应value
Object studentAge2=sc.getAttribute("studentAge");
Object studentHobby2=sc.getAttribute("studentHobby");
System.out.println("1年龄:"+studentAge2+",爱好:"+studentHobby2);
10.Servlet3.0之前,只支持配置版Servlet,但是在Servlet3.0以后支持注解版的Servlet和配 版的Servlet都支持.默认2.5版本web项目默认用的配置版Servlet,3.0版本web项目默认 采用注解版Servlet.所有web项目都支持注解版和配置版的Servlet.
10.1:注解版Servlet,在Servlet的类上面加@WebServlet注解,表示Servlet在web项目中注册了.注册的属性可以配置以下.
10.2:Servlet3.0注解web项目,服务器容器会先加载项目,再自动扫描注解.
10.3:案例:
/**
* 第二个Servlet
*/
//用name属性配置注册名,value配置映射路径,initParams配置是初始化参数
//@WebServlet(name="SecondServlet",value="/SecondServlet",initParams= {@WebInitParam(name="teacherName",value="谢宇")})
//SecondServlet的注册名与类名相同,映射路径就是/SecondServlet
@WebServlet("/SecondServlet")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SecondServlet() {
System.out.println("创建SecondServlet的实例");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
* @param request请求对象,请求中所有数据都封装在这个对象中
* @param response 响应对象,响应给前端的信息都封装在这个对象中
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行doGet方法");
//获得初始化参数
String name=this.getInitParameter("teacherName");
System.out.println("初始化参数teacherName="+name);
//获得全局参数
ServletContext sc= this.getServletContext();//获得上下文对象
String stuName=sc.getInitParameter("studentName");
System.out.println("全局参数studentName="+stuName);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
* @param request请求对象,请求中所有数据都封装在这个对象中
* @param response 响应对象,响应给前端的信息都封装在这个对象中
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行doPost方法");
}
}
11.Http协议:超文本传输协议.是一种请求-响应,无状态的,应用层协议.
一次请求:客户端发送一个http请求到服务器,服务器响应客户端的请求,这次请求就完成 了.
11.1:特点:
11.1.1:支持客户端/服务器模式。
11.1.2:简单快速
11.1.3:灵活
11.1.4:无连接
11.1.5:无状态.
11.2:Http协议是一种无状态的协议:下一次请求与上一次请求无关,上一次请求完成时, 请求中数据全部销毁,下一次请求无法获得上一次请求中数据.
11.3:http请求组成:请求行(请求方法/地址 URI协议/版本)+请求头(Request Header)+ 空行+请求正文.
//请求行
POST /hello HTTP/1.1
//请求头
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/* ;q=0.8 Accept-Language:zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4 Connection:Keep-Alive Host:localhost:8080 User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 Accept-Encoding:gzip, deflate, br
//空行
//请求正文
username=zhangsan&age=20&add=beijing
11.4:http响应组成:状态行+响应头+空行+响应正文
//状态行
HTTP/1.1 200 OK
//响应头
Server: nginx Date: Tue, 31 May 2016 02:09:24 GMT Content-Type: text/html;charset=UTF-8 Connection: keep-alive Vary: Accept-Encoding Access-Control-Allow-Origin: * Access-Control-Allow-Headers: X-Requested-With,access_token,access-token,contenttype,multipart/form-data,application/x-www-form-urlencoded Access-Control-Allow-Methods: GET,POST,OPTIONS Content-Length: 49
//空行
//响应正文
<!DOCTYPE html>
<html>
<head>
<title>网页标题</title>
<meta charset="utf-8">
</head>
<body>
网页内容
</body>
</html>
11.5:响应状态码:
第一个数字有五种可能的取值:
-
1xx: 指示信息—表示请求已接收,继续处理。
-
2xx: 成功—表示请求已经被成功接收、理解、接受。
-
3xx: 重定向—要完成请求必须进行更进一步的操作。
-
4xx: 客户端错误—请求有语法错误或请求无法实现。
-
5xx: 服务器端错误—服务器未能实现合法的请求。
状态代码 状态描述 说明
200 OK 客户端请求成功
301 永久重定向
302 临时重定向
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthonzed 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,
例如:输入了错误的URL;请求项目名,没有配置默认起始页面;你的默认起 始页面没有放在WebContent目录下.500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户 端的请求。(代码写错了)
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常.
总结:
1.tomcat自动发布(2种)
2.Servlet定义
3.Servlet的家族
4.手动创建Servlet
5.Servlet生命周期和阶段
6.Servlet中简单使用请求和响应对象