Java EE系列(五)——关于第6个war包的学习总结

Java EE系列(五)——关于第6个war包的学习总结,第1张

从今天开始,peter xiao将开始进行j2ee课程中war包的学习总结了。本次学习的是第6个war包。首先我们根据参考文件查看学习任务。

自行完成相应的动作和思考
1.读完程序中的文档,即注释,如果有相关问题,则直接回答问题。
    1.1  利用上下文对象获取服务器上的文件里的数据
2 计数器的累计 *** 作是如何实现的
3 在生命周期函数里的初始化函数中做一些Servlet的准备工作
4 注意web项目中的IO *** 作,在读写文件之前,要定位文件所在的位置。
    4.1 用class文件反射得到的是包下的路径
        count.txt发布以后仍然在WEB-INF目录下
        countinpackage.txt发布后,跟随.java文件生成的.class文件位置
    4.2 真实的项目发布时的路径,一般置于资源文件下,以后可以用maven来管理 
    4.3 在tomcat下直接测试时,是一个临时目录
        .metadata/.plugin/
        在这个目录下才看得到发布的项目
        D:\eclipse_workspace_20192\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
    4.4 在发布以后,包名会转化为一层层的目录
        cn.edu.cuit.servlet即cn/edu/cuit/servlet

 那么在正式运行程序之前,我们先对上述的几个问题进行一些探索和研究。

1. 首先我们要弄清楚,什么是上下文对象。Web容器在启动以后,里面会有很多web的程序,容器会问每一个web程序创建一个成员的ServletConntext对象,这是一个全局变量,每个web程序都可以通过一些组件读取他,这样有助于数据的共享。而上下文对象是服务器容器的全局变量,所有的servlet访问的上下文都是同一个,当服务器关闭后,上下文对象就会消失。在第6个war包的示例程序中,获取上下文对象,同时获取服务器上文件中的数据的代码如下所示:

sc = this.getServletContext();
path = sc.getRealPath("WEB-INF/count.txt");

2. 接下来我们再看读取文件中信息的 *** 作,在读取完文件信息之后,计数器初始化完成代码展示如下:

try {
			InputStream is = LifeServlet.class.getResourceAsStream("countinpackage.txt");
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String string;
			string = br.readLine();
			count = Integer.parseInt(string); //计数器完成初始化
			br.close();
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

3. 之后我们就要开始思考累加 *** 作的实现了。这里可以看到,示例代码通过调用dopost方法和doget方法进行servlet的访问以及计数器的累加。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置输出类型和编码字符集
		response.setContentType("text/html;charset=utf-8");
		// 获取out对象
		PrintWriter out = response.getWriter();
		// 计数器自增1
		count++;
		// 插旗
		out.println("这个Servlet历史上已经被访问了"+count+"次了!");
		
		// 写到文件的组合动作
		// 1 获取输出流对象
		OutputStream fw = new FileOutputStream(path);
		// 2 得到写缓存
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fw));
		// 3 准备好数据格式:字符串,由整数转换得到
		String string = String.valueOf(count);
		// 4 写回到文件
		bw.write(string);
		// 5 关闭文件相关资源
		bw.close();
		fw.close();
		
		System.out.println("该Servlet的doGet方法被执行了一次");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
		System.out.println("该Servlet的doPost方法被执行了一次");
	}

这里涉及到get请求和post请求,在这里我也就简单总结一下。首先get请求和post请求是http协议中的两种发送请求的方法,本质上都是在进行TCP连接,其中get请求一般用来请求获取数据,而post请求一般作为发送数据到后台,传递数据,创建数据。在servlet开发中,通常用doGet()和doPost()分别处理get和post方法。

4. 在本次实验中同样涉及到servlet生命周期的内容,其中生命周期的5个阶段分别如下:

(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源

这5个阶段也贯穿整个示例代码的始终。

接下来就是第六个war包程序的具体演示。

首先我们点开index.html文件,代码如下所示





第一个Servlet页面,注意Servlet的生命周期


与此同时,我们点开配置文件web.xml,代码如下所示



  servletFirst
  
    index.html
  
  
    LifeServlet
    cn.edu.cuit.servlet.LifeServlet
  
  
    LifeServlet
    /lifeCycle
  
  
    LifeServlet1
    cn.edu.cuit.servlet.LifeServlet
  
  
    LifeServlet1
    /lifeServlet
  

当我们运行index.html文件,form表单会提交一个地址请求

 该请求将在配置文件中进行路径映射

/lifeCycle

随后在配置文件中向上映射,寻找指定的servlet类

cn.edu.cuit.servlet.LifeServlet

最后调用servlet,即LifeServlet.java文件,完成相关累计 *** 作。

接下来我们运行一下index.html文件,出现激活表单

点击按钮,进行计数

 

观察console控制台,可以看到doget和dopost方法都被执行了一次 

 

点击调用的文件countinpackage.txt,可以看到起始为1000,所以计数器也是从1000开始计数的。

 

至此,第6个war包运行完成!

最后还是进行一个简单的总结,通过对第6个war包的学习,我对于servlet生命周期、get与post请求,application域都有了一个更深入地了解。之后博主也会持续更新war包的学习记录,相信在学习中也可以了解和掌握更多Java web开发的知识。bye!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/740543.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-28
下一篇2022-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存