薛磊 Job Seeker

JSP和Servlet笔记2

2019-04-24

1.JSP

1.JSP概述
	* JSP(Java Serve Pages) 是Java Web服务器端的动态资源。它与html页面的作用是相同的,显示数据和获取数据
	* JSP = html + Java脚本 + JSP动态标签
	* 作用
		* Servlet:
			> 缺点:不适合设置html响应体,需要大量的response.getWriter().print("<html>");
			> 有点:动态资源,可以编程
		* html:
			> 缺点:html是静态页面,不能包含动态信息
			> 优点:不用为输出html标签而发愁
		* jsp:
			> 优点:在原有html的基础上添加java脚本,构成jsp页面
	* jsp和Servle的分工
		* JSP:	(相当于一个服务员)
			> 作为请求发起页面,例如显示表单、超链接。
			> 作为请求结束页面,例如显示数据
		* Servlet:
			> 作为请求中处理数据的环节
	* JSP的组成	(相当于一个厨师)
		* JSP = html + Java脚本 + JSP动态标签
		* jsp中无需创建即可使用的对象一共有9个,被称之为9大内置对象。例如:request对象、out对象
		* 3中java脚本:
			** <%...%>:java代码片段(常用),用于定义0~N条Java语句!方法内能写什么,它就可以放什么!
			** <%=...%>:java表达式,用于输出(常用),用于输出一条表达式的结果。prnt里可以放什么,它就可以放什么
			** <%!...%>:声明,用来创建类的成员变量和成员方法(基本不用,但容易考到),类体力可以放什么,它就可以放什么
2.jsp原理(理解)
	* jsp其实是一种特殊的Servlet
	  > 当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)
	  > 然后再把java编译成.class
	  > 然后常见该类对象
 	  > 最后调用它的service()方法
	  > 第二次请求同一jsp时,直接调用service()方法
	* 在tomcat的work目录下可以找到jsp对应的.java源代码
	* 查看jsp对于java文件
	  > java脚本
	  > html
* jsp注释
	<%-- ... -- %>:当服务器把jsp编译成java文件时已经忽略了注释部分!
2. JSP三大指令
	一个jsp页面中可以有0~N个指令的定义:
	(1) page --> 最复杂:<%@page language="java" info="xxx"...%>
		* pageEncoding和contentType:
			> pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用此!
			> contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType("text/html;charset=utf-8");
			> 如果两个属性只提供一个,name另一个的默认值为设置那一个。
			> 如果两个属性都没有设置,name默认为isc
		* import:导包!可以出现多次
		* errorPage和isErrorPage
			> errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPaget来指定
			> isErrorPage:它指定当前页面是否为处理错误的页面!
				当该属性为true时这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
		* autoFlush和buffer
			> autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常!
			> buffer:指定缓冲区大小,默认为8kb,通常不需要修改!
		* isELignored:是否忽略el表达式,默认值为false,不忽略,即支持!
		* 基本没用:
			> language:指定当前jsp编译后的语言类型,默认值为java。
			> info:信息
			> isThreadSafe:当前的jsp是否支持并发访问!
			> session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象!
			> extends:让jsp生成的servlet去继承该属性指定的类!
	(2) include --> 静态包含
		* 与 RequestDispatcher的include()方法的功能相似!
		* <%@include%>它是在jsp编译成java文件时完成的!它们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
		* RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!它们只是把响应的内容在运行时合并了!
		* 作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立的Jsp,而我们只需要处理变化的页面。
	(3) tglib --> 导入标签库
		* 两个属性:
			> prefix:指定标签库在本页面中的前缀!由我们自己来起名称
			> uri:指定标签库的位置!
			> <$@taglib prefix="pre" uri="/struts-tags"%>   前缀的用法:<pre:text>
3. 九大内置对象
	* out --> jsp的输出流,用来向客户端响应
	* page --> 当前jsp对象! 它的引用类型是Object,即真身中有如下代码:Object page = this ;
	* config --> 它对应真身中的ServletConfig对象!
	* pageContext --> 一个顶9个!
	* request --> HttpServletEequest
	* response --> HttpServletResponse
	* exception --> Throwable
	* session --> HttpSession
	* application --> ServletContext

① request
	request.getParameter(string);
	//注意编码问题,可以将字符串转为字节数组,再创建字符串
	request.setAttribute(key,value); value是Object类型 
	request.getAttribute(key);
	//转发
	request.getRequestisDispatcher("login.jsp").forward(request,response);
② response
	PrintWriter writer = response.getWriter();
③ pageContext
	* 一个顶9个!
	* Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象!
		> ServletContext:整个应用程序
		> session:整个会话(一个会话只有一个用户)
		> request:一个请求链(指转发、重定向)!
		> pageContext:一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据! 
			** 域对象
			** 代理其他域:pageContext.setAttribute("xxx","XXX",ageContext.SESSION_SCOPE);
			** 全域查找:pageConte
