传统的servlet

文章的简介

  1. tomcat的目录和Web应用的目录结构
  2. 开发Servlet步骤
  3. Http协议

tomcat的目录和Web应用的目录结构

  • tomcat的目录
		|-bin: 存放tomcat的命令。
				catalina.bat 命令:
					startup.bat  -> catalina.bat start	
					shutdown.bat - > catalina.bat stop
	    |- conf: 存放tomcat的配置信息。其中server.xml文件是核心的配置文件。
		|-lib:支持tomcat软件运行的jar包。其中还有技术支持包,如servlet,jsp
		|-logs:运行过程的日志信息
		|-temp: 临时目录
		|-webapps: 共享资源目录。web应用目录。(注意不能以单独的文件进行共享)
		|-work: tomcat的运行目录。jsp运行时产生的临时文件就存放在这里

  • Web应用的目录
		|- WebRoot :   web应用的根目录
				|- 静态资源(html+css+js+image+vedio)
				|- WEB-INF : 固定写法。
					|-classes: (可选)固定写法。存放class字节码文件
					|-lib: (可选)固定写法。存放jar包文件。
					|-web.xml    
	
		注意:
			1)WEB-INF目录里面的资源不能通过浏览器直接访问
			2)如果希望访问到WEB-INF里面的资源,就必须把资源配置到一个叫web.xml的文件中。


练习:
			1)在webapps下建立一个mybbs目录
			2)创建两个文件
					2.1 index.html  里面随便写内容	,有超链接-连接到test.html	
					2.2 test.html   里面随便写
			3)通过浏览器访问到。

Http协议

总之,浏览器中数据是通过http协议这个与服务端交互,所以http中存储了浏览器和服务端想要互发数据。

  • http请求
    服务端想要http中数据:HttpServletRequest对象
    包含:请求行,请求头,实体内容(只有POST提交的参数会放到实体内容中)
			HttpServletRequest对象作用是用于获取请求数据。

				   核心的API:
					请求行: 
						request.getMethod();   请求方式
						request.getRequetURI()   / request.getRequetURL()   请求资源
						request.getProtocol()   请求http协议版本
					
					请求头:
						request.getHeader("名称")   根据请求头获取请求值
						request.getHeaderNames()    获取所有的请求头名称

					实体内容:
						request.getInputStream()   获取实体内容数据

2.传递的请求参数如何获取:

			 GET方式: 参数放在URI后面
			 POST方式: 参数放在实体内容中

			获取GET方式参数:
					request.getQueryString();
			获取POST方式参数:
					request.getInputStream();

			问题:但是以上两种不通用,而且获取到的参数还需要进一步地解析。
			所以可以使用统一方便的获取参数的方式:
				
			 	核心的API:
				request.getParameter("参数名");  根据参数名获取参数值(注意,只能获取一个值的参数)
				request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)

				request.getParameterNames();   获取所有参数名称列表  

3.请求参数编码问题
获取数据时就涉及到编码问题了

				修改POST方式参数编码:
						request.setCharacterEncoding("utf-8");
				修改GET方式参数编码:
						手动解码:String name = new String(name.getBytes("iso-8859-1"),"utf-8");

  • Http响应
    包含:响应行,响应头,实体内容
    服务端想要发到http中数据
    HttpServletResponse对象:
			HttpServletResponse对象修改响应信息:

					响应行: 
							response.setStatus()  设置状态码
					响应头: 
							response.setHeader("name","value")  设置响应头
					实体内容:
							response.getWriter().writer();   发送字符实体内容
							response.getOutputStream().writer()  发送字节实体内容 

  • 总结
		总结:
				http协议: 浏览器和服务器之间数据传输的格式规范

				1)http请求:
						格式:
								请求行
								请求头
								空行
								实体内容(POST提交的数据在实体内容中)
						重点: 
							使用HttpServletRequest对象: 获取请求数据

			2)http响应;
					格式:
							响应行
							响应头
							空行
							实体内容(浏览器看到的内容)
					重点:
						使用HttpServletResponse对象: 设置响应数据

略:

