时隔多日,多日合适吗,应该是时隔多月。我又想起了一般处理程序。这都是由于近期在实现的DRP系统中经经常使用到jsp+servlet达到界面与逻辑的分离。servlet负责处理从jsp传回的信息;每当这个时候我就有一种感觉,这里的Servlet好像跟一般处理程序有着相同的作用,只是由于我对一般处理程序的了解并不深刻,仅仅是在一个写简单的实例中应用过。大家有什么看法都能够提出来,以下我就从我有限的知识出发来说说我的理解:

一、一般处理程序

一般处理程序用来处理一般的web请求。一般处理程序实现一个FrameWork的接口:IHttpHandler,该接口定义了假设实现一个HTTP骑牛的处理所必须实现的一些系统约定。创建一个空白的一般处理程序:

  1. /// <summary>
  2. /// HelloWord 的摘要说明
  3. /// </summary>
  4. public class HelloWord : IHttpHandler
  5. {
  6.  
  7. public void ProcessRequest(HttpContextcontext)
  8. {
  9. context.Response.ContentType ="text/plain";
  10. context.Response.Write("HelloWorld");
  11. }
  12.  
  13. public bool IsReusable
  14. {
  15. get
  16. {
  17. return false;
  18. }
  19. }
  20. }

我们能够看到仅仅须要实现一个方法和一个属性,当中ProcessRequest放置处理请求的主要代码;IsReusable属性,获取指示其它请求能否够使用IHttpHandler 实例,一般都设置为true;

以下以以一个简单的加入用户为例。看一般处理程序是怎样实现的:

web传递信息:

  1. //加入用户信息
  2. function saveOneOrganization() {
  3. //获username称
  4. var nameValue =$("#UserName").val();
  5. //获取password
  6. var passWordValue =$("#PassWord").val();
  7. //给隐藏控件test的value赋值
  8. var test = "add";
  9. if (nameValue == "" ||passWordValue == "" ||) {
  10. alert("请将信息填写完整!");
  11. }
  12. $.post("addManager.ashx", {nameValue: nameValue, passWordValue: passWordValue,test: test }, function(data) {
  13. alert(data);
  14. });
  15.  
  16. }

一般处理信息处理:

  1. /// <summary>
  2. /// addManager1 的摘要说明
  3. /// </summary>
  4. public class addManager1 : IHttpHandler
  5. {
  6. UserManagerBLL userManagerBll = newUserManagerBLL();
  7. public void ProcessRequest(HttpContextcontext)
  8. {
  9. //接受前台传过来的test值
  10. string command =context.Request.Params["test"];
  11. if (command =="addUser") //加入username
  12. {
  13. addUser(context);
  14. }
  15. else if (command =="delUser")
  16. {
  17. modifyUser(context);
  18. }
  19. }
  20.  
  21. //加入用户信息
  22. public void addUser(HttpContextcontext) {
  23. //username称
  24. string strNameValue =context.Request.Params["nameValue"];
  25. //用户密码
  26. string strpassWordValue =context.Request.Params["passwordValue"];
  27.  
  28. //实例化用户实体
  29. UserEntity userEntity = new UserEntity();
  30. //将变量值传给实体
  31. userEntity.UserName = strNameValue;
  32. userEntity.Password =strpassWordValue;
  33. //调用B层的方法
  34. string strResult=userManagerBll.add(userEntity);
  35. //往前抬传值
  36. context.Response.Write(strResult);
  37. context.Response.End();
  38.  
  39. }
  40.  
  41. //改动
  42. public void modifyUser(HttpContextcontext)
  43. {
  44. //实现与加入用户已知不再详述
  45.  
  46. }
  47. public bool IsReusable
  48. {
  49. get
  50. {
  51. return true;
  52. }
  53. }
  54. }

二、Servlet

事实上Servelet范围非常广。这里我说的Servlet仅仅是Servlet的一种实现。创建Servlet事实上现HttpServlet,与IHttpHandler相似的是HttpServleteasy也是响应Web客户的请求,WEB容器把客户请求封装成一个HttpServletRequest对象,然后把对象传给Servlet的对象方法进行处理。

在继承HttpServlet时。能够选择覆盖部分方法。比如:doGet()或doPost(),或者覆盖Service方法。

以下简答的加入改动实例看一下servlet的实现:

jsp调用:

  1. function add(){
  2. window.self.location="servlet/flowCard/FlowCardServlet?command=add"
  3. }