4. HttpSession概述
	* HttpSession是由JvaWeb提高的,用来会话跟踪的类。session是服务器端对象,保存在服务器端!!!
	* HttpSession是Servlet三大域对象之一(request、session、appliaction(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
	* HttpSession底层依赖Cookie,或是URL重写!
5. HttpSession的作用
	* 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束!
		< 会话:一个用户对服务器的多次连贯性请求!所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器!
	* 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,他们被服务器保存到一个Map中,这个Map被称之为session缓存!
		> Servlet中的到session对象:HttpSession session = request.getSession();
		> Jsp中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用!
	* session域相关方法
		> void setAttribute(String name,Object value)	
		> Object getAttribute(String name);
		> void removeAttribute(String name);

2.Servlet

1.什么Servlet
	Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
	狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器

	* Serblet 是JavaWeb的三大组件之一(Servlet、Filter、Listener),属于动态资源,服务器小程序
	* 作用:处理请求,服务器会把接收到的请求交给Servlet处理
		接收请求数据  处理请求  完成响应
	* Servlet 功能需要我们自己编写
2.实现Servlet的方式(由我们编写)
	实现Servlet有三种方式:
	* 实现 javax.servlet.Servlet接口
	* 继承 javax.servlet.GenericServlet类
	* 继承 javax.servlet.http.HttpServlet类
	通常我们会去继承 HttpServlet类来完成我们的Servlet,但是从1 接口学习
	** Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用。并且Servlet的对象也不由我们来创建,由Tomcat创建

	生命周期方法
	* void init(ServletConfig):出生之后(1次)
	* void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
	* void destory():临死之前(1次)
	特性:
	* 单例,一个类只有一个对象;当然可能存在多个Servlet类!
	* 线程不安全的,所以他的效率是高的

	Servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法
3.GenericServlet
	是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet
	
	ServletConfig是什么? 见图9_3

4.Servlet细节(线程安全)
	* 不要创建成员变量,使用局部变量
	* 可以创建无状态的成员
	* 可以创建有状态的成员,但状态必须为只读的 
一个类型的Servlet只有一个实例对象,有可能一个Servlet同时处理多个请求

* 在第一次访问时创建Servlet
* 在服务器启动时创建Servlet,必须在xml写语句,定义启动顺序
	<load-on-startup>0</load-on-startup>

<url-pattern>/AServlet</url-pattern> 路径   也可以写通配符  /路径匹配(优先级最高)   .扩展名匹配
	*只能放在两边,放前面 路径匹配  放后面 扩展名匹配
	/*匹配所有url(优先级最低)
	*.do  匹配扩展名
5.web.xml文件继承(了解)
在\conf\web.xml中的内容,相当于写到了每个项目的web.xml中,它是所有web.xml的父文件
6.ServletContext(重要)
	一个项目只有一个ServletContext对象
	我们可以咋N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据
	* ServletContext对象的创建是在服务器启动时完成的
	* ServletContext对象的销毁是在服务器关闭时完成的
	* ServletContext对象的作用是在整个Web应用的动态资源之间共享数据!
	
	* ServletContext的获取
		在GenericeServlet或HttpServlet中获取ServletContext对象   (ServletConfig、ServletContextEvent也有这个方法
			getServletContext()方法
		this.getServletConfig().getServletContext();
7.域对象的功能
	域对象就是用来在多个Servlet中传递数据,域对象内部有一个Map用来存储数据
		* 域对象必须有要存数据功能
		* 域对象必须要有取数据功能
	ServletContext是JavaWeb四大域对象之一
	(PageContext、ServletRequest、ServletContext)
	* ServeletContext对象用来操作数据的方法

		* void setAttribute(String name,Object value):用来存储一个对象(存出一个域属性) 多次调用该方法,并且使用相同的nmae 那么么会覆盖上一次的值
		* Object getAttribute(String name):用来获取ServletContext中的数据
		* void removeAttribute(String name):用来移除ServletContext中的域属性
		* Enumeration getAttributeNames():获取所有域属性的名称
	* Sevlet也可以获取初始化参数,但他是局部的参数;
		一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Serlvet准备
	* 可以配置公共的初始化参数,为所有Servlet而用!这需要使用ServletContext才能使用
8.获取资源的方法(**************************)
	* 获取真实路径
		String path = this.getServletContext().getRealPath("/index.jsp");
	* 获取资源流
		 * 获取资源的路径后,再创建输出流对象!
		InputStream input = this.getServletContext().getResourceAsStream("index.jsp");
	* 获取所有资源路径
		 * 获取当前路径下所有资源路径
		Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");
9.练习:访问量统计
	一个项目中所有的资源被访问都要对访问量进行累加
	创建一个int类型的变量,用来保存访问量,然后把它保存到ServletContext的域中,这样可以保存所有的Servlet都可以访问到
	* 最初时,ServletContext中没有保存访问量相关的属性;
	* 当本站被第一次访问时,创建一个变量,设置其值为1;保存到ServletContext中;
	* 当以后的访问时,就可以从ServletContext中获取这个变量,然后在其基础上加1。

	* 获取ServletContext对象,查看是否存在名为count的属性,如果存在,说明不是第一次访问,如果不存在,说明是第一次访问
		* 第一次访问:调用ServletContext的setAttribute()传递一个属性,名为count,值为1;
		* 后续访问:调用ServletContext的getAttribute()方法获取原来的访问量,给访问量+1,再调用
			ServletContetx()的setAttribute()方法进行设置
	* 代码
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext app = this.getServletContext();
		Integer count =(Integer)app.getAttribute("count");
		if(count==null){
			app.setAttribute("count", 1);
		}else{
			app.setAttribute("count", count+1);
		}
		/*
		 * 向浏览器输出
		 *  需要使用响应对象
		 */
		PrintWriter pw = response.getWriter();
		pw.print("<h1>"+count+"</h1>");
	}

Comments

Content