申精-JWeb框架,比struts2的拦截更强大更灵活更简单更通俗,比SpringMVC更简单!

汪春滋 2017-02-12 09:50:38
写了个框架。欢迎大家指点、提意见、讨论、反馈bug.
前言:
1.JWeb框架使用servlet3.0+版本以上。无需配置web.xml文件即可自动注册拦截器。
2.支持原生Servlet3.0+JWeb强大的过滤、校验相结合。
3.不差struts2分毫的拦截器(我们还是亲切点,叫回过滤器),却比其他更简单!更灵活!!更高效!!更易维护!!!
4.基本无多少学习代价。设计之初便考虑到最初的Servlet习惯!但我们做到了简单使用,不简单功能实现!!

一个简单的而强大的框架,往往设计上会复杂得多,并耗性能。但我们做到了简单、高速、易用相结合。这得益于作者的耐心与数学功底。
不只是代码,连同设计流程也一起奉献。以顺让用户完全把握框架,从而从多而杂的开源框架中,拥有自己的框架,离开框架的变动、出现bug无从下手……等等问题脱离出来,如同请了位架构师,在为您公司无偿加班了一段时间

本框架最大的好处,
一是基于高效的数据模型;
二是基于强大的过滤器(完全可以定制过各种同用视图!);
三支持扫描式配置(比如/xx/xx开关的请求路径统一要经过xx过滤器/过滤组。是不是很自然地想到权限的管理呢?),
四是没有封装过度!!不会出现隔年无人会用的尴尬!而且封装过度,还消耗性能,加大维护难度,二次开发及后期人员变动,投入的预备阶段的成本!!最关键的是,没有封装过度,还非常好用、简单。
一、hello!
建一个类,加入@H与@M标注即可进行访问!通过@H+@M的值进行访问。

@H("/say")
public class HI {
@M("/yousay")// 通过 /say/yousay访问。
public static void selectOne(JWeb jw) {
jw.printOne("hello!!!!!");
}
}

二、获得用户传参
1. 直接获取。
2. 通过对象,自动装箱。
对象的属性名,就是用户传过来的参数名;属性值,就是用户传过来的参数值。
例子:

package wx.web;

import java.text.SimpleDateFormat;
import system.web.JWeb;
import system.web.hm.annotation.H;
import system.web.hm.annotation.M;
import system.web.validate.annotation.Validate;

/**
*
* @author wangchunzi
*/
@H("/login")
public class UserLogin {

@M("/user")//
@Validate(UserLoginValidate.class)
public static void selectOne(JWeb jw) {
//直接取参数
// String account = jw.getString("account");
// String passord = jw.getString("passord");
//注意,取日期、时间的格式,如果没有配置,默认采用框架的全局配置格式。
//置于是用日期格式来转换还是用时间格式来转换,框架会对比值与格式的长度决定 。
// jw.getDate("mydate");//取mydate字段的时间
// jw.getDate("mydate", "yyyy-MM-dd"); 指定格式进行取日期
//------------------------当然,如果参数多,我们通过对象式取参(根据传入的类型,自动装箱)---------------------------------------------------------
//对象式取参
UserVO vo = jw.getObject(UserVO.class);
//此对象取时间时,因为我们没有传时间格式给取参对象的方法,所以,它默认取全局配置的时间配置。
jw.request.setAttribute("ok_return", "你发送的数据:"
+ vo.account
+ "//" + vo.passord
+ "//" + new SimpleDateFormat("yyyy/MM/dd").format(vo.mydate)
);

jw.forward("/index.jsp");
}
}

如果要演示对象传参,还需要建一个vo对象:

package wx.web;

import java.util.Date;

public class UserVO {

public String account;// 或者私有化访问域也能取取值的如 private String account;
public String passord;
public Date mydate;
}

三、校验用户传参:ValidateModel
第一步:
定义一个类,然后继承ValidateModel抽象类。
实现其中的抽象方法即可。
public abstract void iniValidate();
public abstract ValidateResultModel recheck(JWeb jw, Map<String, ValidateFieldModel> map, ValidateResultModel vr);
例子:

package wx.web;

import system.web.validate.model.ValidateModel;
import system.web.JWeb;
import system.web.validate.model.ValidateFieldModel;
import system.web.validate.model.ValidateResultModel;
import java.util.Map;