Http协议:
		1)http协议: 对浏览器客户端和服务器端之间数据传输的格式规范。
		2)http请求:浏览器->服务器端
				格式: 
					请求行(请求方式(GET/POST) 请求资源(URI) http协议版本(http1.1))
					请求头(键值对形式存在。 host、user-agent、referer)
					一个空行
					实体内容(POST提交的参数)
				HttpServletRequest对象: 请求对象。获取请求信息。
				请求行:request.getMethod()   request.getRequestURI/getRequestURL()  request.getProtocol();
				请求头: request.getHeader("name")    request.getHeaderNames()  
				实体内容: request.getInputStream() 

				获取参数数据:(GET或POST)
						request.getParameter("name")  一个值的参数
						request.getParameterValues("name"); 多个值的参数
						request.getParameterNames()    所有参数
						
		3)http响应: 服务器->浏览器端
				格式: 
					响应行(http协议版本 状态码 描述)
						常用的状态码: 200   302  404   500
					响应头( location(结合302状态码完成请求重定向功能)、 refresh(定时刷新)、content-type、							content-disiposition(以下载方式打开)) 
					一个空行
					实体内容
				HttpServletResponse对象: 响应对象。设置响应信息。
					响应行: response.setStatus();
					响应头: response.setHeader("name","value")
					实体内容: 
							(PrintWriter) response.getWriter().writer(); 字符内容
						  (OutputStream)response.getOutputStream().writer();  字节内容

Servlet

  • 开发Servlet步骤
				开发一个Servlet程序的步骤:
						1)创建一个java类,继承HttpServlet类
						2)重写HttpServlet类的doGet方法或doPost方法
						3)把写好的servlet程序交给tomcat服务器运行!!!!
							3.1 把编译好的servlet的class文件拷贝到tomcat的一个web应用中。(web应用										的WEB-INF/classes目录下)		
							3.2 在当前web应用的web.xml文件中配置servlet
									<!-- servlet配置 -->
									<servlet>
										<servlet-name>HelloServlet</servlet-name> @自定义,一般用所写类名
										<servlet-class>gz.itcast.HelloServlet</servlet-class>  @包名+类名
									</servlet>
									<!--  servlet的映射配置 -->
									<servlet-mapping>
										<servlet-name> HelloServlet </servlet-name>
										<url-pattern>/hello</url-pattern>  @自定义

									</servlet-mapping>
						4)访问servlet
								http://localhost:8080/myweb/hello

servlet程序的class码是放到WEB-INF/classes目录(因为web-inf下东西不能直接访问,class文件也是,所以放到web-inf下。个人理解)

  • servlet缺省路径和servlet访问流程
servlet缺省路径
		servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。

		问题: URL输入http://localhost:8080/day10/index.html 如何读取文件????

		1)到当前day10应用下的web.xml文件查找是否有匹配的url-pattern。
		2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
		3)DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件。
		4)如果找到该文件,则读取该文件内容,返回给浏览器。
		5)如果找不到该文件,则返回404错误页面。

			结论: 先找动态资源,再找静态资源。

个人理解:当有配置一个映射路径,默认还有个缺省路径

  • Servlet重要的四个生命周期方法
			构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象							只调用1次。证明servlet对象在tomcat是单实例的。
			init方法: 创建完servlet对象的时候调用。只调用1次。
			service方法: 每次发出请求时调用。调用n次。
			destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。
							只调用1次。

用图表示:

在这里插入图片描述
2.在了解这些生命周期后,要知道在当中几个对象
1) ServletConfig对象

1 作用
			ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
2 对象创建和得到
			创建时机: 在创建完servlet对象之后,在调用init方法之前创建。
			得到对象: 直接从有参数的init方法中得到!!!

3 servlet的初始化参数配置
  <servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
    <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
    <init-param>
    	<param-name>path</param-name>
    	<param-value>e:/b.txt</param-value>
    </init-param>
  </servlet>
注意: servlet的参数只能由当前的这个sevlet获取!!!!

				ServletConfig的API:
					java.lang.String getInitParameter(java.lang.String name)  根据参数名获取参数值
					java.util.Enumeration getInitParameterNames()    获取所有参数
				    ServletContext getServletContext()     得到servlet上下文对象
					java.lang.String getServletName()       得到servlet的名称

2)ServletContext对象

1 引入
		ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一							个ServletContext对象。
2 对象创建和得到
			创建时机:加载web应用时创建ServletContext对象。
			得到对象: 从ServletConfig对象的getServletContext方法得到
