2. servlet

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中<web-app>这个节点中任意地方配置全局参数
		<!-- 全局参数 -->
  <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   服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值