您的位置:首页 > 运维架构 > 网站架构

自己写架构笔记(3)----控制器分离思想

2018-01-24 22:27 351 查看

1、控制器分离思想

在一个软件系统中,会存在大量的JSP和Servlet,如果JSP和Servlet直接打交道,叫做紧耦合。

而控制器分离就是将所有Servlet进行按功能划分责任。

其中一个控制器是核心,负责接收所有的请求,然后将请求,依据业务描述分配给其他业务控制器,进行流程处理。

如下图所示:



jsp通过核心控制器跳转到相应的servlet。核心控制器接收所有的请求,然后负责将请求转达给相应的servlet。

2、控制器分离思想的最简单例子

我们首先写一个最简单的页面,这个页面包含许多的跳转按钮,每当点击一次按钮,就会触发核心控制器,然后由核心控制器去分配任务给servlet。

先看一下main.jsp的效果,和实际代码:



<%@ page language="java" pageEncoding="GBK"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>

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

<table border="1" width="45%" align="center">
<tr>
<td>
<input type="submit" name="next" value="a1010" formaction="/neubase/a1010.html">
</td>
<td>
<input type="submit" name="next" value="a1011" formaction="/neubase/a1011.html">
</td>
<td>
<input type="submit" name="next" value="a1020" formaction="/neubase/a1020.html">
</td>
<td>
<input type="submit" name="next" value="a1021" formaction="/neubase/a1021.html">
</td>
<td>
<input type="submit" name="next" value="a1022" formaction="/neubase/a1022.html">
</td>
<td>
<input type="submit" name="next" value="a1023" formaction="/neubase/a1023.html">
</td>
</tr>
</table>

</form>
</body>
</html>


在写完main.jsp之后,要去写一个能够将所有的请求汇集到一起的核心控制器,在这里我们先写一个BaseServlet,能够获得所有的请求,像之前所写的,我们将跳转到的servlet命名为a1010.html这样的格式,我们只要把这个核心servlet的url设置为”*.html”,那么只要遇到以html结尾的请求,都会跳转过来,我们在利用获得uri来获得具体请求的servlet的路径,如:/neu/a1010.html,在这里,我们去截取出a1010,就可以得知该请求是请求的A1010Servlet,那么接下来怎么去调用这个相应的servlet呢?我们先看一下代码:

package com.neusoft.web.support;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class BaseServlet
*/
@WebServlet("*.html")
public class BaseServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
try
{
//获取URI
String uri=request.getRequestURI();
//System.out.println(uri);
//获取uri中最后一个斜杠的索引
int index=uri.lastIndexOf("/");
//System.out.println(index);
//从uri截取需要访问的控制器的名称
String uriBaseName=uri.substring(index+1).replace(".html","");
System.out.println(uriBaseName);

//控制器包基础路径
String basePath="com.neusoft.web.impl.";
//定义目标控制器的名称
String controllerName=basePath+uriBaseName.toUpperCase()+"Servlet";
System.out.println(controllerName);
//将目标控制器,进行类型回溯,转换成对应的接口类型
BaseController controller= (BaseController)Class.forName(controllerName).newInstance();
//通过接口调用目标控制器的execute方法
controller.execute();
}
catch(Exception ex)
{
request.setAttribute("msg", "网络故障!");
ex.printStackTrace();
}

//调回到目标页面
request.getRequestDispatcher("/main.jsp").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.doGet(request, response);
}

}


如以上代码所示,我们在截取玩之后,又获得了相应的servlet的路径,然后我们利用了一个接口,再来调用接口中的方法,我们再来看一下接口(控制器),和一个具体的servlet:

package com.neusoft.web.support;

public interface BaseController
{
/**
* 目标控制器中的流程处理方法
* <
*   所有目标控制器,通过该方法,取代doGet
* >
* @return
* @throws Exception
*/
String execute()throws Exception;

}


A1010Servlet:

package com.neusoft.web.impl;

import com.neusoft.web.support.BaseController;

public class A1010Servlet implements BaseController
{
public A1010Servlet()
{
System.out.println("create A1010Servlet");
}

@Override
public String execute() throws Exception
{
System.out.println("A1010Servlet 开始工作");
return null;
}
}


在上面的A1010Servlet,只是一个普通的java类,实现了一个接口,继承了该接口中的excute方法(之后在此方法里去实现doGet实现的所有要求,实现消灭servlet,只用普通的类),所以我们在BaseServlet中,采用父类的变量引用子类的实例,父类变量决定做什么,子类的实例决定怎么做,也就是采用接口的变量引用某个A1010Servlet的实例,然后该具体的Servlet去决定具体的功能实现,实现了控制器分离的思想,BaseServlet接收所有的请求,然后将具体的请求去调用具体的类,实现功能点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: