Servlet程序开发

Servlet 程序开发

一、Servlet概念及工作原理

什么是Servlet?
在这里插入图片描述
Servlet功能:
在这里插入图片描述
Servlet运行需要Servlet容器:
在这里插入图片描述
Servlet 工作流程:
在这里插入图片描述
Servlet生命周期:
在这里插入图片描述
Servlet使用单例模式,服务器重启之后Servlet才被销毁

二、Servlet开发过程

在这里插入图片描述
调用Servlet的两种方法:

  • 第一种方法:

在这里插入图片描述

  • 第二种方法:
    在这里插入图片描述

开发时如何应用:
在这里插入图片描述

三、Servlet 主要接口和类

1. Servlet接口

在这里插入图片描述

init 方法:

在这里插入图片描述
service方法:

在这里插入图片描述
destroy方法:

在这里插入图片描述
getServletConfig方法:

在这里插入图片描述
getServletInfo方法:

在这里插入图片描述

2.ServletRequest接口

在这里插入图片描述
常用(?)接口:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.ServletResponse接口

在这里插入图片描述
常用接口:

在这里插入图片描述

4.GenericServlet抽象类

在这里插入图片描述

5.HttpServlet抽象类

在这里插入图片描述

HttpServlet抽象类的主要方法:

在这里插入图片描述

6. HttpServletRequest和HttpServletResponse接口

在这里插入图片描述

HttpServletRequest接口常用方法:

在这里插入图片描述
在这里插入图片描述

HttpServletResponse接口常用方法:

在这里插入图片描述
在这里插入图片描述

上述接口和抽象类之间的关系:

在这里插入图片描述

7.ServletContext和ServletConfig接口

  1. ServletContext接口:

在这里插入图片描述
每个Web应用有唯一的ServletContext,但是一个ServletContext可以对应多个Servlet。

ServletContext接口提供的方法:
在这里插入图片描述
在这里插入图片描述

  1. ServletConfig接口:

在这里插入图片描述
在这里插入图片描述

8.HttpSession接口和Cookie类

  1. HttpSession接口

在这里插入图片描述

  1. Cookie类

在这里插入图片描述

9.RequestDispatcher接口

在这里插入图片描述
在这里插入图片描述

Web应用中需要注意路径:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
转发与其他三种情况不同,只能在同一个应用中转发。

四、Servlet共享变量

在这里插入图片描述
三种方法的作用域:

在这里插入图片描述

三种方法的实现:

setAttribute:

在这里插入图片描述

getAttribute()

在这里插入图片描述

使用中需要注意因为页面跳转,重启服务器等造成的共享变量失效的情况;

例:

//这是ShareSharingVars这个Servlet的dopost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        // 1    
        ServletContext sc = this.getServletContext();    
        sc.setAttribute("sharingvar_sc", "context");    
        // 2    
        HttpSession session = request.getSession();    
        session.setAttribute("sharingvar_se", "session");    
        // 3    
        request.setAttribute("sharingvar_req", "request"); 
        
        String sc_value = (String) sc.getAttribute("sharingvar_sc");    
        String session_value = (String) session.getAttribute("sharingvar_se");    
        String request_value = (String) request.getAttribute("sharingvar_req");    

        response.setContentType("text/html;charset=UTF-8");    
        PrintWriter out = response.getWriter();    
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");    
        out.println("<HTML>");    
        out.println("    <HEAD><meta charset=\"UTF-8\"><TITLE>A Servlet</TITLE></HEAD>");    
        out.println("    <BODY>");
        out.println("ShareSharingVars输出页面<br>");         
        out.println("在同一个页面中读取共享变量<br>");          
        out.println("Context:" + sc_value  + "<br>");    
        out.println("Session:" + session_value + "<br>");    
        out.println("Request:" + request_value + "<br>");
        out.println("    <a href=/ServletTrain_war_exploded/GetSharingVars>");//此处直接使用超链接
        out.println("    使用超链接跳转到使用共享变量页面");    
        out.println("    </a>");         
        out.println("    </BODY>");    
        out.println("</HTML>");    
        out.flush();    
        out.close();    
	}

运行ShareSharingVars这个Servlet:

在这里插入图片描述
Context、Session、Request的值都是正确的。

点击超链接:

在这里插入图片描述
Context、Session值显示正确,但是Request是null。因为用超链接跳转,访问时创建了新的HttpRequest,而ServletContext和HttpSession的作用域更广,通过超链接跳转到其他页面,获得的仍然是同一个ServletContext实例和HttpSession实例。

有一种方法能避免这种情况:
那就是getRequestDispatcher().forward()

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
        // 1    
        ServletContext sc = this.getServletContext();    
        sc.setAttribute("sharingvar_sc", "context");    
        // 2    
        HttpSession session = request.getSession();    
        session.setAttribute("sharingvar_se", "session");    
        // 3    
        request.setAttribute("sharingvar_req", "request");   
        // 4
        request.getRequestDispatcher("/GetSharingVars").forward(request, response);//将request和response实例发给GetSharingVars这个Servlet处理。
	}

