时隔多日,多日合适吗,应该是时隔多月。我又想起了一般处理程序。这都是由于近期在实现的DRP系统中经经常使用到jsp+servlet达到界面与逻辑的分离。servlet负责处理从jsp传回的信息;每当这个时候我就有一种感觉,这里的Servlet好像跟一般处理程序有着相同的作用,只是由于我对一般处理程序的了解并不深刻,仅仅是在一个写简单的实例中应用过。大家有什么看法都能够提出来,以下我就从我有限的知识出发来说说我的理解:
一、一般处理程序
一般处理程序用来处理一般的web请求。一般处理程序实现一个FrameWork的接口:IHttpHandler,该接口定义了假设实现一个HTTP骑牛的处理所必须实现的一些系统约定。创建一个空白的一般处理程序:
/// <summary> /// HelloWord 的摘要说明 /// </summary> public class HelloWord : IHttpHandler { public void ProcessRequest(HttpContextcontext) { context.Response.ContentType ="text/plain"; context.Response.Write("HelloWorld"); } public bool IsReusable { get { return false; } } }
我们能够看到仅仅须要实现一个方法和一个属性,当中ProcessRequest放置处理请求的主要代码;IsReusable属性,获取指示其它请求能否够使用IHttpHandler 实例,一般都设置为true;
以下以以一个简单的加入用户为例。看一般处理程序是怎样实现的:
web传递信息:
//加入用户信息 function saveOneOrganization() { //获username称 var nameValue =$("#UserName").val(); //获取password var passWordValue =$("#PassWord").val(); //给隐藏控件test的value赋值 var test = "add"; if (nameValue == "" ||passWordValue == "" ||) { alert("请将信息填写完整!"); } $.post("addManager.ashx", {nameValue: nameValue, passWordValue: passWordValue,test: test }, function(data) { alert(data); }); }
一般处理信息处理:
/// <summary> /// addManager1 的摘要说明 /// </summary> public class addManager1 : IHttpHandler { UserManagerBLL userManagerBll = newUserManagerBLL(); public void ProcessRequest(HttpContextcontext) { //接受前台传过来的test值 string command =context.Request.Params["test"]; if (command =="addUser") //加入username { addUser(context); } else if (command =="delUser") { modifyUser(context); } } //加入用户信息 public void addUser(HttpContextcontext) { //username称 string strNameValue =context.Request.Params["nameValue"]; //用户密码 string strpassWordValue =context.Request.Params["passwordValue"]; //实例化用户实体 UserEntity userEntity = new UserEntity(); //将变量值传给实体 userEntity.UserName = strNameValue; userEntity.Password =strpassWordValue; //调用B层的方法 string strResult=userManagerBll.add(userEntity); //往前抬传值 context.Response.Write(strResult); context.Response.End(); } //改动 public void modifyUser(HttpContextcontext) { //实现与加入用户已知不再详述 } public bool IsReusable { get { return true; } } }
二、Servlet
事实上Servelet范围非常广。这里我说的Servlet仅仅是Servlet的一种实现。创建Servlet事实上现HttpServlet,与IHttpHandler相似的是HttpServleteasy也是响应Web客户的请求,WEB容器把客户请求封装成一个HttpServletRequest对象,然后把对象传给Servlet的对象方法进行处理。
在继承HttpServlet时。能够选择覆盖部分方法。比如:doGet()或doPost(),或者覆盖Service方法。
以下简答的加入改动实例看一下servlet的实现:
jsp调用:
function add(){ window.self.location="servlet/flowCard/FlowCardServlet?command=add" }
Servlet实现:
publicclass UserServlet extends HttpServlet { @Override protectedvoid service(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { //必须显示调用父类的service方法 super.service(request,response); if("add".equals(getCommand())) { add(request,response); }elseif ("del".equals(getCommand())) { }elseif ("modify".equals(getCommand())) { }else { } } /** * 加入 * @param request * @param response * @throws ServletException * @throws IOException */ privatevoid add(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { //用户姓名 String userName=request.getParameter("userName"); //用户password String passWord=request.getParameter("passWord"); user.setUserName(userName) user.setpassWord(passWord) UserManager.add(user); //页面跳转 response.sendRedirect(request.getContextPath()+ "/flowcard/flow_card_maint.jsp"); } /** * 删除 * @param request * @param response * @throws ServletException * @throws IOException */ privatevoid del(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { //略去 } } 使用servlet须要在web.xml中进行配置: <servlet> <servlet-name> UserServlet</servlet-name> <servlet-class>com.tgb.UserServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/servletUserServlet<url-pattern> </servlet-mapping>
比較:
1、事实上从上面的代码能够看出。他们两个都能够依据页面传过来的參数推断要运行的方法。进而调用业务层的详细处理过程,非常easy的把页面与业务逻辑分开。
2、在.net中的一般处理程序与java中Servlet都是用来处理web端发送的请求,解开页面与业务逻辑的耦合;看起来作用就像是MVC框架中Controller的作用,近期感觉非常多东西非常像。主要是缺乏实践还没摸透当中的道理,欢迎指正。