1.Servlet结合JSP做MVC三层开发遇到的问题?
接着上一篇博客里面讲的实现一个简略版本的MVC框架,这个框架是基于Servlet技术的,为什么要写这个Mini版本的MVC框架呢,相信做过Servlet和JSP开发的哥们都有一个感受,贴上代码:
public class UserServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("UTF-8");
//获取请求参数
String method = request.getParameter("method");
//根据不同的method执行相应的方法
if("add".equals(method)){
add(request,response);
} else if("update".equals(method)){
update(request,response);
} else if("delete".equals(method)){
delete(request,response);
}
}
/* 删除逻辑代码 */
private void delete(HttpServletRequest request, HttpServletResponse response) {
//code
}
/* 更新逻辑代码 */
private void update(HttpServletRequest request, HttpServletResponse response) {
//code
}
/* 添加逻辑代码 */
private void add(HttpServletRequest request, HttpServletResponse response) {
//code
}
/* 方便Post请求和Get请求一起处理的方式 */
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.框架的诞生解决实际开发遇到的问题
1.为什么要有框架?
框架是用来解决实际的开发问题而出现的。
2.为什么会有MVC?
MVC可以这样理解M是Model的意思 V是View视图而C是控制层,当时Java刚开始做web系统的时候只有JSP,如果将数据库连接和数据显示都放到一个JSP页面中完成,这样页面非常混乱为了解决这个问题诞生了一种解决方案,JSP+Servlet结合开发JSP负责显示数据,连接数据库的逻辑放在Servlet中实现,可以说出现了两层了V+C,可是这样发现数据直接显示中间没有得到数据的复用,如果数据多了不好办了,这个时候JavaBean就加入了进来充当了Model负责数据的封装,封装从数据库读取的数据。到这里MVC就完全出现了。小型网站最适合这种三层架构方案JavaBean+JSP+Servlet。
下图可以帮助理解MVC:
3.简略版MVC框架JWork实现方案
以上知道了为什么会出现框架,其实都是为了简化开发。
1.JWork的优点:
a.使用注释进行映射访问URI
b.使用Servlet的方式进行设计
c.约定Action结尾为.go后缀
d.访问传递参数为method方式,不传递则默认执行work方法
e.只需要在web.xml中配置一次servlet
2.JWork实现原理
a.在Web服务器启动的时候,扫描项目中所有编译后的class字节码文件,将有注解部分的字节码文件加载到JVM中虚拟机中,同时将实例化的Action对象和注解路径进行映射。获取所有web请求,根据请求路径到实例化Action对象的JVM容器中查找相对应的Action字节码文件,通过反射调用方法。
b.在实现的过程中自定义类加载器是实现的关键
/*
* 自定义类的加载器,JDK中没有提供根据路径进行加载类的方法,只能
* 自定义类加载器根据路径进行加载字节码文件,从而将字节码文件转换
* 成对象的形式,在JVM启动的时候进行加载
*/
class KylinLoader extends ClassLoader {
/*
* 委托父级类加载器进行加载
*/
public KylinLoader(ClassLoader parent) {
super(parent);
}
public Class load(String path) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(new File(path));
int len = 0;
byte buffer[] = new byte[1024];
//循环读取
while ((len = fis.read(buffer)) > 0) {
bos.write(buffer, 0, len);
}
//清除数据流缓存
bos.flush();
//转换成字节数组
byte b[] = bos.toByteArray();
//调用父类的方法完成操作
return super.defineClass(null, b, 0, b.length);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
为什么要自定义类加载器呢?JDK中没有提供根据路径加载字节码文件的功能所以只有自己实现这个功能,思路是根据路径读取字节码文件,将其转换成字节数组,然后通过JDK提供的defineClass方法将字节码文件真正装载到JVM中以Class对象的形式存在。
c.注解中一定要标明在运行时环境@Retention(RetentionPolicy.RUNTIME)
package org.kylin.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Mapper {
//映射路径
String value();
}
以上就把MVC的实现要点说完了,同时这个JWork我在一些小系统中还是经常使用的比Struts2、Spring MVC好用多了,前提是小网站系统。并且JWork已经开源可以到我的GitHub上查看使用和源码。
非常高兴和大家交流学习
自由转载,创意许可,请注明文章来源,来自这里