Earth's profileLet's go insideBlogListsNetwork Tools Help

Blog


    move to baidu hi space

    msn space is as slow as a snail
    new blog address: codecode studio, welcome to visit

    congrats

    The first good news:
    Sky won the WCG2006 champion,actually i watched the Live last night, follow this link for more details and leave a message there:
    sky's sina blog

    The second good news:
    I received 5 ubuntu CDs today from receptionist due to my subscription one month ago from Ubuntu Official Website, tho it's 6.06 LTS, it's terrific news for me! i m very excited about that~

    ~

    ~

    JSF - first intimate contact

    以前一直习惯用JBuilder,开始慢慢习惯Eclipse,寻找热键是我爱做的事:
    Ctrl+J 代码自动提示(用的最多,习惯了JBuilder的热键设置方式)
    Shift + Ctrl + F 格式化(其次多)
    Ctrl + Alt + Z窗口最大化
    Shift + Enter 在当前行下插入一行,光标移至下一行开始
    Ctrl + D: 删除当前行
    Ctrl + ↓复制当前行/段落 
    Alt+↓ 当前行和下面一行交互位置
    F3或Ctrl + Click: 查找类定义
    Ctrl + Shift + G 寻找所有该东东出现的地方
    Ctrl + K相当于JB中的F3
    Ctrl + F查找/替换
    目前就用这几个,慢慢熟悉
     
    新建Web Project,名为HelloJSF,设置工程编码为UTF-8
     
    MyEclipse-> add JSF capability,在弹出的对话框内选择:
    Sun JSF Reference Implementation 1.1.01
    /WEB-INF/config/faces-config.xml
    Faces Servlet
    *.jsf ,
    Finish ->可以看见MyEclipse自动导入了我们所需的jar包,如下:
    commons-beanutils,commons-collections,commons-digester,commons-logging(非必需),
    jsf-api,jsf-impl,jstl,standard
    而且自动生成了如下web.xml
      <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/config/faces-config.xml</param-value>
      </context-param>
      <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
      </servlet-mapping>
     
    环境搭建好后,接下来要添加实际的内容了:
    Step1:建一个POJO:  onlyfan.caterpillar.UserBean,其中有一个name属性及相应的s-getter
    Step2:双击faces-config.xml, 在它的Design视图中,我们直接建立两个JSP,
    index.jsp和welcome.jsp并Add a navigation case
    建JSP参数如下:/HelloJSF/web/pages, index.jsp, [6] Default JSF Template
    建Navigation case如下:
    在from Outcome中填login,切换到Source视图,可以看到自动生成了如下代码:
    <faces-config >
     <navigation-rule>
      <from-view-id>/pages/index.jsp</from-view-id>
      <navigation-case>
       <from-outcome>login</from-outcome>
       <to-view-id>/pages/welcome.jsp</to-view-id>
      </navigation-case>
     </navigation-rule>
    </faces-config>
    我们在其中加上如下一段
     <managed-bean>
      <managed-bean-name>user</managed-bean-name>
      <managed-bean-class>onlyfan.caterpillar.UserBean</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>
     
    修改index.jsp内容如下:
      <f:view>
       <h:form>
     InputName:
     <h:inputText value="#{user.name}"></h:inputText>
        <p>
         <h:commandButton value="send" action="login"></h:commandButton>
       </h:form>
      </f:view>
    修改welcome.jsp内容如下:
     <f:view>
      Hello!<h:outputText value="#{user.name}"></h:outputText>
     </f:view>
    发布,并启动Tomcat5,在web browser中输入http://localhost:8080/HelloJSF/pages/index.jsp页面报错如下:
    javax.servlet.ServletException: Cannot find FacesContext
    在google上搜索原因如下:

    In the web.xml you specify how your faces are called. For example as *.faces

       <servlet-mapping>
          <servlet-name>Faces Servlet</servlet-name>
          <url-pattern>*.faces</url-pattern>
       </servlet-mapping>

    When you want to call an index.jsp in the webRoot you have to call it as shown in the example below:

    http://localhost:8080/LearningJSF/index.faces

     

     

    (原)EC使用技巧之 自定义EC的过滤功能

    EC为我们提供的功能有:

    过滤(filter

    排序(sort

    分页(pagination

    导出(export

     

    可是在实际应用中,EC自带的过滤功能往往不够强大。下面的文章就是如何将EC的过滤功能独立出来,放在一个单独的页面query.jsp中。

    我们不再使用FilterSet, FilterQuery等等。而是将第1次的查询条件dto保存在session里面,接下来的sort, pagination, export均在这个dto基础之上进行。

     

    为了减少类的个数。我将servicedao放在一起。使用struts做为应用的框架

    action这样写。

    (1)ECaction (红色部分为需要改动的地方)

        private static int defaultRowsDisplayed = Integer.parseInt(ConfigSet.

                getInstance().get("defaultRowsDisplayed"));

        public ActionForward execute(ActionMapping mapping,

                                     ActionForm actionForm,

                                     HttpServletRequest request,

                                     HttpServletResponse response) {

            HttpSession session = request.getSession();

            MapPoiActionForm form = (MapPoiActionForm) actionForm;

            String type = StringUtil.nvl(form.getType(),"display");

            if (type.equals("display")){

                // ----  构造查询条件  -----------

                MapPoiDto dto = (MapPoiDto) session.getAttribute("mp_dto");

                if (dto == null && form!=null) {

                   dto = new MapPoiDto();

    dto.setPoi_id(form.getPoi_id());

    ……

                   session.setAttribute("mp_dto ", dto);               

    }

     

                MapPoisDao dao = new MapPoisDao();

                int totalRows = dao.getBeanCount(dto);

                Context context = new HttpServletRequestContext(request);

                LimitFactory limitFactory = new TableLimitFactory(context,"ec_mp");

                Limit limit = new TableLimit(limitFactory);

                limit.setRowAttributes(totalRows, defaultRowsDisplayed);

                Collection mappois = dao.getBeans(limit.getSort(),

                                                    limit.getRowStart(),

                                                    limit.getRowEnd(), dto);

                request.setAttribute("mappois", mappois);

                request.setAttribute("totalRows", new Integer(totalRows));

                return mapping.findForward("display");

    和以前的代码相比,

                Collection presidents = presidentsService.getPresidents(limit.

                        getFilterSet(), limit.getSort(), limit.getRowStart(),

                        limit.getRowEnd());

    少了一个limit.getFilterSet(),  多了dto,意思是不使用EC的过滤功能, 而用自己的dto来构造,但保留其它功能。

    Session中的dto必须在list.jsp的出口处被移除。比如index.jsp。最好是在query.jsp中也写上session.removeAttribute(“mp_dto”); 完全不用session的做法尚在研究中。

     

    接下来看另一大块:DAO层如何写, 代码量比较多,但只有红色的部分需要重写,其它只需拷贝就可以了。

    public class MapPoisDao {

        public final static String tableName = "MAP_POI";

        public final static String beanName = "lp.mappoi.dao.MapPoi";

       

        public MapPoisDao() {

        }

        private String startQuery() {

            return "SELECT * FROM ("

                    + "SELECT " + EcUtil.getBeanPropertyAsString(beanName)

                    + ", rownum AS my_rownum FROM (SELECT * FROM " + tableName;

        }

     

    // service

        public int getBeanCount(MapPoiDto dto) {

            String query = "";

            query = "SELECT count(*) FROM " + tableName;     // init

            query = filterQuery(dto, query);                // where

            return getRowCount(query);

        }

     

        public Collection getBeans(Sort sort,

                                     int rowStart, int rowEnd, MapPoiDto dto) {

            String query = startQuery();                 // init

            query = filterQuery(dto, query);             // where

            query = sortQuery(sort, query);              // order by

            query = limitQuery(rowStart, rowEnd, query);  // limit

            return getBeans(query);

        }

     

        private String filterQuery(MapPoiDto dto, String query) {

            StringBuffer sb = new StringBuffer(query);

            if (query.toUpperCase().indexOf("WHERE") == -1) {

                sb.append(" WHERE 1 = 1 ");

            }

            if (dto != null) {

            // ----------- 构造where子句 -------------------

              sb.append(SqlUtil.getLike("poi_id", dto.getPoi_id()));

              ……

               sb.append(SqlUtil.getDateLike("update_date",dto.getUpdate_date(),"yy-MM-dd"));

            }

            return sb.toString();

        }

     

        private String sortQuery(Sort sort, String query) {

            if (!sort.isSorted()) {

                String defaultSortOrder = null;

                defaultSortOrder = " ORDER BY update_date DESC";

                if (StringUtil.isNotBlank(defaultSortOrder)) {

                    return query + defaultSortOrder;

                }

                return query;

            }

            String property = sort.getProperty();

            String sortOrder = sort.getSortOrder();

            StringBuffer result = new StringBuffer(query + " ORDER BY ");

            result.append(property + " " + sortOrder);

            return result.toString();

        }

     

        private String limitQuery(int rowStart, int rowEnd, String query) {

            return query += SqlUtil.getSqlEnd(rowEnd, rowStart);

        }

     

        private Collection getBeans(final String query) {

            Connection conn = null;

            PreparedStatement pstmt = null;

            ResultSet rs = null;

            try {

                conn = Sys.getConnection();

                pstmt = conn.prepareStatement(query);

                rs = pstmt.executeQuery();

                ArrayList table = new ArrayList();

    while (rs.next()) {

    // ------- 构造 POJO -------

                    MapPoi mp = new MapPoi();

                    mp.setPoi_id(rs.getString("poi_id"));

                         ……

                    table.add(mp);

                }

                return table;

            }

            catch (Exception ex) {

                ex.printStackTrace();

            }

            finally {

                Sys.close(rs, pstmt, conn);

            }

            return null;

        }

        private int getRowCount(final String query) {

            return Sys.getDb().getRowCount(query);

        }

    }这样实现一个具有自定义查询,按字段排序,分页,导出Excel或Pdf格式数据功能的模块只只需要写一个简单的查询界面query.jsp, 一个简单的ec界面list.jsp和一个action和一个dao (bean和dto可以忽略不计)而且大部分代码只需要拷贝一下。实际动手写的地方几乎没有。

    EJB全自动生成器EJBMaker1.1

    EJB全自动生成器EJBMaker1.1,真正的全自动。输出的文件(有三大块)包括:

    (

    一个是src文件夹,存放ejb源码(包括pojo, dto, logic interface, SLSB, BMP,CRUD测试类)

     

    一个是EJB文件夹,存放ejb配置文件,具体是ejb-jar.xml, jboss.xml, MANIFEST.MF, ejb-modeler-layout.xml

     

    还有一个是生成的jpx-node结点的代码

    )  

    这些文件已经按包名放好,

     

    把它们直接拷贝到jbuilder工程目录下。(直接拷贝,无需做任何改动。)

    然后用Editplus打开jpx文件,将生成的jpx-node结点放在jpx文件中原有的最后一个<node>结点后,保存,OK. 启动jboss, 在生成的测试类上右键run!.即可测试。就这么简单!!

     

     (注:jpx文件是JBuilder的工程文件,实质是一个xml文件,一个EJBModule对应里边的一个Node节点)

     

    上一版的EJBMaker3-4bug,今天在新的项目中花了一天时间才测出来了。新版的EJBMaker基本无任何bug,且不用写任何代码。

     

    以下是测试用数据库:

    TBL_TEST

     

     

     

    TEST_ID

    INTEGER

    PK

     

    TEST_NAME

    VARCHAR2(50)

     

     

    TEST_NUMBER

    NUMBER

     

     

    TEST_DESCRIPTION

    CLOB

     

     

    TEST_PIC

    BLOB

     

     

    CREATE_EMP_SYS_ID

    VARCHAR2(20)

     

     

    UPDATE_EMP_SYS_ID

    VARCHAR2(20)

     

     

    CREATE_DATE

    DATE

     

     

    UPDATE_DATE

    DATE

     

     

    时间过的真快!

    初学DTree

    今晚花点时间学了下dtree, 没有仔细看。代码极其简单一个bean,一个jsp,全部搞定。

    第一步,下载DTREE组件:http://www.destroydrop.com/javascripts/tree/

    第二步,看帮助文档和示例:

    dtreeadd方法说明如下:

    Parameters

    Name

    Type

    Description

    id

    Number

    Unique identity number.

    pid

    Number

    Number refering to the parent node. The value for the root node has to be -1.

    name

    String

    Text label for the node.

    url

    String

    Url for the node.

    title

    String

    Title for the node.

    target

    String

    Target for the node.

    icon

    String

    Image file to use as the icon. Uses default if not specified.

    iconOpen

    String

    Image file to use as the open icon. Uses default if not specified.

    open

    Boolean

    Is the node open.

     

    Example

    mytree.add(1, 0, 'My node', 'node.html', 'node title', 'mainframe', 'img/musicfolder.gif');

     

    接下来开始动手实践。

    (1) DB

    CREATE TABLE FUNCTIONS

    (

      ID        VARCHAR2(10 BYTE)                   NOT NULL,

      PID       VARCHAR2(10 BYTE)                   NOT NULL,

      NAME      VARCHAR2(20 BYTE)                   NOT NULL,

      URL       VARCHAR2(50 BYTE),

      TITLE     VARCHAR2(20 BYTE),

      TARGET    VARCHAR2(10 BYTE),

      ICON      VARCHAR2(20 BYTE),

      ICONOPEN  VARCHAR2(20 BYTE),

      OPENED    CHAR(1 BYTE),

      CONSTRAINT PK_FUNCTIONS PRIMARY KEY (ID)

    )

    插数据:

    0

    -1

    我的权限

     

     

     

     

     

     

    1

    0

    用户管理

     

     

     

     

     

     

    2

    1

    创建新用户

     

     

     

     

     

     

    3

    1

    删除用户

     

     

     

     

     

     

    4

    0

    文章管理

     

     

     

     

     

     

    5

    4

    添加新文章

     

     

     

     

     

     

    6

    4

    修改文章

     

     

     

     

     

     

    7

    4

    删除文章

     

     

     

     

     

     

     

    (2)POJO: Functions.java 太简单了,略。。。。

    (3)JSPtestDTreee.jsp

    先要导入dtree.js, dtree.css ,并把img目录拷贝到与jsp同级目录

    <div class="dtree">

    <a href="javascript: d.openAll();">open all</a>

    |<a href="javascript: d.closeAll();">close all</a>

    <%

      String sql = "select * from functions";

      Collection list = Sys.getDb().fastQuery(sql, "project.tek.dtree.Functions");

    %>

    <script type="text/javascript">

    <!--

    d = new dTree('d');

    d.config.folderLinks=false;

    d.config.useCookies=false;

    <%

    for (Iterator iter = list.iterator(); iter.hasNext(); ) {

        Functions f = (Functions) iter.next();

        String id = f.getId();

        String pid = f.getPid();

        String name = f.getName();

        String url = f.getUrl();

        String title = f.getTitle();

        String target =  f.getTarget();

        //String icon = f.getIcon();

    %>

        d.add(<%=id%>,<%=pid%>,'<%=name%>','<%=url%>','<%=title%>','<%=target%>');

    <%}%>

          document.write(d);

    //-->

    </script>

    </div>

    其中

    Functions 是一个bean(pojo); list 是它的集合(beans),由于在fastQuery中用到了反射,传入sql语句和bean的名字就可以快速查出bean的集合。

    OKgo back home

    WinCvs 从0 开始

    一、安装(一路往下点)

    一共要装3个软件:

    WinCvs 2.0.2.4

    CVSNT 2.0.51d

    WinMerge 2.4.2.0

    + Python 2.4.2

     

    二、客户端的设置

    主菜单Admin -> preferences

    Globals选项卡

    Files 选择Read-only

     

    WinCvs选项卡

    External D:\Program Files\WinMerge\WinMerge.exe

    Default  D:\Program Files\EditPlus 2\editplus.exe

     

    主菜单Remote -> Create a new repository

    Init Settings选项卡

    CVSROOT 点击有...的按钮

    Protocol:   pserver

    Repository: \MIOTour

    Username:   Smart

    Password:   Smart

    Hostname:   10.83.2.194

    Port:       2401

     

    WinCvs左上角的那个窗口中右键->Checkout module...

    弹出Checkout settings选项卡

    Module name and path on the servre点击有...的按钮可以检索到如下信息

        ...

        src      /WorkArea/Implementation/SourceCode/src

        test     WorkArea/Test

        ..

    前面的是别名,对应服务器上一个长路径名. 比如我选择test

     

    Local folder to checkout to 这个容易理解

    我的是D:\cvs\

     

    控制台打印如下信息

    cvs -r -d :pserver;username=Smart;password=Smart;hostname=10.83.2.194;port=2401:\MIOTour checkout  -P -- test (in directory D:\cvs)

    此时服务器上以test为别名的目录所包含的文件都down下来了 D:\cvs\WorkArea\Test

     

    三、技巧

    3-1设置双击文件用Editplus打开

    在弹出的File action settings中如下设置:

    Action: Default

    Use same next time

    Display only if Shift key is pressed

     

    3-2如何获得指定版本?

    右键update -> 选择Update options -> By revision输入想要的版本号 OK

     

    3-3如何将服务器上最新V1.4 恢复成V1.3 (修改好后版本号为V1.5)

    1。先从server上update最新的V1.4到本地, 并Reserved edit

    2。diff -> Compare选择第2个(本地版本之间的比较)->Revision or date #1输入1.3

    3。在弹出的WinMerge中 左边 --> 右边, 保存

    4。commit

     

    四、初次使用

    标准流程:update -> reserve edit -> mod,save -> commit

     

    五、提问:执行cvs 提交命令时,服务器报告错误,怎么办?错误信息如下:

    myproject: cvs server: C:\WINDOWS\TEMP\cvs6C.tmp: No such file or directory

    myproject: cvs [server aborted]: error diffing HelloWorld.java

     

    这是由于CVS用户对C:\WINDOWS\TEMP\没有权限造成的解决方法有如下三种(任选其一)

    1)通过CVSNT控制面板Advanced选项卡下的Temporary重新换一个此CVS用户具有读写权限的目录

    2)Windows管理工具把C:\WINDOWS\TEMP\的读写权限赋予此CVS用户。

    (3)将此CVS用户设成WINDOWS的超级用户。

    集中整理一下几个问题(三)

    此系列参考:

    孙MM Tomcat与Java Web开发技术详解

    林林 JSP2.0技术手册

     

    在servlet中得到ServletContext(相当于JSP中的application)

    init(ServletConfig config){

      ServletContext context = config.getServletContext();

      InputStream is = context.getResourceAsStream("/WEB-INF/xx.properties");

      Properties ps = new Properties();

      ps.load(is);

      context.setAttribute("ps",ps);

    }

    自定义标签( 初级水平 ):

    (1)标签处理类(/WEB-INF/classes/XxTag.java)

    1.

    JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent

    parent 代表嵌套了当前标签的上层标签的处理类

    pageContext 代表Web应用中的javax.servlet.jsp.PageContext对象

     

    在TagSupport 中的成员变量pageContext可以直接在标签处理类中使用

    Properties ps = (Properties)pageContext.getAttribute("ps",pageContext.APPLICATION_SCOPE);

    HttpSession session = pageContext.getSession();

    ServletRequest request = pageContext.getRequest();

    JspWriter out = pageContext.getOut();

     

    2.doStartTag的返回值Tag.SKIP_BODY | Tag.EVAL_BODY_INCLUDE

      doEndTag  的返回值Tag.SKIP_PAGE | Tag.EVAL_PAGE

     

    3.如果标签中包含自定义的属性,如:

     <prefix:tag attribute="value"/>

    则在标签处理类中需要设置属性attribute对应的setter,getter

     

    (2)TLD文件(/WEB-INF/Xx.tld)

    <taglib>

    tlibversion

    jspversion

    shortname TL默认的前缀名

    uri TL的唯一访问标示符

    info

     

    <tag> 一个TLD文件中可以有多个<tag>-<attribute>

    name 此处指定tagName,使用方法<prefix:tagName

    tagclass

    bodycontent: empty|JSP|tagdependent

    info

     

    JSP表示标签的body中有JSP代码自行执行),tagdependent表示body中的内容由标签处理类处理

     

    <attribute>

    name

    required属性是必须的,默认false

    rtexprvalue属性的值是否可以为request-time表达式

     

    request-time表达式就是类似<%=..%>的表达式,若rtexprvalue(return expression value)的值为true时,可 以用如下方式为标签的属性赋值

    <prefix:tag attribute="<%= value %>"/>

     

    (3)配置web.xml,需要加入<taglib>元素

    <taglib>

    taglib-uri /mytaglib

    taglib-location /WEB-INF/Xx.tld

     

    (4)JSP中使用

    <%@ taglib uri="/mytaglib" prefix="prefix">

    <prefix:tagName attribute="value"/>

     

    关于BodyTagSupport,Simple Tag待续...

    集中整理一下几个问题(二)

    此系列参考:

    孙MM Tomcat与Java Web开发技术详解

    林林 JSP2.0技术手册

     

    EL(Expression Language)

    就是用到${}这样的东西,有11个隐含对象,分别为

    applicationScope,sessionScope,requestScope,pageScope

    param,paramValues

    cookie,header,headerValues,initParam,pageContext

     

    示例

    ${pageContext.request.queryString}

    ${param.username}

    ${header["User-Agent"]}

    要求Web容器支持JSP20Servlet24使用EL不用导入任何包,

     

    JSTL(Jsp Standard Tag Library)

    就是JCP定义好的一组标签需要引入jstl.jar,standard.jar

    JSP页面上要写:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

     

    示例

    <fmt:requestEncoding value="UTF-8"/>

    <fmt:message key="public.jsp.title"/>

     

    <c:out value="<hr>呵呵" escapeXml="true"默认原样显示/>

    <hr>呵呵

    <c:out value="<hr>呵呵" escapeXml="false"/>

    ---------------

    呵呵

     

    <c:set var="username" value="${param.username}" scope="session"/>

     

    <c:catch var="error_msg">

    ...

    </c:catch>

    ${error_msg}

     

    <c:if test="${param.username == 'cool'}" var="result" scope="page"默认>

    ...

    </c:if>

    ${result} (true|false)

     

    <c:choose>类似if{} else if{} else{}

     <c:when test="${condition1}">

     </c:when>

     

     <c:when test="${condition2}">

     </c:when>

     

     <c:otherwise>

     </c:otherwise>

    </c:choose>

     

    <c:forEach items="${attr数组名}"

       var="item" varStatus="s"状态信息 begin="0" end="10" step="2"步长>

     ${item}<br>

     ${s.index当前索引|count当前个数|first是否在第一|last是否在最后}

    </c:forEach>

     

    <c:forTokens items="${userPhone}" var="item" delims="-"默认为,号>

    ${item}

    </c:forTokens>

     

    <c:forTokens items="A,B-C;D" var="item" delims=",;-">

    ${item}

    </c:forTokens>

     

    <c:import url="/jsp/nested.jsp" charEncoding="UTF-8"被包含文件编码格式

       context="/otherWebPlatform"默认为当前站台>

    <c:param name="id" value="1234"/>

    </c:import>

    有点类似<%@ include file="nested.jsp" %>

     

    <img src="<c:url vluae="/images/code.gif" />" />这个不太明白

     

    <c:redirect url="http://www.126.com"/>

    网页重定向相当于reponse.sendRedirect("...");

    额外资料(来自CSDN):第一步是在网页中加入jstl的fmt的支持。
    1、将jstl需要的jstl.jar和standard.jar拷贝到WebContent\WEB-INF\lib目录下
    2、将fmt.tld拷贝到WEB-INF目录下
    3、修改WEB-INF目录下的web.xml文件,添加如下行到相应位置
       <taglib>
         <taglib-uri>/WEB-INF/fmt</taglib-uri>
         <taglib-location>/WEB-INF/fmt.tld</taglib-location>
       </taglib>
    4、在要编辑的jsp文件头上添加<%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>以支持fmt

    第二步是要在系统中加入resource文件的支持
    1、在javaresoruce目录下面的任意一个包中(下面假定是sample包)创建resource文件,名称为test.properties
    2、在其中输入如下一行内容测试
       test=中文内容
    3、在sample目录下面创建一个bat文件,名字叫做encode.bat,编辑内容如下
       %JAVA_HOME%\bin\native2ascii -encoding gb2312 test.properties test_zh.properties
       然后保存退出
    4、双击此bat文件执行,执行后会生成一个名称为test_zh.bat的文件
    5、在struts-config.xml文件中 <controller/>后面加入下面这一行内容
       <message-resources parameter="sample.test.properties"/>
    6、在需要编辑的jsp文件中编辑如下,其中titleKey是关键
       <fmt:bundle basename="sample.test_zh">
       <display:table...>
         <display:column property="name" <b>titleKey="test"</b> headerClass="sortable"/>
       </display:table>
       </fmt:bundle>

    这样displaytag列名显示的就是“中文内容”了:)

    集中整理一下几个问题(一)

    此系列参考:

    孙MM Tomcat与Java Web开发技术详解

    林林 JSP2.0技术手册

     

    Tomcat安全域

     

    主要是配置web.xml,有三种元素需要加入

    (1)

    <security-constraint>指定受保护的Web资源以及所有可以访问该Web资源的角色

     <display-name>

     

     <web-resource-collection>

      <web-resource-name>

      <url-pattern>

      ...

     </web-resource-collection>

     

     <auth-constraint>

      <role-name>

      ...

     </auth-constraint>

     

    </security-constraint>

     

    (2)

    <login-config>访问受保护资源时弹出的登陆对话框类型

     

    <auth-method>BASIC|DIGEST|FORM

    <realm-name>

     

    <!-- auth-methodFORM时需要这部分

      <form-login-config>

        <form-login-page>/mylogin.jsp

        <form-error-page>/myerror.jsp

      </form-login-config>

     -->

    </login-config>

     

    BASIC DIGEST都是弹出内置对话框。

    BASIC采用Base64加密不安全, DIGEST采用MD5加密安全

    FORM是自定义弹出框。

    mylogin.jspformaction=j_security_check, 文本框必须名为j_username,密码框必须名为j_password

     

    (3)

    <security-role>需要经(2)登陆验证的角色名

     <description>

     <role-name>

     ...

    </security-role>

     

    Filter,Wrapper, Listener

     

    2-1关于Filter

    Tomcat下面自带有一个SetCharacterEncodingFilter,

    其中有一个ignore表示是否忽略客户端页面编码,默认为true,表示忽略

     

    javax.servlet.Filter接口中有三个方法

    init(FilterConfig config)

    doFilter(ServletRequest, ServletResponse, FilterChain)

    destroy()

     

    web.xml要配置如下:

    <filter>

    <filter-name>

    <filter-class>

    <!--

     <init-param>

      <param-name>

      <param-value>

     </init-param>

     -->

    </filter>

     

    <filter-maping>

    <filter-name>

    <url-pattern>

    <dispatcher>REQUEST|FORWARD|INCLUDE|ERROR

    </filter-maping>

    dispatcher指定以何种方式请求资源时需要先通过filter进行处理默认为REQUEST

     

    2-2关于Wrapper

    ServletRequestWrapper implements ServletRequest

    HttpServletRequestWrapper implements HttpServletRequest

    分别以ServletRequestHttpServletRequest做为构造函数参数对它们进行包装,使用时直接继承这两种Wrappe r并覆写相应接口中的方法(比如HttpServletRequest接口中的getMethod(),getQueryString()...)

     

    作用是对request,response包装可以给过滤器使用如chain.doFilter(XxRequestWrapper,response)

     

    2-3关于Listener

    作用可以监听HttpSession,HttpSessionAttribute,HttpRequest,HttpRequestAttribute,  ServletContext,ServletContextAttribute等等对象在有相应event发生时可以通过event上的相应方法对这 些事件进行处理

    重点说一下HttpSessionBindingListener,是唯一不需要在web.xml中设定Listener的接口

    <listener>

     <listener-class>

    </listener>

     

    如果一个对象实现了HttpSessionBindingListener,当它加入session会调用该对象的valueBound()方法当它被session移除时会调用valueUnbound();

    JSP2.0技术手册(P285-P289)的例子(有较多改动)

    UserList.java{

     private Set list;

     private UserList instance = null;

     private UserList(){

       list = new HashSet();

     }

     public static UserList getInstance(){

       if(instance == null){

         instance = new UserList();

       }

       return instance;

     }

     public void addUser(String user){

       if(user != null) list.add(user);

     }

     public void removeUser(String user){

       if(user != null) list.remove(user);

     }

     public Iterator getList(){

        return list.iterator();

     }

    }

     

    UserTrace.java implements HttpSessionBindingListener{

     private String username;

     private UserList list = UserList.getInstance();

     // setter getter..

     public void valueBound(HttpSessionBindingEvent event){

       list.addUser(username); //自己新增不明白书上为何不这样

     }

     public void valueUnbound(HttpSessionBindingEvent event){

       list.removeUser(username);

     }

    }

     

    UserList.jsp(登陆成功后跳转到此页面)

    <jsp:useBean id="usertrace" class="package.UserTrace" scope="session"

    <%

     String username = ${param.username};

     usertrace.setUsername(username);

     session.setAttribute("usertrace",usertrace);//触发valueBound增加用户

     session.setMaxInactiveInterval(10)//10秒不活动触发valueUnbound移除用户

    %>

     

    commons-logging & log4j (二)

    #首先要配置rootLogger,

    #其语法为:log4j.rootLogger = [ level ] , appenderName, ...

    #level 是日志记录的优先级(共7级)

    #appenderName就是指定日志信息输出到哪里(destination)。

    #你可以同时指定多个目的地,我指定了五个!

    log4j.rootLogger=debug, dest1,dest2,dest3,dest4,dest5

     

    #dest1控制台 vs. HTML布局

    log4j.appender.dest1=org.apache.log4j.ConsoleAppender

    log4j.appender.dest1.layout=org.apache.log4j.HTMLLayout

     

    #dest2单个文件 vs. 简单布局

    log4j.appender.dest2=org.apache.log4j.FileAppender

    log4j.appender.dest2.File=c:/log/FileAppender.log

    log4j.appender.dest2.layout=org.apache.log4j.SimpleLayout

     

    #dest3单个文件 vs. HTML布局(之前一直在想如何使用WriterAppender+HTML)

    #不知道如何配置找了半天发现没有那个必要!

    log4j.appender.dest3=org.apache.log4j.FileAppender

    log4j.appender.dest3.File=c:/log/FileAppender.html

    log4j.appender.dest3.layout=org.apache.log4j.HTMLLayout

     

    #dest4滚动文件 vs. 动态布局

    #如果超出1K,会把之前的日志打印到RollingFileAppender.log.1

    #最多编号到.3,再多就会覆盖

    log4j.appender.dest4=org.apache.log4j.RollingFileAppender

    log4j.appender.dest4.File=c:/log/RollingFileAppender.log

    log4j.appender.dest4.MaxFileSize=1KB

    log4j.appender.dest4.MaxBackupIndex=3

    log4j.appender.dest4.layout=org.apache.log4j.PatternLayout

    log4j.appender.dest4.layout.ConversionPattern=%d [%t] %-5p %-5c{3}(%L) %x -> %m%n

     

    #dest5按天存放 vs. TTCC布局

    #如果到了明天今天的日志就会重命名为DailyRollingFileAppender.log.2006-01-24

    log4j.appender.dest5=org.apache.log4j.DailyRollingFileAppender

    log4j.appender.dest5.File=c:/log/DailyRollingFileAppender.log

    log4j.appender.dest5.layout=org.apache.log4j.TTCCLayout

    藏青色部分是必须的最简单的配置,其它部分可选

    commons-logging & log4j

    首先要搞清楚两者之间的关系。以前一直以为它们是并列关系,因为它们都是用来记录日志的,事实并非如此,commons-logging是一个通用日志接口,log4j是这个接口下的一个实现。你可以单独使用log4j来实现日志输出,也可以结合使用commons-logging和log4j,后者可以在配置文件commons-logging.properties中动态更改logging的实现方式。

     

    第一步:添加两个jar包到CLASSPATH

    D:\SmartLibrary\commons\commons-logging.jar;D:\SmartLibrary\log4j\log4j-1.2.13.jar

    第二步:写一段测试代码LoggingTest.java

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

     

    public class LoggingTest {

        public static void main(String[] args){

            Log log = LogFactory.getLog(LoggingTest.class);

            log.fatal("FATAL");

            log.error("ERROR");

            log.warn("WARN");

            log.debug("DEBUG");

            log.info("INFO");

            log.trace("TRACE");

        }

    }

    第三步:配置commons-logging.properties(可选),如下

    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger

    此时一切OK,可以成功运行上面的代码!此时使用的是JDK1.4自带的logging功能

     

    如果采用log4j,

    commons-logging.properties(必须)的内容更改如下:

    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog

    另外还需要一个log4j.properties(必须)文件!内容太多,见下一篇BLOG

     

    有必要弄清log4j中几个重要的概念!

    公共类 Logger

    Logger 负责处理日志记录的大部分操作。

     

    公共接口 Appender

    Appender 负责控制日志记录操作的输出。

     

    公共抽象类 Layout

    Layout 负责格式化Appender的输出。


    有很多方法可以创建一个日志记录器(Logger),比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:

    static Logger logger = Logger.getLogger(LoggingTest.class);

    用下面方法设置级别:

    logger.setLevel((Level)Level.WARN);

     

    可以使用7个级别中的任何一个;
    Level.DEBUG
    Level.INFO
    Level.WARN
    Level.ERROR
    Level.FATAL
    Level.ALL
    Level.OFF
    注意log4j中没有TRACE级别它将commons-logging中的TRACE处理为DEBUG

    Appender
    控制日志怎样输出(下面只列出我可能用到的)

    org.apache.log4j.ConsoleAppender(控制台),

    org.apache.log4j.FileAppender(文件),

    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),

    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方

     

    Layout

    Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。

    org.apache.log4j.HTMLLayout(HTML表格形式布局),

    org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    log4j单独还有很多内容,如果配合使用commons-logging可以避免硬编码,而且更具通用性

     

    参考1,2

    Regular Expression

    regular expression(RE) is listed as one of the top 10 technologies in the programming world and is being used everywhere. as the new year is drawing near, and i am lazy in doing anything, i spent some time making a summary on that to facilitate my future work.

    基础

    正则表达式: cat

    匹配: cat, catalog, Catherine, sophisticated

     

    句点符号 匹配所有单个字符,包括空格、Tab字符甚至换行符

    正则表达式:t.n

    匹配tan, Ten, t n, t#n

     

    中括号 匹配[]内任意单个字符

    正则表达式:t[aeio]n

    匹配:tan, Ten, tin, ton

     

    ()与|组合 匹配以|分隔的任意组合

    正则表达式:t(a|e|i|o|oo)n

    匹配:tan, ten, tin, ton, toon

     

    快捷符号

    \d  [0-9]任意数字

    \D  [^0-9]非数字

    \w  [A-Z0-9]任意字母或数字

    \W  [^A-Z0-9]非

    \s  [\t\n\r\f]任意空格,包括Tab

    \S  [^\t\n\r\f]除空格以外所有字符

     

     

    匹配次数的符号--用来确定紧靠该符号左边的符号出现的次数

    *       0次或者多次

    +       1次或者多次

    ?       0次或者1

    {n}     恰好n

    {n,m}   从n次到m次

     

    示例1:

    匹配:999-99-9999

    正则表达式:[0-9]{3} \- [0-9]{2} \- [0-9]{4}

               或者\d{3} \- \d{2} \- \d{4}

    释义:前三个数字, 连字符-,中间两个数字,连字符-,最后四数字

     

    修改:[0-9]{3} \-? [0-9]{2} \-? [0-9]{4}

    释义:?表示连字符-是可选的,可以出现0次或1次

     

    示例2:

    匹配: 典型的美国汽车牌照号码,如8836KV

    正则表达式: [0-9]{4} [A-Z]{2}

    释义:前面四个数字,后面两个大写字母

     

    示例3:

    匹配:所有Month DD,YYYY格式的日期,如Jan 24, 2006

    正则表达式:[a-z]+ \s+ [0-9]{1,2} , \s* [0-9]{4}

    释义:月(至少一个字母),空格(至少一个),日(1-2位数字),","号,可选空格,年(4位数字)

     

    示例4:

    匹配:IP地址,如192.168.0.1

    正则表达式:\d{1,3} \. \d{1-3} \. \d{1-3} \. \d{1-3}

    "."号在RE中具有特殊意义,需要加上转义字符"\", 上个示例中的","就不用

     

    最后给出三个我的实践:

    NO.1: 在javascript中判断email是合法:

            if (email==null || !email.match("[\\S]+@[^\\.]{2,}\\.[\\S]+")) {

                alert("Email is invalid !");

                return false;

            }

    释义:非空格字符(至少1个),"@"号,非.号字符(至少2个),"."号, 非空格字符(至少1个)

     

    NO.2 在Editplus中使用正则表达式做查找替换(Ctrl + H)操作

    给定如下代码(假设来自于网络)

    0: class Hello

    1: {

    2:  public void method(){

    4:     

        //...

    75: }

    76:}

    这些带有行号的代码无法直接运行,如何一下去掉所有的行号?

    Editplus支持用正则表达式进行查找替换,只要在查找框中输入[0-9]+:替换框中留空一切OK

     

    NO.3: 给定如下结构SQL脚本(由某DB工具自动生成):

     

    CREATE TABLE `files` (

      `id` int(5) NOT NULL auto_increment,

      `filename` varchar(50) NOT NULL default '',

     ...

    ) TYPE=MyISAM;

     

    根据上面的SQL脚本, 自制工具,生成该表对应的POJO,首先要将SQL中最关键的"字段名-字段类型"提取出来存储在一个map中,如果用StringTokenizer,代码将十分复杂!我们将使用RE。

    1 SQL Script:

     

    CREATE TABLE `files` (

    `id` int(5)

     

    1-1 First:

        `字段名` 类型, 并且第一个``之间恰好是表名!

    1-2 Further:

        `,(下一个`之前所有的部分),`,空格,(类型)

        需要提取的部分用()号括起来,上面的两个括号分别括住字段名和字段类型

    1-3 Final:

    正则表达式:` ([^`]+) ` \s ([^\s]+)

    释义:`, 字段名(除`以外字符,至少1个),`,空格(1个),字段类型(除空格以外字符,至少1个)

     

    2 JAVA Code:

     

        /**

         * 使用正则表达式处理SQL脚本,代码量大大减少

         * @param input

         * @since JDK1.4

         */

        private void process(String input) {

     

            Pattern p = Pattern.compile("`([^`]+)`\\s([^\\s]+)");

            Matcher m = p.matcher(input);

            m.find();

            this.tableName = m.group(1);

            while (m.find()) {

                list.add(m.group(1));

                map.put(m.group(1), getFieldType(m.group(2)));

            }

        }

    以上代码中

    m.find()控制循环

    m.group(1)返回第一个括号括住的内容id,

    m.group(2)返回第二个括号括住的内容int(5), so on and so forth,

    这样,map中存储了我们所需的所有信息,基于map,我们可以自动生成POJO

    简易MSN留言板制作实录

    OK。给eceles的答复,我以前也是从网上搜到的,实际再操作一下,写成一篇日志,共享出来,
    以我的为例吧。(记住留言板的实质就是一篇网络日志)
     
    第一步:
    新增一篇网络日志,
    标题为“Earth的留言板”
    内容为:I am all ears. Thanks for coming here
    然后“创建并发布”
    点击“预览我的共享空间”->点击刚刚发表的日志下方的“固定链接”->“复制”那一长串地址
     
    第二步:
    点击“编辑我的共享空间”->自定义->模板->自定义列表(创建)->保存
    这时在当前页面左上角你可以看到一个名为“自定义列表”的新的模板出现了
    用鼠标按住这个模板并把它拖动到你喜欢的位置
     
    第三步:
    点击这个模板中的“编辑列表”->重命名列表(输入一个你喜欢的名字,我的是“Earth的留言板")->确定
    点击这个模板中的“添加项目”->
    下面会出现三个框
    第一个框 链接名称:GUEST BOOK
    第二个框 网址:填第一步中复制的那一长串地址
    第三个框 随便,我没有填
    确定 -> 预览我的共享空间 ->
    好了,成功了,如果没有成功不要灰心,多试几次,总会成功!GOOD LUCK
     
    PS:如果要修改刚才新增的列表:
    点击“编辑您的共享空间”->列表-> 从“查看”这个下拉列表框中选择一个你要更改的列表-->剩下的似曾相识(这就到了上面的第三步!),then it goes without saying

    爱死你了,KB!

    今天chesoye给我发来邮件,说科比爆砍81分。还以为chesoye有病啦(因为他总是和我做对,总是不喜欢科比!!)。太酷了!爽爽了!太棒了!奇怪的是我今天竟然没有看Lakers的比赛。后悔那个。。。

    By Darren Misener
    Jan. 22 -- This time he played all four quarters.

    A month after tallying 62 points in just three quarters, Kobe Bryant put his name No. 2 on the all-time NBA single-game scoring list by dropping a ridiculous 81 points on the Raptors Sunday night, in a 122-104 Lakers win. Not Since Wilt Chamberlain scored 100 points over 40 years ago has the NBA seen a performance like this. Chamberlain scored 100 for Philadelphia against the New York Knicks at Hershey, Pa., on March 2, 1962. Now Kobe's name resides second with 81 on Jan. 22, 2006 in Los Angeles.

    "It hasn't really sunk in yet," Bryant said after the game. "We had four days off coming up and I would have been sick as a dog if we lost. It turned into something very special."

    Special doesn't do it justice. Bryant drilled 28 shots from the field, including seven from three-point land and went 18-20 from the charity stripe. There are few words to describe that kind of line. The man himself had a tough time grasping it.

    "I couldn't even dream of this when I was a kid, not even in my dreams." Bryant said. "It's tough to explain, it just happened man."

    Kobe scored 55 points in second half alone. That's more than anyone other than Kobe has scored in the NBA this season -- for an entire game. The 55 was also just four shy of Chamberlain's record for points in a half.

    Kobe obliterated the Lakers all-time scoring record -- 71 set by Elgin Baylor in 1960. Only four players in NBA history had even scored over 70 points in a game, and none of those are named Michael Jordan. Chamberlain, Baylor, David Thompson and David Robinson were the only people to crack 70 until now -- you can add KB to that list.

    After the game Lakers great Magic Johnson gave Bryant a call to congratulate him on the performance, a gesture that will leave a lasting effect.

    "Talking to Magic after the game meant more to me than the 81 points," Bryant said. "Him calling me after the game meant more than the points."

    STAPLES Center was electric with chants of MVP for Bryant as he drilled his 80th and 81st points from the free throw line, points that put his name second on this list.

     

    新浪体育讯 北京时间1月23日,科比又一次令人吃惊,他拿下了令人咋舌的81分,率湖人以122-104击败猛龙。

      科比全场46投28中,其中三分球13投7中,罚球20次得18分。科比四节得分分别为14分、12分、27分和28分。81分在NBA历史上排第二,除了张伯伦的100分外,没人再比他高,此前张伯伦的78分排第二。除张伯伦6次得分过70外,大卫-汤普森得过一次73分,罗宾逊得过一次71分,此外再没人能突破70分大关。乔丹的最高是69分。

    除旧迎新Java2005回顾与2006展望

     

    2005 就要过去了。

    过去的一年,Mustang 没能出来,EJB3刚刚才提交最终草案,Ajax兴起但是五花八门不知道应该用谁,Aspectj 5出来了,但是缺乏惊喜。

    或许我们会说,过去的2005,Java界缺乏成绩,但是却毫无疑问,Java遥遥领先于其他语言。从11月的语言排行榜Java遥遥领先,到今年的Java图书销售统计上,Java图书销售总数是C#的2倍,PHP的2.5倍,Perl的4倍,Ruby/Python的9倍.

    这足以让我们对2006充满想象。

    不过,还是让我们先回顾下2005吧....

    1、2005 之 Java 对手

    过去的2005,Java无疑是最受欢迎的语言。但是Java也面临其他语言的挑战,其中Bruce A. Tate,在一文中,提出了有可能挑战Java开发的4种技术,包括动态语言,Continuation,Conventions,元编程等。

    Ruby可以说是最有可能挑战Java的语言,刚刚发布的Rails1.0引起了Fans的疯狂。Rails会不会是下一代伟大的框架?有可能。要做一个选择的话,Rails应该会是在使用Ruby或是其他动态编程语言的元编程框架潮流中的第一个。但是Java已经开始引进Ruby的特性了,比如Trails,Groovy。

    2、2005 之 Java 新玩意

    Drools:Drools 是一个基于Charles Forgy's的Rete算法的,专为Java语言所设计的规则引擎。Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。Drools是用Java写的,但能同时运行在Java和.Net上。

    Drools提供了声明式程序设计(Declarative Programming),并且使用域描述语言(Domain Specific Languages(DSL))。Web和持久层框架我们已经有很多选择了,但是处在中间层的商务逻辑有好的框架吗?你希望每次经理给你一个新的命令就不得不重编译那些复杂的if ... then 意大利面条代码吗?

    Drools- 商务逻辑框架的选择这篇文章中,保罗布朗推荐的Drools的规则引擎或许是完成这类任务的最好选择;为你的基于SPRING的应用增加简单规则引擎描述如何为流行的Spring框架开发简单的规则引擎;在你的企业级java应用中使用Drools一文则向你展示如何在企业级Java应用中使用Drools。

    Portlet:“Portlets是一种Web组件-就像servlets-是专为将合成页面里的内容聚集在一起而设计的。通常请求一个portal页面会引发多个portlets被调用。每个portlet都会生成标记段,并与别的portlets生成的标记段组合在一起嵌入到portal页面的标记内。”(摘自Portlet规范,JSR 168)。2005,Portlet框架层出不穷。什么是Portlet ?让你的Portlet之旅从这里开始。

    Ajax:2005年,还有什么比Ajax更火呢?Ajax兴起, 传统Web框架将走向何方? 引起广泛讨论,一度让人感受到了Ajax的凶猛之势。虽然Ajax和Java没有直接关系,但是毫无疑问Ajax也是Java界关心的东西。Ajax:Web应用的新方法介绍了这个将令人们兴奋的技术。

    Ajax的应用也层出不穷,比如Google就成功地使用了Ajax。用AJAX来控制书签和回退按钮告诉我们如何用AJAX来控制书签和回退按钮。

    一系列框架也随之而出来,比如DWR, Ajaxanywhere,Ajaxtags。其中:DWR让AJAX如此简单展示DWR如何使得AJAX的应用既简单又快捷。初探AjaxTags展示如何使用Ajaxtags进行Ajax开发。

    SOA:当然,2005不仅是框架,2005还有SOA,BEA, IBM, ORACLE..... 一家又一家企业公布了他们的SOA方案, 宣称他们的产品支持SOA功能. SCA和SDO也将组成新的SOA编程模型。SCA和SDO将组成新的SOA编程模型说明了如何在实现了J2EE1.4规范的应用服务器之间,比如Oracle Application Server 10g,使用J2EE1.4建立可互操作的,轻便灵活的服务;SOA架构中的事件驱动服务讨论使用Mule实现一个高效的事件驱动和面向服务的平台; 面对SOA, 你准备好了吗?

    RPC:Web应用的RPC方式调用,随着Web2.0的兴起,RPC方式逐渐成为Web调用的一种方式。

    分布式组件开发:在一个分布式应用当中,提供一个统一对外接口,通过可重用的外部API来满足需求。Java组件开发:一个概念框架提出了一个构建概念框架地解决方案。
    3、Hibernate继续前进

    Hibernate仍然是最受欢迎的企业级开发持久层方案,Ejb 3.0 的出现是否会让Hibernate的发展有什么变化吗? 这无疑是让大家都感兴趣的事情。过去的一年,关于Hibernate也有很多有趣的东西:Hibernate 3 的Formulas展现formula的各种特征是如何辅助模式转换的;而Magicgod的Hibernate的思考则提出了提到了Hibernate的一些弱点。

    4、Spring大热

    没有什么文章,比POJO应用框架:Spring与EJB3.0的比较 夺得更多的人的眼球了。Spring框架虽然很流行但并不是一个标准的开源框架,EJB3.0是由Java Community Process (JCP)制订的标准框架,为所有主要的J2EE厂商支持。

    两者都大量地使用了依赖注入。在SPRING中实现事务暂停讨论了Spring的事务管理特性。在Spring中配置Hibernate事务探讨了怎么用Spring来装配组件及其事务管理。爱上Spring的5个理由里作者描述了他为何喜欢上了Spring;而使用EJB 3.0简化企业级Java开发阐述了如何使用EJB 3.0 注释来开发藕合松散的POJO应用及容器服务器如何管理POJO。

    2006,看来还有一场大战。

    5、在Eclipse的影子下

    调查表示,超过70%的开发者使用Eclipse进行开发。Eclipse毫无疑问已经占据了IDE的主流市场。Eclipse的兴起,也间接引起了Borland的离去。但是也引起了IDE工具的竞争加剧,对开发者是件不折不扣的好事。

    成为Eclipse热键高手提到了那些会让你的手指动的飞快的热键组合。这只是Eclipse快捷方便的一个缩影。刚发布的WTP,好用的Myeclipse,都推动着Eclipse的不断发展,或许这就是社区的力量。

    6、ANT

    ANT仍然很受欢迎。ANT不仅仅是一个Build工具,它还可以作更多的事情。使用Ant进行Web开发介绍WEB 应用程序的部署,包括get, serverdeploy, 和 scp等。使项目开发自动化描绘了用Ant自动化你的项目能带来的好处。

    7、2006的Java期待

    ·EJB3: EJB3最终草案提交,预示着EJB3的即将到来了,相信明年一定程度上是EJB3年,简化开发是否真的实至名归?

    ·Mustang: 不知道Mustang 的出现,会给Java性能带来多大的改变,寄存器优化不知道是不是能带来革命的效果?

    ·JBI-ESB:JBI这个提了很多年的名词,终于在今年大热,相信明年JBI仍然会继续发展。

    ·JSF:JSF有太多对手了,Struts,Spring mvc,特别是Webwork加入Struts之后,不过相信JSF也是值得我们期待

    ·AJAX:虽然有很多AJAX框架出来,但是killer级别的框架是谁呢?2006会揭晓吗?

    ·Groovy:社区的力量使得Groovy越来越成熟和完善了。

    ·Rails:Ruby虽然和Java无关,但是我想多数人都在关心Rails。毕竟Rails还是我们所期待的东西。

    ·Spring2.0:Spring 2.0明年初就会发布了,相信会继续带动Spring社区的狂热。

    相信在所有技术语言中,Java是2006年的热点所在,让我们共同期待2006。

    原文:http://blog.csdn.net/yjz0065/archive/2005/12/26/562827.aspx

    年终记事一二三。。

    21号晚公司年终尾牙。不清楚为什么叫这个名儿。那晚忐忑不安地期待,一不小心拿到了上K的大奖, 一下子爽歪了!听说公司还会有年终奖金不 知是真是假。8月初刚来的时候还希望自己这几个月能拿五千块钱回家过年呢。自己任着性子去花钱,这个 数额这半年恐怕是达不到了。明年起开始定额存款。以后想回去考研。工作太累了。过年就放一个星期,还 是当老师好啊

    一切应着兴趣而来,最初学JAVA是因为英文学的枯燥无聊,上课真的很无聊,转向IT在现在看来是一项明智 的选择,因为JAVA语言真的是一门很优雅的语言,开源社区的欣欣向荣让我们有更多的机会独自去钻研。 JAVA已成了我最大的兴趣所在,JAVA也极大地左右我的情绪,我讨厌过于复杂的技术,JAVA的宏大逐渐使它 变得越来越复杂,特别在工作中接触到EJB以后,更是觉得不爽,期待着EJB3的迅速普及,也期待着Spring 能成为未来的主流框架。
    工作理想违背最初意愿--兴趣的时候,工作的心态也在慢慢改变。逃离被人牵着鼻子走的感觉就是现在像chesoye一样保持简朴的作风每夜多呆在床上看书吧。一点多了,还在看。。。

    翻到一封8月初写给以前MBU部门boss的一封email,我申请从手机驱动开发部门转到JAVA部门, 那时我还没有任何工作经验,续着在学校独自学JAVA的劲儿,激情无限。转眼过去半年,似乎明白了工作和在校学习的差异,激情减了一半。不过我依然深爱J.

    MBU是我们公司最有前途员工薪资最多的部门,我的另外三个室友都在MBU和我同来,一个加工资了一个没加工资但升迁了还有一个就是chesoye我的同室拿比我们拿多一倍的工资,我还是转了.

    快过年了,今天又是fax的生日,晚上在家里大吃了一把,fax生在浙江,是做海鲜的好手,王八,乌贼,海哲,牡蛎,贝壳,虾...这些以前一直以为奢侈的东西没想到在这个“小家“里不知不觉吃过好几次了。这几天也挂念着回家,一片欢乐的气氛,总是心神不宁,在公司基本是在混时间吧:D。今天下午出去弄好了火车票。又是意外在汽车站附近碰到了火车票的代销点,不然到火车站人山人海又要等死人,排在我前面的西安的吧某某真是可怜,昨天QQ上蹦出的消息:上海到西安,成都,郑州,石家庄等地车票21到29日停售,今天又赫然一次出现在售票台窗口,想想就不是滋味,幸好不是俺。。。星期四就走还有最后三天上班时间。。。好,  不知明天能不能爬起来,chesoye真是厉害刻苦认真,我还是不要敲键盘了睡觉

    V2.0 Beta

    含有file类型的表单,要设enctype="multipart/form-data"
    导入CSS脚本:
    <link href="" rel="stylesheet" type="text/css"/>
    Form表单中元素的以下两个属性的差别
    disabled=true(显示为灰色)数据不会组装到actionform, 而readonly=true则会

    getOutputStream() has already been called for this response
    解决方案(用servlet代替jsp):
     以前:<img src="/hi/pages/showphoto.jsp?id=<%=id%>"/>
     现在:<img src='/hi/showphoto?id=<%=id%>"/>
    即把以前写在jsp中<%%>之间的代码写到servlet的doGet()中去。

    byte[], blob之类的东西, 插入时即要判断是否为null,又要判断是否长度>0


    CLOB字段如果插入成功,在toad中是可以看见的!(以前的版本均没有成功。。)

    在JBoss下,必须用ResultSet 和 oracle.sql.BLOB/CLOB
    (我偷偷的把weblogic.jar简化包引入,用的OracleResultSet和OracleThinClob/Blob插入不成功也不报错,发现这个问题用了我一天时间!因为立即插入的数据在页面上是可以读出来的,EJB容器缓存了插入时的数据所以显示时没有真正去查数据库)

    在坚持以上原则的情况下,既可用DBHelper.setBClob(...), 又可顺序调用DBHelper.setBlob(..), DBHelper.setClob(..).
    (同时插入,和分开插入都可以!)

    OK,今天算是一个milestone, 解决了以前版本中的诸多问题,bug!..现在,sequence, varchar2, Timestamp, Blob, Clob类型的字段(见附图)都弄好拉,真是一把鼻涕一把泪!

     


     

    V1.2.2

    又一个周末结束了,感觉自己有点累了。以后将不再更新我的BLOG
    those kind of stuff is completely useless  and wasting precious time...