public class UserLoginValidate extends ValidateModel {

{
super.setReturnMsgKey(ValidateModel.VALIDATE_MSG_KEY);//这个key的作用是,存在request对象属性的key.
super.setReturnURL("/index.jsp");//校验不通过时,跳转的路径。
}

@Override
public void iniValidate() {
super
.put("mydate", "[0-9]{4}-{1}[(01|02|03|04|05|06|07|08|09|10|11|12)]{2}-{1}[0-9]{2}", "类似格式1988-08-21", true)
.put("account", "[a-zA-Z0-9]{1,12}", "账号只能用数字与字母组成。并且不能超出12位", true)
.put("passord", "[a-zA-Z0-9]{1,16}", "密码只能用数字与字母组成。并且不能超出16位", true);
}
// //错误时调用,当然,已经默认的逻辑处理。如果要自定义,请重写此方法
// @Override
// public void error(JWeb jw, ValidateResultModel vr) {
// if (url.isEmpty()) {
// jw.printOne(vr.getMsgByJson());
// System.out.println(vr.getMsgByJson());
// return;
// }
// System.out.println(this.msg_key.isEmpty() ? ValidateModel.VALIDATE_MSG_KEY : this.msg_key);
// for(Map.Entry e:vr.getMsgByMap().entrySet()){
// System.out.println(e.getKey()+"//"+e.getValue());
// }
// jw.request.setAttribute(this.msg_key.isEmpty() ? ValidateModel.VALIDATE_MSG_KEY : this.msg_key, vr.getMsgByMap());
// jw.forward(url);
// }

@Override
public ValidateResultModel recheck(JWeb jw, Map<String, ValidateFieldModel> map, ValidateResultModel vr) {
//上面的校验通过后,都才进行复检
//当vr里有值时,默认不通过复检。(传参来的vr对象是干净的。)
return vr;
}

// //复验失败时调用,当然,已经有默认的逻辑处理。如果要自定义,请重写此方法error
// @Override
// public void errorRecheck(JWeb jw, ValidateResultModel vr){
//
// }
}

第二步,用上我们的校验
在需要进行校验的地方,直接使用@Validate(你的检验类.class)
回到用户传参 例子中:

@H("/login")
public class UserLogin {

@M("/user")//
@Validate(UserLoginValidate.class)//请注意我。我是校验。我这样用
public static void selectOne(JWeb jw) {
//直接取参数

四、文件上传
1.使用commons-fileupload控件上传支持
所以,需要加入两个jar包:commons-fileupload 与commons-io

package wx.web.filemanager;

import configuration.file.ImgFileModel;
import system.web.JWeb;
import system.web.file.FI;
import system.web.file.engine.FileEngine;
import system.web.hm.annotation.H;
import system.web.hm.annotation.M;

@H("/fileup")
public class ImgUp {

@M("/one/img")//fileup/one/img
public static void up(JWeb jw) {
//初始化一个上传引擎(需要传入HttpServletRequest对象
FileEngine file = new FileEngine(jw.request); //请注意我 注意我 注意我
//执行上传操作。默认上传第一个文件(假如有多个文件的吗)
FI upOne = file.upOne(ImgFileModel.class);
// java.util.List<FI> upVast = file.upVast(ImgFileModel.class);//批量上传操作
// file.upOne(ImgFileModel.class, "file");//指定参数名上传
// file.upVast(ImgFileModel.class, "file");//指定参数名,批传

//返回json数据。注意,FI对象重写了toString,此方法现在返回的是json数据
jw.printOne(upOne.toString());
}
}

如上,在执行上传时,需要传入一个ImgFileModel.class,这个类必须要继承FileModel类。
如具体的配置如下完整代码:

package configuration.file;

public class ImgFileModel extends system.web.file.FileModel {

@Override
public void configuration(system.web.file.temp.FileConfig fc) {
//web根目录的绝对路径.直接采用全局配置实例中,取得即可。
fc.path_web_real = system.web.WebContext.getWebContext().WEB_PATH;
fc.path_save = "upload/img/"; //上传的目录
fc.fileNameSuffix_alloy = "gif,jpg,jpeg,bmp,png";//图片类型后缀
fc.fileSize_max = 2 * 1024 * 1024; //文件大小
//文件缓冲,及写入硬盘临时文件的临界值
//如果采用Servlet原生支持,两处fileSizeThreshold的值都必须一样!
fc.fileSizeThreshold = 2 * 1024 * 1024;
//等其他参数。
}
}

2使用Servlet原生的上传。
跟上例差不多。区别就是,下面直接使用原生的Servlet(注意,下例子的 extends Servlet,实际就是,就是扩展HttpServlet.框架提供Servlet类封装,是方便使用JWeb对象。)
另外要注意的就是,一定要配置fileSizeThreshold的值。同时,还要跟配置ImgFileModel类的fileSizeThreshold一样!!


package wx.web.filemanager;

import configuration.file.ImgFileModel;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import system.web.JWeb;
import system.web.file.engine.PartEngine;
import system.web.servlet.Servlet;

@WebServlet(name = "UpImgFile", urlPatterns = {"/UpImgFile"})
@MultipartConfig(location = "", fileSizeThreshold = 2 * 1024 * 1024)
public class UpImgFile extends Servlet {

@Override
protected void doService(JWeb jw) throws ServletException, IOException {
PartEngine pe = new PartEngine(jw.request);
pe.upOne(ImgFileModel.class);
}
}

篇幅原因,过滤器放下篇

源码地址
https://git.oschina.net/it_weixin/JWeb

源码地址空间的附件 中有框架设计图及演示项目。

视频教学
http://pan.baidu.com/s/1gf61Xh5
...全文
484 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
汪春滋 2017-02-12
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/392085398 续篇 过滤器在此处

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