运行该Servlet,结果如下:
在这里插入图片描述

五、Servlet文件操作

读写文件

在这里插入图片描述
在这里插入图片描述注意上图服务器文件,Servlet是运行在服务器上的,所以只能读写服务器上的文件。

在这里插入图片描述

读文件示例代码
//仅仅展示读文件Servlet类中的dopost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置页面的文档类型和字符集,页面中的字符所采用的字符集
		response.setContentType("text/html;charset=UTF-8");
		//设置页面的编码方式,即以什么样的编码方式来保存页面文件
		response.setCharacterEncoding("UTF-8");
		//从response中获得PrintWriter类的对象,以用于向页面输出信息
		PrintWriter out = response.getWriter();
		//向页面输出信息
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("    <HEAD><meta charset=\"UTF-8\"><TITLE>A Servlet</TITLE></HEAD>");
		out.println("    <BODY>");
		out.println("    <XMP>");
		String fileName =  "/WEB-INF/web.xml";文件相对路径
		String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径
		out.println("要读取的文件:" + filePath);
		out.println("内容如下:");
		//使用文件的绝对路经打开文件
		File file = new File(filePath);
		if(file.exists())
		{
			//使用打开的文件对象,创建FileReader类的实例
			FileReader  reader = new FileReader (file);
			//使用打开文件对应的reader对象,创建BufferedReader 类的实例
			BufferedReader  bufferReader = new BufferedReader (reader);
			String line = null;
			//逐行读取文件,并输出到页面上
			while((line = bufferReader.readLine())!=null)
			{
				out.println(line);
			}
			bufferReader.close();
		}else
		{
			out.print("未找到文件!");
		}
		out.println("    </XMP>");
		out.println("    </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

上述示例中比较关键的代码片段:

由Servlet服务器中文件的相对路径获得文件的绝对路径

String fileName =  "/WEB-INF/web.xml";文件相对路径
String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径

使用绝对路径读取文件(和普通的文件读写一致):

		File file = new File(filePath);
		if(file.exists())
		{
			//使用打开的文件对象,创建FileReader类的实例
			FileReader  reader = new FileReader (file);
			//使用打开文件对应的reader对象,创建BufferedReader 类的实例
			BufferedReader  bufferReader = new BufferedReader (reader);
			String line = null;
			//逐行读取文件,并输出到页面上
			while((line = bufferReader.readLine())!=null)
			{
				out.println(line);
			}
			bufferReader.close();
		}else
		{
			out.print("未找到文件!");
		}
写文件示例代码
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
        //设置页面的文档类型和字符集,页面中的字符所采用的字符集
        response.setContentType("text/html;charset=UTF-8");
        //设置页面的编码方式,即以什么样的编码方式来保存页面文件
        response.setCharacterEncoding("UTF-8");
        //从response中获得PrintWriter类的对象,以用于向页面输出信息
    	PrintWriter out = response.getWriter();
    	String fileName =  "temp.txt";//文件相对路径
    	String filePath = this.getServletContext().getRealPath(fileName);//文件绝对路径
        //使用文件的绝对路经打开文件,如果文件不存在则创建文件
    	File file = new File(filePath);
            //使用打开的文件对象,创建FileWriter类的实例
    		FileWriter writer = new FileWriter(file);
            //使用打开文件对应的writer对象,创建BufferedWriter类的实例
    		BufferedWriter bufferWriter = new BufferedWriter(writer);       
            //通过BufferedReader 类的实例,向文件中写入信息
        bufferWriter.write("J2EE课程");
        bufferWriter.newLine();
        bufferWriter.write("Servlet写文件");
        //刷新缓存,将缓存中的内容写入到文件中
        bufferWriter.flush();
        bufferWriter.close();
        writer.close();
        
        out.print("<font size='2'>文件写入完毕,路径:"+file.getAbsolutePath()+"</font>");
	}

上传文件

在这里插入图片描述
在这里插入图片描述

MultipartConfig标注

在这里插入图片描述
在这里插入图片描述

HttpServletRequest为上传文件提供了两个新方法:

在这里插入图片描述
在这里插入图片描述
注意Servlet上传文件时,文件是对象不再是File类型,而是Part类型。

下载文件

在这里插入图片描述
在这里插入图片描述

六、Servlet访问数据库

七、Servlet过滤器与监听器

过滤器:

在这里插入图片描述
在这里插入图片描述
过滤器链:
在这里插入图片描述
过滤器的执行过程:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

实现过滤器:

在这里插入图片描述
在这里插入图片描述

示例:
在这里插入图片描述
如何配置web.xml
在这里插入图片描述

监听器:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Desperado1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值