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

与传统JavaWeb项目的区别

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

1、配置web.xml文件

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


<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.hsy.action.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>

2、创建工具类BaseServlet

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


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

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

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


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

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. SQL Server Form子查询、链接查询

    所用数据表:用户,钱包,订单 一.from子查询 --查询钱包里金额大于30000 and User_ID = Users.ID) ) 二.链接查询 内连接(inner join)外连接(left/r ...

  2. MyBatis从入门到精通:第二章数据的创建与插入文件

    数据库表的创建: create table sys_user ( id bigint not null auto_increment, ), user_password ), user_email ) ...

  3. Java编程思想:构建复杂模型

    import sun.nio.cs.Surrogate; import java.util.ArrayList; import java.util.Random; public class Test ...

  4. Java编程思想:内部类中级部分

    public class Test { public static void main(String[] args) { // Parcel4Test.test(); // Parcel5_1.tes ...

  5. 【基本数据结构之堆】-C++

    注意:这篇博客讲的是手写堆,喜欢用C++自带数据结构模拟的慎入 今天我们来聊一聊一种奇怪 的数据结构: 堆 为什么说这个数据结构有点奇怪呢? 先看看其他的在我眼里是正常的数据结构: 队列(近似于排队) ...

  6. requests模块:请求网页

    请求网页时需要设置对应的headers(请求头) import requests link = 'https://movie.douban.com' headers = {'User-Agent': ...

  7. 默认文档接卸--手机web app开发笔记(二)

    首先我们启动HBuilderX2.0 ,界面如图2-1所示 图2-1 软件开发界面 单击“文件—新建—项目”,弹出新建项目管理界面,我们在里面进行了项目类型选择“5+APP”.项目名称填写“编程之路” ...

  8. 洛谷 P1039 侦探推理

    题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...

  9. 利用百度AI OCR图片识别,Java实现PDF中的图片转换成文字

    序言:我们在读一些PDF版书籍的时候,如果PDF中不是图片,做起读书笔记的还好:如果PDF中的是图片的话,根本无法编辑,做起笔记来,还是很痛苦的.我是遇到过了.我们搞技术的,当然得自己学着解决现在的痛 ...

  10. Kafka配置信息

    Kafka配置信息 broker配置信息 属性 默认值 描述 broker.id 必填参数,broker的唯一标识 log.dirs /tmp/kafka-logs Kafka数据存放的目录.可以指定 ...