servlet和jsp学习总结

时间:2022-10-28 21:03:52

 

一、servletConfig部分
作用:
ServletConfig 对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息
使用:
获取ServletConfig对象
获取web.xml中的Servlet的配置信息
二、servletContext部分

package com.hpu.cn;

import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class servletContext extends HttpServlet {

	/* ServletContext学习:
	 *    问题:
	 *       不同的用户使用相同的数据
	 *    解决:
	 *       ServletContext对象
	 *    特点:
	 *       服务器创建
	 *       用户共享
	 *    作用域:
	 *       整个项目以内
	 *    生命周期:
	 *       服务器启动到关闭
	 *    使用:
	 *       //获取ServletContext对象
		          //第一种方式
		          ServletContext sc=this.getServletContext();
		          //第二种方式
		          ServletContext sc2=this.getServletConfig().getServletContext();
		          //第三种方式
		          ServletContext  sc3=req.getSession().getServletContext();
	 *       使用ServletContext对象完成数据共享
	 *           //数据存储
	 *           sc.setAttribute(String key, Object value);
	 *           //数据共享
	 *           sc.getAttribute("str")返回为Object类型
	 *           注意:
	 *              不同的用户可以给ServletContext数据存储
	 *              获取的数据不存在则返回null
	 *       获取项目中的web.xml的配置信息
	 *            sc.getInitParameter(String name);根据键的名称获取在web.xml中全局数据的值,返回String类型
	 *                                             如果不存在返回null
	 *            sc.getInitParameterNames(); 返回键名称的枚举
	 *          配置方式:注意一组<context-param>标签只能存储一组键值对数据,多组声明多个标签
	 *               <context-param>
                          <param-name>name</param-name>
                           <param-value>zhangsan</param-value>
                     </context-param> 
                                                作用:将静态数据与代码解耦
             //获取项目webroot下的资源的绝对路径                             
                   String path=sc.getRealPath("/doc/1.txt");
                                                         获取的路径为项目根目录。参数为项目根目录中的路径
             //获取webroot下的资源的流对象 
                    InputStream resourceAsStream = sc.getResourceAsStream("/doc/1.txt"); 
                                                             参数为项目根目录中的路径                                     
                                                           注意:
                                                                 此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类的加载器获取                                      
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取ServletContext对象
		   //第一种方式
		   ServletContext sc=this.getServletContext();
		   //第二种方式
		   ServletContext sc2=this.getServletConfig().getServletContext();
		   //第三种方式
		   ServletContext  sc3=req.getSession().getServletContext();
	   //使用ServletContext对象完成数据共享
		   //数据存储
		   sc.setAttribute("str", "servletcontext学习");
	   //获取项目中web.xml的全局配置数据
		   String name = sc.getInitParameter("name");
		   System.out.println(name);
	   //获取项目根目录下的资源的绝对路径
		   String path=sc.getRealPath("/doc/1.txt");
		   System.out.println(path);
	   //获取项目根目录下资源的流对象
		   InputStream resourceAsStream = sc.getResourceAsStream("/doc/1.txt");
	}
}

三、session部分

package com.hpu.Servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionServlet extends HttpServlet {
		/* (non-Javadoc)
		 * 一个用户的不同请求处理,数据共享怎么办
		 *  解决:使用Session
		 *  特点:
		 *      存储在服务器
		 *      服务器进行创建
		 *      依赖Cookie技术
		 *      一次会话
		 *      默认存储时间30分钟
		 *  作用:
		 *     解决了一个用户不同请求处理数据共享的问题
		 *  使用:创建Session对象/获取session对象
		 *      HttpSession hs=req.getSession();
		 *     
		 *          如果请求中拥有session标识符也就是JSESSIONID,则返回其对应的session对象
		 *          如果请求中没有session的标识符也就是JSEESIONID,则创建新的session对象,并将其JSESSIONID作为Cookie数据存储到浏览器运存中
		 *          如果session对象失效了,也会创建一个session对象,则......
		 *      //设置session存储时间
		 *      hs.setMaxInactiveInterval(int seconds); 
		 *        // 在指定的时间内session对象没有使用则被销毁,如果使用重新计时
		 *      //设置强制失效
		 *      hs.invalidate();
		 *      存储:hs.setAttribute(String key, Object value);
		 *      获取:hs.getAttribute(String name);
		 *      注意:
		 *         存储的动作和取出的动作发生在不同请求中,但是存储要先于取出执行
		 *      使用场景:
		 *           一般用户在登陆web项目时候 会将个人信息存储到Session中,供该用户的其他请求使用
		 *      总结:
		 *      session解决了一个用户的不同请求数据共享问题,只要JSESSIONID和Session对象失效的情况下,用户的任意请求都能获取到同一个session
		 *      作用域:
		 *          一次会话
		 *          在JSESSIONID不失效和Session不失效,作用域是整个项目 
		 *      session失效处理:
		 *            将用户请求中的JSESSIONID和后台获取的session对象的JSESSIONID进行对比
		 *            如果一致,则session没有失效,如果不一致则证明session失效。重定向登陆页面,让用户登录
		 *  注意:JSESSIONID存储在Cookie的临时存储空间中,浏览器关闭即失效
		 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
		 */
		@Override
		protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //设置请求编码格式
			req.setCharacterEncoding("utf-8");
		   //设置相应编码格式
			resp.setContentType("text/html;charset=utf-8");
		   //获取请求信息
			    //创建session对象
			    HttpSession hs=req.getSession();
			    //设置session时间
			    //hs.setMaxInactiveInterval(5);
			    //设置强制失效
			    //hs.invalidate();
			    hs.setAttribute("key", "namessss");
			     System.out.println(hs.getId());
		   //处理请求信息
			resp.getWriter().write("Session学习");
		}
}

