Earth's profileLet's go insideBlogListsNetwork Tools Help

Earth

Occupation
This person's network is empty (or maybe they're keeping it private).

Let's go inside

go go go, let's go

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可以忽略不计)而且大部分代码只需要拷贝一下。实际动手写的地方几乎没有。