完整JavaWeb项目笔记 第六部分-核心Servlet主处理实现

一 主处理逻辑做什么

  其实在第五部分已经把IServlet的整体设计做的差不多了,但是process()并没有实现,process()就是我所谓的主处理方法。

  这个方法要做几件事情:

  1. 请求处理耗时统计
  2. 分发请求到具体处理方法
  3. 拼装IResponse应答结构
  4. 解决跨域处理

  所以先定义方法如下:

private void process() throws IOException
{
		try
		{
			processAction();
		}
		catch (Throwable t)
		{
		}
	}

二 补充处理耗时

  请求到来时即应记录下当前的系统时间,并且在请求处理完毕后再次计下当前的系统时间,然后取前后时间的跨度值作为请求耗时。

  注意,每一个请求的应答为IResponse类型,且IServlet在请求进入时已经实例化好了IResponse对象result,所以补充逻辑如下:

private void process() throws IOException
{
		long StartTime = System.currentTimeMillis();
		
		try
		{
			processAction();
		}
		catch (Throwable t)
		{
		}
		
		result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
}

三 拼装IResponse并响应请求

  这时候就用上了我们之前的准备工作,GsonUtil完美的支持我们现在工作需求:

private void process() throws IOException
{
		long StartTime = System.currentTimeMillis();
		
		try
		{
			processAction();
		}
		catch (Throwable t)
		{
		}
		
		result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
		response.setContentType("text/plain; charset=UTF-8");
		Gson gson = GsonUtil.getGson();
		
		try
		{
			PrintWriter out = response.getWriter();
			response.getWriter().print(gson.toJson(result));

			out.flush();
			out.close();
		}
		catch (Exception e)
		{
		}
}

四 解决跨域问题

  要解决跨域问题,首先要知道跨域问题时怎么来的,比如说在a.com下去访问b.com的资源,这就是跨域。浏览器允许跨域写,但是不允许跨域读。这里说的写是指请求,读则为应答。

  了解其原理之后,我们的解决方案为在应答时处理跨域问题,所以补充处理逻辑如下:

private void process() throws IOException
{
		long StartTime = System.currentTimeMillis();
		
		try
		{
			processAction();
		}
		catch (Throwable t)
		{
		}
		
		result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
		response.setContentType("text/plain; charset=UTF-8");
		Gson gson = GsonUtil.getGson();
		
		try
		{
			PrintWriter out = response.getWriter();
			String callback = request.getParameter("callback");

			if (callback == null)
			{
				response.addHeader("Access-Control-Allow-origin", request.getHeader("callback"));
				response.addHeader("Access-Control-Allow-Methods", "POST,GET");
				// 是否支持cookie跨域
				response.addHeader("Access-Control-Allow-Credentials", "true"); 
				response.getWriter().print(gson.toJson(result));
			}
			else
			{
				String output = callback + "(" + gson.toJson(result) + ")";
				response.getWriter().print(output);
			}

			out.flush();
			out.close();
		}
		catch (Exception e)
		{
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柠檬睡客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值