6 Star 3 Fork 2

Idiot_s_Sky / jSimple

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

jSimple

简介

1.源代码基于smart-framework开发,并在基础上进行深度改造,或者说是按我的意思改造。

2.同时也借鉴了jFinal的mvc中的多视图处理。

3.源码模块结构如下:

jSimple-parent(jSimple父级模块,配置基础依赖)
 L aop--利用cglib实现的aop,支持多拦截器(未排序)
 L bean--一个bean容器和一个扫描器
 L blog--angularjs开发的blog
 L cache--简单缓存实现,包括内存和memcached
 L config--整个jsimple配置常量接口
 L data--简单数据访问接口,基于dbutils开发,实现简单ORM,还有延迟加载
 L exception--统一jsimple异常类
 L hessian--hessian使用例子
 L ioc--依赖注入,基于bean容器的注入
 L mvc--mvc框架,应该说还是好好用的
 L utils--基于apache公共java库的一个公共库

PS. 拷贝别人代码,并改动成自己,望原作者见谅。

##入门

1.安装

clone代码之后,直接maven命令安装

mvn clean install

2.创建一个maven web工程

基本java目录结构如下:

com.sky.jSimple.blog
  ┗ controller/ 控制器
  ┗ entity/   实体
   ┗ dao/   数据访问
   ┗ service/   业务逻辑
   ┗ interceptor/   拦截器

3. 配置 Maven 依赖

<dependency>
   <groupId>com.sky.jSimple</groupId>
   <artifactId>jSimple-mvc</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>

4. 编写配置

resources 目录下,创建一个名为 jSimple.xml 的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jSimple>
    <mvc static-suffix=".jpg;.bmp;.jpeg;.png;.gif;.html;.css;.js;.htm;.ttf;.woff;.svg;.swf;.map"
         static-expire="3600"
            />
    <beans scan-package="${scan.package}">
        <bean id="dataSource"
              class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url"
                      value="${jdbc.driver}"/>
            <property name="username" value="${jdbc.user}"/>
            <property name="password" value="${jdbc.pwd}"/>
            <property name="initialSize" value="10"/>
            <property name="maxIdle" value="20"/>
            <property name="minIdle" value="5"/>
            <property name="maxActive" value="50"/>
        </bean>
        <bean id="sessionFactory" class="com.sky.jSimple.data.SessionFactory">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <bean id="jSimpleDataTemplate" class="com.sky.jSimple.data.JSimpleDataTemplate">
            <property name="sessionFactory" ref="sessionFactory"/>
            <property name="dbType" value="mysql"/>
        </bean>
        <!--默认是memoryCacheManager,去掉注释用的是memcached-->
        <!--<bean id="memcachedCacheManager" class="com.sky.jSimple.cache.MemcachedCacheManager">-->
        <!--<property name="servers"  value="192.168.153.132:11111,192.168.153.133:11111" />-->
        <!--<property name="weights"  value="1,1" />-->
        <!--</bean>-->
        <!--<bean id="cacheProxy" class="com.sky.jSimple.cache.CacheProxy">-->
        <!--<property name="cacheManager"  ref="memcachedCacheManager" />-->
        <!--</bean>-->
    </beans>
</jSimple>

这里很像spring的做法,之所以用这个,主要是因为想实现一个类下面的多个bean实体的配置,例如多数据源,当然还有就是灵活配置

然后在web.xml 添加一个serlvet

 <servlet>  
        <servlet-name>jsimplemvc</servlet-name>  
        <servlet-class>com.sky.jSimple.mvc.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>configPath</param-name>
          <param-value>/jSimple.xml</param-value>
        </init-param>
      <load-on-startup>1</load-on-startup>
    </servlet>  
    <servlet-mapping>  
        <servlet-name>jsimplemvc</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  

5. 编写entity

@Entity("blog")
public class Blog implements Serializable {

    @Id
    private long id;
    private String title;
    private String content;
    private Date createdDate;
    private Date lastModifiedDate;
    private long uid;
    private long viewCount;
    private String linkName;
    private long categoryId;
    private String tags;

    private int isRecommend;

    @GetEntity(condition = "id=?", values = "categoryId")
    private Category category;

    @GetEntity(condition = "id=?", values = "uid")
    private User user;

    @GetCount(condition = "blogId=?", values = "id", cls = Comment.class)
    private Long commentCount;
    
    //getter/setter

}

里面@Entity注解里面是表名,@Id注解是必须的,@GetEntity@GetCount是延迟加载的对象注解。

6.dao编写

@Bean
public class BlogDao {
    @Inject
    private JSimpleDataTemplate jSimpleDataTemplate;

    public void insert(Blog entity) {
        jSimpleDataTemplate.insert(entity);
    }


