发表新闻的逻辑门面(CreateNewsItemAction.Java) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //假如点击”cancel”,返回发表新闻页面 if ( isCancelled(request) ) { return mapping.findForward("callCreateItem"); } if( request.getSession().getAttribute(NewsModuleWebConstants.NEWS_ITEM_ SUBMITTED_ACTION) == null ) { request.getSession().setAttribute(NewsModuleWebConstants. NEWS_ITEM_SUBMITTED_ACTION, "create"); NewsItemForm newsItemForm = (NewsItemForm) form; //申明NewsItem的对象,并给该对象赋值 NewsItem newsItem = new NewsItem(); //利用BeanUtils.copyProperties直接拷贝属性构造newsItem对象 WebappUtil.copyProperties(newsItem, newsItemForm, request); //newsItem和NewsItemForm对象间存在名称不相同的属性, //则BeanUtils不对这些属性进行处理,需要程序员手动处理 newsItem.setActive(Boolean.TRUE); newsItem.setTitle(newsItemForm.getTitleMap()); newsItem.setAnnotation(newsItemForm.getAnnotationMap()); newsItem.setBody(newsItemForm.getBodyMap()); //获得DAOManager对象,类型在Spring配置,指向类NewsManagerImpl NewsManager newsManager = (NewsManager) getBean(NewsModuleConstants. NEWS_MANAGER_BEAN);(1) Long newsItemId = null; String uri = null; try { //通过NewsItemManager建立新闻实体 newsItemId = newsManager.createNewsItem(newsItem); uri = NewsModuleWebConstants.NEWS_ITEM_URI_PREFIX + "/" + newsItemId; newsItem.setUri(uri); newsManager.updateNewsItem(newsItem); if ( newsItem.getActive().booleanValue() ) { // index news item SearchManager searchManager = SearchManager.getInstance(request.getSession(). getServletContext()); searchManager.reIndeXPage(newsItem, request); } } catch ( BeanAlreadyExistsException e ) { … … return mapping.getInputForward(); } } return mapping.findForward("listNewsItems"); } } (1)DAO治理类NewsManagerImpl类中的处理 public Long createNewsItem(NewsItem newsItem) throws BeanAlreadyExistsException { //在Manager类中,应用将具体操作委派个具体的DAO类 if ( pageDAO.hasDuplicates(newsItem) ) { (2) … … throw new BeanAlreadyExistsException(errorMessage); // linkable item does not exist Long newsItemId = newsDAO.createNewsItem(newsItem);(4) return newsItemId; } (2)解释, PageDAOHibernate类中判定新闻的URL信息是否有重复 public boolean hasDuplicates(Page page) { ArrayList args = new ArrayList(); args.add(page.getUri()); String hql = "select count(p.id) from Page p where p.uri = ?"; if ( page.getId() != null ) { hql += " and p.id != ?"; args.add(page.getId()); } int count = ((Integer) findUniqueResult(hql, args.toArray())).intValue();(3) return count > 0; } (3)的解释,BaseDAOHibernate类 public Object findUniqueResult(final String hql, final Object[] args, final Type[] types, final boolean cacheable, final String cacheRegion) { //使用内隐类 return getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = session.createQuery(hql); query.setCacheable(cacheable); if ( cacheRegion != null ) { query.setCacheRegion(cacheRegion); } //查询参数赋值 if ( args != null ) { for ( int i = 0; i < args.length; i++ ) { Object arg = args[i]; Type type = null; if ( types != null && i < types.length ) { type = types[i]; } if ( type == null ) { query.setParameter(i, arg); } else { query.setParameter(i, arg, type); } } } return query.uniqueResult(); } }); (4)的解释,NewsDAOHibernate类,这里是写入数据库的主要逻辑 public Long createNewsItem(NewsItem newsItem) { //写入news_item表 newsItem.setUsageCounter(new Integer(0)); Long newsItemId = (Long) getHibernateTemplate().save(newsItem); //写入field表 // title ContentField fTitle = new ContentField(); fTitle.setIdentifier("title"); fTitle.setType(ContentField.LINE_TYPE); fTitle.setInternal(Boolean.TRUE); newsItem.addContentField(fTitle); getHibernateTemplate().save(fTitle); // annotation ContentField fAnnotation = new ContentField(); fAnnotation.setIdentifier("annotation"); fAnnotation.setType(ContentField.Html_TYPE); fAnnotation.setInternal(Boolean.TRUE); newsItem.addContentField(fAnnotation); getHibernateTemplate().save(fAnnotation); // body ContentField fBody = new ContentField(); fBody.setIdentifier("body"); fBody.setType(ContentField.HTML_TYPE); fBody.setInternal(Boolean.TRUE); newsItem.addContentField(fBody); getHibernateTemplate().save(fBody); //写入field_value表 List contentLocales = executeFind("from ContentLocale l", true, null); for ( int i = 0; i < contentLocales.size(); i++ ) { ContentLocale contentLocale = (ContentLocale) contentLocales.get(i); String localeIdentifier = contentLocale.getIdentifier(); String valueTitle = (String) newsItem.getTitle().get(localeIdentifier); String valueAnnotation = (String) newsItem.getAnnotation().get(localeIdentifier); String valueBody = (String) newsItem.getBody().get(localeIdentifier); if ( (valueTitle == null valueTitle.trim().length() == 0) && (valueAnnotation == null valueAnnotation.trim().length() == 0) && (valueBody == null valueBody.trim().length() == 0) ) { continue; } //title ContentFieldValue fvTitle = new ContentFieldValue(); fvTitle.setContentLocale(contentLocale); if ( valueTitle != null ) { fvTitle.setSimpleValue(valueTitle); } else { fvTitle.setSimpleValue(""); } fvTitle.setLastUpdatedDatetime(new Date()); fTitle.addContentFieldValue(fvTitle); getHibernateTemplate().save(fvTitle); //annotation ContentFieldValue fvAnnotation = new ContentFieldValue(); fvAnnotation.setContentLocale(contentLocale); if ( valueAnnotation != null ) { fvAnnotation.setValue(ConvertUtil.convertToByteArray(valueAnnotation)); } else { fvAnnotation.setValue(new byte[0]);
|