本周开始在写仿写一个微信PC端的聊天页面,没有使用ssh、ssm等框架,采用JavaWeb、反射、MySQL、C3P0等技术。这里把其中和核心技术列出来请大家指教。

与传统JavaWeb项目的区别

传统的JavaWeb项目每一个请求都要写一个对应的Servlet,这样会造成一个工程完成下来需要写几十个Servlet,而利用反射原理(根据获取到的url-pattern,截取出相应的方法名,进而调用相应的方法)就可以很好的解决这个问题。

1、配置web.xml文件

利用中设置的值来进行分组,user请求都会调用UserServlet


  1. <servlet>
  2. <servlet-name>UserServlet</servlet-name>
  3. <servlet-class>com.hsy.action.UserServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>UserServlet</servlet-name>
  7. <url-pattern>/user</url-pattern>
  8. </servlet-mapping>

2、创建工具类BaseServlet

这个类是整个项目的技术核心,通过getParameter("method")与getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class)来决定将要访问的方法。通过Class c = this.getClass();来拿到调用当前方法的类,最后通过invoke(this, req, res)来执行对应的方法


  1. public class BaseServlet extends HttpServlet {
  2. /*
  3. * 它会根据请求中的m,来决定调用本类的哪个方法
  4. */
  5. protected void service(HttpServletRequest req, HttpServletResponse res)
  6. throws ServletException, IOException {
  7. req.setCharacterEncoding("UTF-8");
  8. res.setContentType("text/html;charset=utf-8");
  9. // 例如:http://localhost:8080/demo1/xxx?method=login
  10. String methodName = req.getParameter("method");// 它是一个方法名称
  11. // 当没用指定要调用的方法时,那么默认请求的是execute()方法。
  12. if(methodName == null || methodName.isEmpty()) {
  13. methodName = "execute";
  14. }
  15. Class c = this.getClass();
  16. try {
  17. // 通过方法名称获取方法的反射对象
  18. Method m = c.getMethod(methodName, HttpServletRequest.class,
  19. HttpServletResponse.class);
  20. // 反射方法目标方法,也就是说,如果methodName为add,那么就调用add方法。
  21. String result = (String) m.invoke(this, req, res);
  22. // 通过返回值完成请求转发
  23. if(result != null && !result.isEmpty()) {
  24. req.getRequestDispatcher(result).forward(req, res);
  25. }
  26. } catch (Exception e) {
  27. throw new ServletException(e);
  28. }
  29. }
  30. }

3、创建UserServlet并继承工具类BaseServlet

这里只是简单的用这个例子来说明一个他的工作原理。假设一个请求http://localhost:8080/demo1/user?method=login过来了之后,首先会根据web.xml找到下面的UserServlet。猛的一看可能有点懵逼(这TM跑到这里就能执行login方法吗???这不是扯淡吗)。别急,听我慢慢道来。这个UserServlet继承了工具类BaseServlet,通过上一步的反射技术我们不就可执行本类中的login方法了吗?感觉有点不对劲?这就对了!!!我访问本类就算是继承了BaseServlet方法就能自动执行父类中的方法吗?一般情况下是不行的,就算是构造方法也要实例化子类时才能调用父类的构造方法啊。但这里是可以的,因为,在Servlet的生命周期方法中会自动调用server方法,也就是说会先调用本类的server方法、然后就会自动调用父类的server方法了。这样就实现了一个工具类BaseServlet共多个子类使用而调用不同的方法(现在很多框架的底层实现就是这样的)。


  1. public class UserServlet extends BaseServlet {
  2. public String login(HttpServletRequest request,HttpServletResponse response){
  3. System.out.println("UserServlet中的login方法调用了");
  4. return null;
  5. }
  6. }

JavaWeb无框架,借助反射采用精巧设计模式实现放微信PC聊天页面的更多相关文章

  1. javaweb三大框架和MVC设计模式

    javaweb三大框架和MVC设计模式 转载,原文请见https://blog.csdn.net/sunpeng19960715/article/details/50890705 一.MVC设计模式 ...

  2. 转载 javaweb三大框架和MVC设计模式 (自己加拉些内容)

    javaweb三大框架和MVC设计模式 一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基 ...

  3. 浅谈javaweb三大框架和MVC设计模式

    一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(Vie ...

  4. springMVC设计模式和javaWeb三层框架

    一.springMVC  设计模式 MVC模式是软件工程中的一种能够软件架构模式,把软件分为三个基本部分,模型(model).视图(view)和控制器(controller).使程序简化,更加直观. ...

  5. 程序员必懂:javaweb三大框架知识点总结

    原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...

  6. Javaweb学习笔记——(十三)——————JSTL、JSTL核心标签库、自定义标签、有标签体的标签、带有属性的标签、MVC、Javaweb三层框架

    JSTLApache提供的标签库 jar包:jstl-1.2.jar,如果传MyEclipse,他会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入.--------- ...

  7. Java下的框架编程(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)

    Java 虽然没有动态语言般暴起,但仍然天连天,水接水的生出好多框架技术---反射(reflection),泛型(generics),元数据(annotation),proxies(proxy/cgl ...

  8. JavaWeb 三层框架

    1. MVC 设计模式 Model: JavaBean; View: Jsp; Controller: Servlet; 2. JavaWeb 三层框架 所谓三层是表述层(WEB 层), 业务逻辑层( ...

  9. 无框架完整搭建安卓app及其服务端(一)

    技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...

随机推荐

  1. BASE64Encoder及BASE64Decoder的正确用法

    一直以来Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder类.这人个类 ...

  2. k8s学习 - 概念 - ReplicationController

    k8s学习 - 概念 - ReplicationController 我们有了 pod,那么就需要对 pod 进行控制,就是同一个服务的 podv我需要启动几个?如果需要扩容了,怎么办?这里就有个控制 ...

  3. youku_androidid

    youku_androidid = 1310; imei screenwidth screenhight

  4. wordpress备份和还原和迁移

    备份用mysqldump -u root -p test person > backup.sql 还原用mysql -u root -p < ./backup.sql 数据库密码修改后怎么 ...

  5. 洛谷:P2952 [USACO09OPEN]牛线Cow Line:题解

    题目链接:https://www.luogu.org/problemnew/show/P2952 分析: 这道题非常适合练习deque双端队列,~~既然是是练习的板子题了,建议大家还是练练deque, ...

  6. C#3.0新增功能10 表达式树 03 支持表达式树的框架类型

    连载目录    [已更新最新开发文章,点击查看详细] 存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表. 可以在 System.Linq.Expressions 查 ...

  7. Python小故事--------Tkinter的组件描述及解析

    概念 Tkinter: 是Tk图形用户界面工具包标准(ctl)的Python接口,作为一个轻量级的跨平台图形用户界面(GUI)开发工具 frame: 屏幕上的一块矩形区域,多是用来作为容器(conta ...

  8. 小白学python-day03-系统位数、变量、用户输入、if else

    今天是day03,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  9. DEDECMS教程:织梦栏目更新HTML出现“模板文件不存在,无法解析文档”的解决方法(转)

  10. Cobbler-自动化部署神器

    Cobbler-自动化部署神器 前言: 网络安装服务器套件 Cobbler(补鞋匠)从前,我们一直在做装机民工这份很有前途的职业.自打若干年前 Red Hat 推出了 Kickstart,此后我们顿觉 ...