| Earth's profileLet's go insideBlogListsNetwork | Help |
|
Let's go insidego go go, let's go move to baidu hi spacemsn space is as slow as a snail
new blog address: codecode studio, welcome to visit congratsThe 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> 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
改成http://localhost:8080/HelloJSF/pages/index.jsf,Ok, everything is OK.
(原)EC使用技巧之 自定义EC的过滤功能EC为我们提供的功能有: 过滤(filter) 排序(sort) 分页(pagination) 导出(export)
可是在实际应用中,EC自带的过滤功能往往不够强大。下面的文章就是如何将EC的过滤功能独立出来,放在一个单独的页面query.jsp中。 我们不再使用FilterSet, FilterQuery等等。而是将第1次的查询条件dto保存在session里面,接下来的sort, pagination, export均在这个dto基础之上进行。
为了减少类的个数。我将service和dao放在一起。使用struts做为应用的框架 action这样写。 (1)EC用action (红色部分为需要改动的地方) 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可以忽略不计)而且大部分代码只需要拷贝一下。实际动手写的地方几乎没有。 |
||||||
|
|