完整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)
		{
		}
}

猜你喜欢

转载自blog.csdn.net/o983950935/article/details/85341151
今日推荐