四、请求转发
req.getRequestDispatcher(“要转发的地址”).forward(req, resp);
转发地址:相对路径,直接书写servlet的别名即可
特点:一次请求,浏览器地址栏信息不变,
注意;请求转发后直接return
五、重定向

问题:使用请求转发,造成表单数据重复提交

解决: 使用重定向

使用:
       resp.sendRedirect("路径");
       本地路径为;uri
       网络路径为:定向资源的URL信息

特点:
       两次请求,浏览器地址栏信息改变,两个request对象
request作用域:
                     解决了一次请求内的servlet共享的问题
        
重定向:
          解决了表单重复提交的问题,以及当前servlet无法处理的请求问题

使用场景:
             如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
             如果请求被Servlet接收后,无法进行处理,建议使用重定向到可以处理的

六、Cookie部分

package com.hpu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class cookieServlet extends HttpServlet {

	/* Cookie学习
	 * 作用:解决了发送不同请求的数据共享问题
	 * 使用:
	 *      //创建cookie对象
	 *      Cookie c =new Cookie(key, value);
	 *      //设置有效期
	 *      c.setMaxAge(int seconds);
	 *      //设置有效路径
	 *      c.setPath(String uri);
	 *      //响应cookie给客户端
	 *      resp.addCookie(c);
	 *      //Cookie获取
	 *       //获取Cokkie数据
	 *       Cookie[] cookies=req.getCookies();
	 *       //遍历数组获取Cookie信息
	 *        使用for循环遍历即可
	 *       			for(Cookie c:cookies){
				String name=c.getName();
				String value = c.getValue();
				System.out.println(name+":"+value);
			}
	 *      
	 * 注意:
	 *     一个cookie只能存储一条数据,多条数据,可以创建几个Cookie存储
	 * 特点:
	 *     浏览器端的数据存储技术
	 *     存储的数据声明在服务器端
	 *     临时存储:存储在浏览器的运行内存中
	 *     定时存储:设置了Cookie的有效期,存储在客户端的硬盘里,在有效期内符合路径的要求的请求都会附带该信息
	 *     默认Cookie信息存储好之后,每次请求都会附带信息。除非设置有效路径
	 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//获取请求结果
		//处理请求结果
		   //使用cookie进行浏览器端的数据存储
			  //创建cookie对象
		    Cookie c1 =new Cookie("mouse", "thinkpad");
		    Cookie c2 =new Cookie("key", "hpu");
		     //设置cookie
		    c2.setMaxAge(3*24*3600);
		    //设置有效路径
		     c2.setPath("/cookie/abc");
		     //响应cookie信息
		    resp.addCookie(c1);
		    resp.addCookie(c2);
		     //直接响应
		    resp.getWriter().write("Cookie学习");
		   
	}
}

七、JSP语法部分

   1、Jsp的三种注释
		  前端语言注释
		              会被转译,也会被发送,但是不会被浏览器执行
		   java语言注释
		              会被转译,但是不会被servlet执行
		   Jsp注释
		              不会被转译
2、Jsp的page指令(多个属性之间用空格隔开):
    	<%@page 属性名="属性值" 属性名="属性值" 属性名="属性值"...%>
    	language:声明要被转移的语言
    	import :声明转译的java文件要导入的包,不同包之间用逗号隔开
    	pageEncoding:设置jsp文件的数据编码格式
    	contentType:设置jsp数据响应给浏览器时解析编码格式
    	session:设置要转译的servlet中是否开启session支持,默认开启,属性值为boolean类型
    	errorPage:设置jsp运行错误跳转的页面
    	extends:设置jsp转译的java文件要继承的父类(包名+类名)
             作用:
                       配置文件转译相关参数 
3、 jsp局部代码块  
		       特点:
		       	局部代码块中声明java代码会被原样转译到jsp对应的servlet文件的_JspService方法中
		       	代码块中声明的变量都是局部变量
		        使用:<%   %>
		        缺点:书写麻烦,阅读困难  
		        开发: 
		             使用servlet进行逻辑处理,使用jsp进行页面展示
4、 jsp的全局代码块
    		    特点:
    		           声明的java 代码作为全局代码转译到对应的servlet中
    		    使用:<%! %>
    		    注意:
    		       全局代码块中声明的代码,需要使用局部代码块调用
5、 jsp的脚本段语句	
                特点:帮助我们快速获取变量或者方法的返回值作为数据响应给浏览器
                使用:<%=变量名或者方法%>	     
                注意:不要在 变量名或者方法名后使用分号
                使用位置:除jsp语法要求以外的任何位置。
6、 Jsp静态引入和动态引入
			 静态引入:
			     <%@include file="要引入的jsp的相对路径" %>
		         特点:
			           会将引入的jsp文件和当前jsp文件转译成一个java文件使用。
			            在网页中也就显示合并后的显示效果
			     注意:
			         静态引入的jsp文件不会转译java(servlet)文件
			         当前文件和静态引入的jsp文件,不能够使用java代码块声明同名变量
		     动态引入:
		          <jsp:include page="要引入的jsp的相对路径"></jsp:include>
			    特点:
			          会将引入的jsp文件单独转译,在当前文件转好的Java文件中调用引入的jsp文件的转译文件
			          在网页中显示合并后的效果
			    注意:
			          动态引入允许文件中声明同名变量
	      优点:
	               减少代码冗余
7、 jsp的转发标签 forward:
	               使用:
	                    <jsp:forward page="要引入的jsp的相对路径"></jsp:forward>
	               特点:
	                   一次请求
	                   地址栏url不变
	               注意:
	                   在转发标签的两个标签中间除了写<jsp:param value="str" name="aaa"/>子标签不会报错,name为key,value为value
	                   其他任意字符都会报错   
8、 jsp的九大内置对象:
	               内置对象:
	               jsp文件在转译对应的servlet文件的时候自动生成的并声明的对象。我们jsp页面可以直接使用
	                              注意:
	                                  内置对象在jsp页面中通过使用,使用局部代码块或者脚本语句来使用,不能在全局在全局代码块中使用        
	                              内容:  
	              pageContext:页面上下文对象,封存了其他内置对象。封存了jsp运行信息
	                          注意:每个jsp文件单独拥有一个pageContext对象
	                          作用域:当前页面                                                 
	              request:封存当前请求数据的对象。由tomcat服务器创建,一次请求
	              session:此对象用来存储用户的不同请求的共享数据,一次会话
	              application:也就是ServletContext对象,一个项目只有一个。存储用户共享数据的对象,以及完成其他操作。项目内
	              response:响应对象,用来响应请求处理结果给浏览器对象。设置响应头,重定向。
	              out:响应对象,Jsp内部使用,带有缓冲区的响应对象,效率高于response对象
	              page:代表当前Jsp的对象,相当于Java中的this
	              exception:异常对象,存储当前运行的异常信息
	                                                                        注意:使用此对象需要在page指定中使用属性isErrorPage="true"开启。                                                                        	                                      
	              config:也就是servletConfig,主要用来获取web.xml中的配置数据,完成初始化对象的读取
9、 四个作用域对象:
			      pageContext:当前页面,解决了当前页面内的数据共享。获取其他内置对象
			      request: 一次请求。一次请求的servlet的数据共享。通过请求转发流转给下一个servlet
			      session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求
			      application:项目内,不同用户数据共享问题 。将数据流转流转给其他用户。
			                  作用:
					  数据流转     
10、jsp文件路径:
		     在jsp中的资源路径可以使用相对路径,完成跳转,但是:
		              问题一:资源的位置不可以随意更改
		              问题二:需要使用../进行文件夹的跳转,但是比较麻烦       
		     使用绝对路径:
		         /虚拟项目名/项目资源路径
		               例如<a href="/jspDemo/a/a.jsp"></a>
		                注意:
		                       在jsp中资源的第一个/表示服务器的根目录,相当于:localhost:8080
		 使用jsp全局路径声明:
					 <%
					 String path = request.getContextPath();
					 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
					 %>
		             <base href="<%=basePath%>">
		               作用:
		                     给资源前面加项目名称。http://127.0.0.1:8888/虚拟项目名/