    public void update(Blog entity) {
        jSimpleDataTemplate.update(entity);
    }

    public void delete(Long id) {
        jSimpleDataTemplate.delete(id, Blog.class);
    }

    public Blog getById(Long id) {
        return jSimpleDataTemplate.getById(Blog.class, id);
    }
    
    //getter/setter
}

@Bean代表此类放进bean容器里面,@Inject 注入进去,可以传参数进去代表注入的是那个bean例如@Inject("jSimpleDataTemplate"),同时注意的是被注入对象必须有setter

7.service编写

@Bean
public class BlogService implements IBlogService {
    @Inject
    private BlogDao blogDao;

    @Transactional
    public void insert(Blog entity) {
        blogDao.insert(entity);
    }

    @Transactional
    public void update(Blog entity) {
        blogDao.update(entity);
    }

    public void delete(Long id) {
        blogDao.delete(id, Blog.class);
    }

    public Blog getById(Long id) {
        return blogDao.getById(Blog.class, id);
    }
   
    //getter/setter
}

@Transactional 事务处理,里面可以放入多个dao操作。

8.Controller 编写

@Bean
public class BlogController extends ControllerBase {
   @Inject
   private IBlogService blogService;
   
   @HttpPost("/api/blog")
   public ActionResult addBlog(Blog blog)  {
   
           blog.setCreatedDate(new Date());
           blog.setLastModifiedDate(new Date());
           blog.setUid(1);
           blog.setViewCount(0);
           blogService.insert(blog);
   
           return json(blog);
   }
   
   //setter/getter
}

controller中最重要的是用@HttpPost 标记的方法,方法参数是由前端post过来参数,支持封装到一个对象,map等。
例如:url /api/blog/{id}/edit?page=1
相应的参数是(int page,int id)或者是(Map map)或者是包含page和id两个属性的实体。
目前有@HttpPost @HttpGet @HttpPut @HttpDelete 四种标记。

返回的ActionResult 支持多种,json,html,jsp,file,freemarker,velocity等,同时易于扩展。 例如,我要返回一个验证码,那我要怎么实现一个ActionResult,代码如下:

public class ValidateCodeResult extends ActionResult {
    @Override
    public void ExecuteResult() {
        response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
        response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expire", 0);
        //验证码类,用来生成验证码的类库
        RandomValidateCode randomValidateCode = new RandomValidateCode();
        try {
            randomValidateCode.getRandcode(request, response);//输出图片方法
        } catch (Exception e) {
            throw new JSimpleException(e);
        }
    }

}

在controller调用

@HttpGet("/validateCode")
public ActionResult getValidateCode()
{
   return new ValidateCodeResult();
}

So easy!

9.异常处理

每个controller里面都有一个onException的方法,默认是返回打印错误信息的页面,直接覆盖onException可以实现自定义的异常 例如一个ajax请求,我不需要返回一个错误信息的页面而是一个json,那么代码可以这样写:

 public class AjaxController extends ControllerBase {
 
     public void onException(Throwable e, HttpServletRequest request, HttpServletResponse response) {
         try {
             Map map=new HashMap();
             map.put("error",e);
             json(map).ExcuteResult();
         } catch (JSimpleException e1) {
             // TODO Auto-generated catch block
             e1.printStackTrace();
         }
     }
     
 }

10.拦截器编写

假如我要实现一个非登陆跳转的拦截器,代码如下:

@Order(98)
public class NeedLoginInterceptor extends Interceptor {

    public Class<? extends Annotation> getAnnotation() {
        return Login.class;
    }

    @Override
    public ActionResult before(Class<?> cls, Method method, Object[] params) {
        if (BlogContext.getUser() == null) {
            return new RedirectResult("/user/login?path=" + request.getAttribute("encodeUrl"));
        }
        return null;
    }

    @Override
    public void after(Class<?> cls, Method method, Object[] params, ActionResult result) {
    }

}

@Order注解表示,这个拦截器执行顺序,越大表示执行最前面。getAnnotation()表示标记了什么注解方法会被拦截。
before()after() 代表方法之前和之后执行,必须要注意的是before()返回非空表示直接返回,不往下执行了。

总结

这个框架还存在很多问题,我只能说,就当学习一下呗。上面的实例代码来自一个基于这个框架写的blog,jsimple-blog,多谢捧场哦。

PS

再次强调,拿了别人的代码改成自己的总是不好的,请原作者见谅。

空文件

简介

源代码基于smart-framework开发,并在基础上进行深度改造,或者说是按我的意思改造。 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/sjj050121014/jSimple.git
git@gitee.com:sjj050121014/jSimple.git
sjj050121014
jSimple
jSimple
master

搜索帮助