我是怎样学习Java

我学习Java的时间不长,算是今年4月中正式开始的,到现在刚好半年,如果Java牛人看到这篇日志希望别骂我,感激不尽,我只想说说我怎么开始,怎么学习的。

所有的WEB开发按照一般步骤来说是从数据连接和访问开始,一开始我也没多想,直接用的MYSQL,目标很明确,初级分布式数据--主从分离,然后考虑到数据复制同步的时会有延迟,并且一个主带多个从数据库性能开销会有极限,于是设计了多级主从,也不是很高深,就是一个主数据库最多有6个从数据库,如果有更多的从数据库就开始分级,那么6个从数据库将会成为6个2级主数据库,然后下面分出三级数据库(从),如果更多的话就继续往下分吧。

数据访问没问题了,但是数据同步却成了大问题,从数据库越多,数据同步延迟就越成问题,所以这里要放一个缓存集群,而这个缓存本身设计成为一个穿透式缓存,就是所有的数据读取写入都要经过这里,然后要做点小处理。

好了,正式开始Java。当然这个缓存集群不是单给数据访问用的,别的地方也要用,比如Session,文件上传等。所以不好意思,我没认真研究过Hibernat,因为没时间,所以没发现Hibernat的二级缓存我该怎么用,才可以实现在他之外去二次处理这个东西。算了,于是就用了Hibernat引以为傲的数据关系映射。结果用他自带的映射生成插件的时候又有了点问题,因为我用了JTA事务,而Hibernat又没时间去找他那些深奥的东西,我仅仅需要的是从数据库读出数据,修改后保存到主数据(只有主数据库可写)。但是Hibernat太智能了,居然来个从哪里读,只要是托管对象,修改了这个对象的属性,他会自动提交更新数据,结果他自己提交到从数据库了,于是就报错了。还是因为时间问题,我自己又用.net写了一个数据映射生成工具,也管不了Hibernat有多强大了,一不做二不休,把整个Hibernat的数据访问帮助类全废掉了,自己实现了一个支持主从的访问类。别骂我,都是资本家惹的祸,时间过于紧凑,我又比较喜欢完美的东西,于是做了件大家看来很无聊的事情。

接着就是业务逻辑这块,刚Spring上手,就搞了一个月,硬是给他的那些概念搞昏了。随后实在没办法了(还是时间问题),吸取Spring的精华吧:AOP,IOC用了,其他的废掉了。IOC的话觉得他的注入形式不错,但是这个概念也不用说的这么复杂,以我的愚见,这个就是反射在后面倒腾出来的。还有AOP我真是开始没想转,就看到配置文件,注解这些东西搞来搞去,终于有天我愤怒了,开了天窗,这个不就是在.NET里面叫特性的玩意吗,原来换了个马甲。

好了这个东西好理解了,就是在方法上面加些看上去稀奇古怪的注解方法,然后Spring可以在你执行这个方法时,按照你的设定,在方法执行前,后,或都可以任意执行。就好象改变了整个方法的执行流程。其实这个原理还是反射在后面倒腾。

Jta搞定了,接着就是表现层了。看了Struts捣鼓了几天,发现这玩意以我这样的水平是搞不定了,而且受.net MVC和我以前写的一个PHP MVC框架的影响,我是真不喜欢用include这玩意了,发现这玩意不是一般的害人,于是JSP被首先废弃掉了。中间看了看Ruby的MVC,原来我之前写的东西的祖宗在这呢,好了,一不做二不休,自己搞个表现层框架吧,velocity也考虑过,但是我真不喜欢模板这2个字。我理想中的表现层它也必须要是一个对象,可以继承,可以覆盖。于是浩大的工程开始了,从Sevlet下手,看源代码,重新实现一个MVC框架,而最后输出的最顶层,为了可以在Eclips里面有智能感知,我也没时间去捣鼓自己写插件了,于是开始写了一个看上去和JSP差不多的东西。