3.ServletContext对象的核心API(作用)
		
			java.lang.String getContextPath()   --得到当前web应用的路径

			java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
			java.util.Enumeration getInitParameterNames()  

			void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
			java.lang.Object getAttribute(java.lang.String name)  
			void removeAttribute(java.lang.String name)  

			RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

			java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
			java.io.InputStream getResourceAsStream(java.lang.String path)  

4.得到web应用路径
				java.lang.String getContextPath()  用在请求重定向的资源名称中
			10.4得到web应用的初始化参数(全局)
			java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
			java.util.Enumeration getInitParameterNames()  

				web应用参数可以让当前web应用的所有servlet获取!!!
5.域对象有关的方法
				域对象:作用是用于保存数据,获取数据。可以在不同的动态资源之间共享数据。

					案例:   
					Servlet1                   Servlet2
			        name=eric                     
				response.sendRedirect("/Servlet2?name=eric")             String request.getParameter("name");
					保存到域对象中            从域对象获取
					Student                  
				方案1: 可以通过传递参数的形式,共享数据。局限:只能传递字符串类型。
				方案2: 可以使用域对象共享数据,好处:可以共享任何类型的数据!!!!!

				ServletContext就是一个域对象!!!!

			保存数据:void setAttribute(java.lang.String name, java.lang.Object object)					
			获取数据: java.lang.Object getAttribute(java.lang.String name)  
			删除数据: void removeAttribute(java.lang.String name)  

			ServletContext域对象:作用范围在整个web应用中有效!!!

					所有域对象:
						HttpServletRequet 域对象
						ServletContext域对象
						HttpSession 域对象
						PageContext域对象	

  • [ ]总结
Servlet编程
	 1)Servlet生命周期(重点)
		构造方法: 创建servlet对象。默认情况下,第一次访问servlet对象时。只调用1次。
		init方法(有参): 创建完servlet对象后调用。只调用1次。
				注意: 会调用无参的init方法。
		service方法: servlet提供服务的方法。每次发出请求调用。
				注意: request对象 ,response对象
		destroy方法: tomcat服务器停止或web应用重新部署,servlet对象销毁,destroy方法被调用。
	2)ServletConfig对象
			获取servlet的初始化参数:
				getInitParameter("name	");
				getInitParameterNames();
	3)ServletContext对象
			得到web应用路径:
					context.getContextPath();
					request.getContextPath();  等价于上面的代码
			得到web应用参数:
					context.getInitParameter("name");
					context.getInitParameterNames();
			域对象:
					context.setAttribute("name",Object): 保存数据
					context.getAttribute("name")   得到数据
					context.removeAttribue("name")  清除数据
			转发
					context.getRequestDispatcher("路径").forward(request,response);
					request.getRequestDispacher("路径").forward(request,response);  等价于上面的代码
			得到web应用中的资源文件
					context.getRealPath("路径")
					context.getResourceAsStream("路径");

会话

  • Cooke技术
3.1 特点
			Cookie技术:会话数据保存在浏览器客户端。
			3.2 Cookie技术核心
			Cookie类:用于存储会话数据

				1)构造Cookie对象
					Cookie(java.lang.String name, java.lang.String value)
				2)设置cookie
					void setPath(java.lang.String uri)   :设置cookie的有效访问路径
					void setMaxAge(int expiry) : 设置cookie的有效时间
					void setValue(java.lang.String newValue) :设置cookie的值
				3)发送cookie到浏览器端保存
					void response.addCookie(Cookie cookie)  : 发送cookie
				4)服务器接收cookie
					Cookie[] request.getCookies()  : 接收cookie

			3.3 Cookie原理
				1)服务器创建cookie对象,把会话数据存储到cookie对象中。
						new Cookie("name","value");
				2)	服务器发送cookie信息到浏览器
						response.addCookie(cookie);

						举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)
				3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
				4)浏览器在下次访问服务器时,会带着cookie信息
					    举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)
				5)服务器接收到浏览器带来的cookie信息
						request.getCookies();
		
			3.4 Cookie的细节
			1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
			
			2)void setMaxAge(int expiry) : 设置cookie的有效时间。
					正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
					负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
					零:表示删除同名的cookie数据
			3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

			3.5 案例- 显示用户上次访问的时间
			3.6 案例-查看用户浏览器过的商品

  • Session技术