Servlet实现:

  1. publicclass UserServlet extends HttpServlet {
  2.  
  3. @Override
  4. protectedvoid service(HttpServletRequest request, HttpServletResponse response)
  5. throwsServletException, IOException {
  6. //必须显示调用父类的service方法
  7. super.service(request,response);
  8. if("add".equals(getCommand())) {
  9. add(request,response);
  10. }elseif ("del".equals(getCommand())) {
  11.  
  12. }elseif ("modify".equals(getCommand())) {
  13.  
  14. }else {
  15.  
  16. }
  17. }
  18. /**
  19. * 加入
  20. * @param request
  21. * @param response
  22. * @throws ServletException
  23. * @throws IOException
  24. */
  25. privatevoid add(HttpServletRequest request, HttpServletResponse response)
  26. throwsServletException, IOException {
  27. //用户姓名
  28. String userName=request.getParameter("userName");
  29. //用户password
  30. String passWord=request.getParameter("passWord");
  31. user.setUserName(userName)
  32. user.setpassWord(passWord)
  33. UserManager.add(user);
  34. //页面跳转
  35. response.sendRedirect(request.getContextPath()+ "/flowcard/flow_card_maint.jsp");
  36. }
  37.  
  38. /**
  39. * 删除
  40. * @param request
  41. * @param response
  42. * @throws ServletException
  43. * @throws IOException
  44. */
  45. privatevoid del(HttpServletRequest request, HttpServletResponse response)
  46. throwsServletException, IOException {
  47. //略去
  48. }
  49. }
  50. 使用servlet须要在web.xml中进行配置:
  51. <servlet>
  52. <servlet-name> UserServlet</servlet-name>
  53. <servlet-class>com.tgb.UserServlet</servlet-class>
  54. <load-on-startup>2</load-on-startup>
  55. </servlet>
  56.  
  57. <servlet-mapping>
  58. <servlet-name>UserServlet</servlet-name>
  59. <url-pattern>/servletUserServlet<url-pattern>
  60. </servlet-mapping>

比較:

1、事实上从上面的代码能够看出。他们两个都能够依据页面传过来的參数推断要运行的方法。进而调用业务层的详细处理过程,非常easy的把页面与业务逻辑分开。

2、在.net中的一般处理程序与java中Servlet都是用来处理web端发送的请求,解开页面与业务逻辑的耦合;看起来作用就像是MVC框架中Controller的作用,近期感觉非常多东西非常像。主要是缺乏实践还没摸透当中的道理,欢迎指正。

JAVA学习之 Model2中的Servlet与.NET一般处理程序傻傻分不清楚的更多相关文章

  1. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...

  2. Java学习之InputStream中read()与read(byte[] b)

    Java学习之InputStream中read()与read(byte[] b) 这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() ...

  3. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  4. java学习(二)多态中成员变量详解

    今天我总结了一下java多态中成员变量的赋值与调用 举一个我当初做过的小案例: class Fu{ int num; void show(){} } class Zi extends Fu{ //in ...

  5. Java学习之继承中的执行顺序详解

    代码块(理解) (1)用{}括起来的代码. (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率. B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前 ...

  6. 【java学习】实践中总结--持续更新中

    目录: 一些定义 配置环境 相关语法 1.一些定义 java中DO的含义: https://blog.csdn.net/canot/article/details/51698047 DAO 中包含了各 ...

  7. Java学习笔记--HashMap中使用object做key的问题【转】

    在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的referenc ...

  8. JAVA学习笔记--方法中的参数调用是引用调用or值调用

    文献来源:<JAVA核心技术卷Ⅰ>,第4章第5节 (没有相关书籍的可看传送门) ps:测试demo因为偷懒,用的是String对象 结论:Java使用的是对象的值引用.即将任何对象所在内存 ...

  9. Java学习笔记-----eclipse中建立Java项目并成功运行

    环境:WIN7 64位 +eclipse 2018 12version 具体方法:https://jingyan.baidu.com/album/9c69d48fefa53113c9024eb3.ht ...

随机推荐

  1. 【编程工具】Sublime Text3快捷键配置

    我们在使用编译软件时,总是喜欢使用快捷键来方便我们的操作,但有些编译软件不支持快捷键的修改和设置,为了能够更加方便的使用 Sublime Text3,这里我介绍几个 Sublime Text3 设置快 ...

  2. asp.net提交危险字符处理方法之一

    在form表单提交前,可以在web页面,submit按钮的click事件中,使用js函数对,可能有危险字符的内容进行编码. 有3个函数可用: encodeURI() 函数可把字符串作为 URI 进行编 ...

  3. POJ 2092 Grandpa is Famous

    Grandpa is Famous Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7153   Accepted: 3624 ...

  4. iOS NSLog各种打印

    %@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和double型 %0.2f 精度浮点数,只保留两位小数 %x:    为32 ...

  5. 【bzoj3489】A simple rmq problem 三维KD-tree

    题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...

  6. 【bzoj1109】[POI2007]堆积木Klo 动态规划+树状数组

    题目描述 Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔.妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置 ...

  7. 【Luogu】P3391文艺平衡树(Splay)

    题目链接 ddosvoid和自为风月马前卒教了我这道题 他们好强啊 如果我们要反转区间[l,r] 我们首先把l的前驱旋转到根节点 再把r的后继旋转到根节点的右儿子 那么此时根节点的右儿子的左儿子所代表 ...

  8. C++ 中的 C_str() 函数用法

    转中转 ~\(≧▽≦)/~ :http://blog.csdn.net/nancy_m/article/details/7583550 语法: const char *c_str(); c_str() ...

  9. cf287E Main Sequence

    As you know, Vova has recently become a new shaman in the city of Ultima Thule. So, he has received ...

  10. Spring-IOC源码解读3-依赖注入

    当容器已经载入了BeanDefinition的信息完成了初始化,我们继续分析依赖注入的原理,需要注意的是依赖注入是用户第一次向IOC容器获取Bean的时候发生的,这里有个例外,那就是如果用户在Bean ...