如果熟悉.net的朋友应该知道母板页这个概念,还有页面即使对象也不会生疏。基本上就是我把.net那套MVC框架,和他的web编程方式在JAVA中完全实现了。最难的还是自己写类JSP的编译器,最后还是因为时间关系,代码解析用的正则,如果我有时间的话,那么我肯定会选择使用逐字编译,有时间再改吧。

基本到这一步对于Java的特性算是有了一个大概的了解。算下时间花了3个月,其实和直接上来就跑去配置SSH的同学比,应该时间用的是差不多的。不过我说真的,我现在根本不会配置SSH。这些东西都是瞎捣鼓出来的。

用哪种方式学Java其实都无所谓,有什么样的需求就有什么样的对策。等这个项目稳定到一定的程度后,我是想考虑把目前这个框架发布到开源社区,对于SSH的同学这玩意应该没什么用处,不过可以帮助从RUBY和.net转过来的同学快速上手进行大型WEB服务项目的开发。

附带一段控制器的代码:


package firstcore.gsp.mvc.controller.site;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import firstcore.com.utils.HttpUtils;
import firstcore.com.utils.string.JSON;
import firstcore.com.web.servlet.annotation.ActionValidate;
import firstcore.com.web.servlet.annotation.Ajax;
import firstcore.com.web.servlet.annotation.HttpPost;
import firstcore.com.web.servlet.http.RequestConvert;
import firstcore.com.web.servlet.mvc.view.Order;
import firstcore.gsp.app.IApp;
import firstcore.gsp.model.App;
import firstcore.gsp.model.User;
import firstcore.gsp.model.UserLogin;
import firstcore.gsp.service.impl.ServiceCenter;
import firstcore.gsp.utils.SiteConfig;
import firstcore.gsp.utils.UserValidate;
import firstcore.gsp.web.servlet.http.CurrentHttp;
import firstcore.gsp.web.servlet.mvc.Controller;
import firstcore.gsp.web.servlet.mvc.RegisterActionDealer;

public class signController extends Controller
{
    /**
     * 用户登录注册中心页面
     *
     * @param method
     * @param appCode
     * @return
     */
    @ActionValidate(isNeed = false, refererNotNeed = true, extDealer = RegisterActionDealer.class)
    public order indexAction(String method, String appCode)
    {
        this.viewData.put("method", method);
        this.viewData.put("appCode", appCode);
        return pageView("index");
    }

    /**
     * 用户提交注册
     *
     * @param entity
     * @return
     */
    @HttpPost
    @ActionValidate(isNeed = false, redirectNotNeed = "/u")
    public order registerAction(User entity)
    {
        List<String> infos = UserValidate.register(entity);

        String succeedUrl = "/sign/succeed/" + entity.getAppCode()
                + "?referer=" + HttpUtils.getCustomReferer("/u");
        return registerProcess(entity, infos, succeedUrl);
    }

    /**
     * 用户忘记密码
     *
     * @param user
     * @return
     */
    @Ajax
    @ActionValidate(isNeed = false)
    public order forgotAction(User entity)
    {
        JSON json = new JSON();
        boolean isSucceed = ServiceCenter.services.getSignService().forgot(
                entity);
        json.put("detail", entity.getAct());
        json.setSucceed(isSucceed);

        return jsonView(json);
    }
}


文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Java 编程 技术
相关日志:
评论: 3 | 引用: 0 | 查看次数: 1480
回复回复cow[2009-12-06 02:28 AM | del]
呵呵,终于又看到你blog了:)
回复回复kelvinshao[2009-12-01 10:36 PM | del]
呵呵 clear 也开始搞搞java了, 那些什么IOC,AOP概念,你怎么不问问Jerry或balduran这些大牛咧,比自己看书什么绝对来的快。
最近好撒 :)
回复来自 Clear 的评论 Clear 于 2009-12-09 10:31 PM 回复
kelvin哥,你什么时候从日本回来啊。
回复回复ryan[2009-10-12 10:59 AM | del]
支持胡董,3天精通一门语言~
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