4.1 引入
			Cookie的局限:
				1)Cookie只能存字符串类型。不能保存对象
				2)只能存非中文。
				3)1个Cookie的容量不超过4KB。

			如果要保存非字符串,超过4kb内容,只能使用session技术!!!

			Session特点:
					会话数据保存在服务器端。(内存中)

			4.2 Session技术核心
			HttpSession类:用于保存会话数据

			1)创建或得到session对象
				HttpSession getSession()  
				HttpSession getSession(boolean create)  
			2)设置session对象
				void setMaxInactiveInterval(int interval)  : 设置session的有效时间
				void invalidate()     : 销毁session对象
				java.lang.String getId()  : 得到session编号
			3)保存会话数据到session对象
				void setAttribute(java.lang.String name, java.lang.Object value)  : 保存数据
				java.lang.Object getAttribute(java.lang.String name)  : 获取数据
				void removeAttribute(java.lang.String name) : 清除数据
			4.3 Session原理
				问题: 服务器能够识别不同的浏览者!!!
			现象:

	   前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!
			浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)
					1)创建session对象,保存会话数据
							HttpSession session = request.getSession();   --保存会话数据 s1
			浏览器1	的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1)	
					1)得到session对象的会话数据
						    HttpSession session = request.getSession();   --可以取出  s1

			新的浏览器1:(没有带s001,不能返回s1)
					1)得到session对象的会话数据
						    HttpSession session = request.getSession();   --不可以取出  s2

			浏览器2:(没有带s001,不能返回s1)
					1)得到session对象的会话数据
						    HttpSession session = request.getSession();  --不可以取出  s3

			
			代码解读:HttpSession session = request.getSession();
				
			1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
					new HttpSession();
			2)把JSESSIONID作为Cookie的值发送给浏览器保存
					Cookie cookie = new Cookie("JSESSIONID", sessionID);
					response.addCookie(cookie);
			3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器
			4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
					if(找到){
						return map.get(sessionID);
					}
					Map<String,HttpSession>]


					<"s001", s1>
					<"s001,"s2>
			5)如果找到对应编号的session对象,直接返回该对象
			6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
	
			结论:通过JSESSION的cookie值在服务器找session对象!!!!!
			4.4 Sesson细节
			1)java.lang.String getId()  : 得到session编号
			2)两个getSession方法:
					getSession(true) / getSession()  : 创建或得到session对象。没有匹配的session编号,自动创												建新的session对象。
					getSession(false):              得到session对象。没有匹配的session编号,返回null
			3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间
						session对象销毁时间:
							3.1 默认情况30分服务器自动回收
							3.2 修改session回收时间
							3.3 全局修改session有效时间
							
<!-- 修改session全局有效时间:分钟 -->
	<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

							3.4.手动销毁session对象
								void invalidate()     : 销毁session对象
			4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题
					
/**
		 * 手动发送一个硬盘保存的cookie给浏览器
		 */
		Cookie c = new Cookie("JSESSIONID",session.getId());
		c.setMaxAge(60*60);
		response.addCookie(c);

  • 总结
		总结:
				1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

				2)Cookie技术:
						new Cookie("name","value")
						response.addCookie(coookie)
						request.getCookies()
				3)Session技术
						request.getSession();
						
						setAttrbute("name","会话数据");
						getAttribute("会话数据")

会话管理
		1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据
		2)Cookie技术: 会话数据保存在浏览器客户端。
				Cookie核心的API:
						2.1 在服务器端创建Cookie对象
								Cookeie cookie = new Cookie("name","value");
						2.2 把cookie发送给浏览器端(通过响应头:set-cookie)
								response.addCookie(cookie);
						2.3 浏览器带着cookie信息访问服务器(通过请求头:cookie),服务器得到cookie信息
								Cookie[] cookies = request.getCookies();

			局限: 
					1)只能保存字符串类型,不能保存中文
					2)一个cookie不能超过4kb
		3)Session技术:会话数据保存在服务器端。(内存)
				Session核心的API:
						3.1 创建或得到session对象	
								HttpSession session = request.getSession(); //创建或得到session对象
								request.getSession(false); //得到session对象
						3.2 会话数据保存session对象中,和得到会话数据
								session.setAttribute("name",Object);  保存数据
								session.getAttribute("name")   得到数据
										
				注意:
						1)session.setIntactiveInterval(时间);   设置session过期时间
						2)session.invalidate()  手动销毁session对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值