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

从今天开始,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文件,代码如下所示

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>第一个Servlet页面,注意Servlet的生命周期</title>
</head>
<body>
<form method="post" action="lifeCycle">
	<input type="submit" value="激活一个Servlet" />
</form>
</body>
</html>

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>servletFirst</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>cn.edu.cuit.servlet.LifeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LifeServlet</servlet-name>
    <url-pattern>/lifeCycle</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>LifeServlet1</servlet-name>
    <servlet-class>cn.edu.cuit.servlet.LifeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LifeServlet1</servlet-name>
    <url-pattern>/lifeServlet</url-pattern>
  </servlet-mapping>
</web-app>

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

<form method="post" action="lifeCycle">

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

<url-pattern>/lifeCycle</url-pattern>

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

<servlet-class>cn.edu.cuit.servlet.LifeServlet</servlet-class>

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

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

点击按钮,进行计数

 

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

 

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值