java之家

开发心得

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 1 文章 :: 1 评论 :: 0 Trackbacks

   对于开发对于页面连接尤如蜘蛛网一样,经常会有一堆具有千头万绪的关联页面组成的大中型Web应用来说,如何组织及处理页面的跳转成为一个MVC框架非常关键因素。Struts1之所以能得到大家的认可,是因为他基本解决了数据与视图分离的问题,之所以Struts升级一个版本到Struts2后不再“Struts”了,核心原因除了框架核心技术落后、很多地方受限制以外,一个原因是他无法很好地组织及处理页面跳转问题。当然尽管升级到了Struts2,但相对于Rails等新兴MVC的框架来说,显得死板了很多。
   而EasyJWeb在页面组织及处理页面跳转等方面,提供了很多更加灵活的功能,很多思想来自于Spring MVC、Rails等一些新兴Web框架的精髓,他能让你用比较简洁的代码、甚至不用代码来实现页面的跳转。
  在Web应用程序开发中,我们经常遇到如下的需求:
  1、从这个页面连接到另外一个页面;
  2、在服务器执行完某一段程序后,把输出导向另外一个页面;
  3、在服务器端执行完某一段程序后,把输出导向到另外一段程序继续执行;
  4、在服务器程序执行完后,选择使用一个页面呈现用户输出;
  5、页面跳转要具有较强的环境适应能力,比如部署在跟目录下跟部署到其它Context目录下都能执行正确的跳转;
  6、还有更变态的,比如EasyJF官网,要求使用动态地址访问的时候,看到的地址全是动态,当使用静态地址访问的时候,地址全是静态的,Java Web服务器不能工作了,Apache或IIS也要保证网页能正常访问。
  7、有的人喜欢使用/user/edit/1这样的url,有的人喜欢使用/user.ejf?cmd=edit&id=1这样的url,我们要求不管使用哪一种url样式访问页面,连接都会非常友好的变成用户喜爱的形式。

   可以说,现在很少有框架能完全满足或者为用户考虑到如此复杂多变而对于我们国人来说应用性又非常广泛的需求。一些框架即使提供上面一些功能也是以书写复杂的代码及配置文件为代价的。在EasyJWeb中,提供了上面所列的这些功能,并提供了非常简洁的调用接口及方法。
   针对上面的几点,EasyJWeb的解决方案:
  1,这个用<a>标签,不用说了。
  2、在服务器执行完某一段程序后,把输出导向另外一个页面;
  返回html类型的Page对象。
  3、在服务器端执行完某一段程序后,把输出导向到另外一段程序继续执行;
   使用forward或者go方法。
  4、在服务器程序执行完后,选择使用一个页面呈现用户输出;
   使用page方法。
  5、页面跳转要具有较强的环境适应能力,比如部署在跟目录下跟部署到其它Context目录下都能执行正确的跳转;
  在页面模板中使用$html.url,比如:<a href="$html.url('user.list')">用户列表</a>。
  6、不同地址样式转移
  在页面模板中使用$html.forward,比如<a href="$html. forward'('news.technic')">技术前沿</a>。这样动态的时候访问到的是news.ejf?cmd= technic,静态的时候访问到的是/news/technic.html。
  7、传统及现代的URL样式转换
   仍然是使用$html.url,或$html.forward标签,他能感知你的url样式。比如:<a href="$html.url('user.add')">添加用户</a>。你使用user.ejf?cmd=lsit,访问应用,则当点添加user.ejf?cmd=add。而如果你使用/ejf/user/list访问应用,则编辑按钮的连接变成ejf/user/add。
  
  在代码中,除了可以使用最原始的return new Page()方式返回用户的视图模板以外,还可以使用一些快捷方法来实现灵活的视图查询及跳转。比如,go、forward、page等方法。下面看一个用户添删改查的示例中的Action代码如下:

import com.easyjf.container.annonation.Inject;
import com.easyjf.core.support.query.QueryObject;
import com.easyjf.util.CommUtil;
import com.easyjf.web.WebForm;
import com.easyjf.web.core.AbstractPageCmdAction;
import com.easyjf.web.tools.IPageList;

public class UserAction extends AbstractPageCmdAction {
 
 @Inject
 
private UserService service;
 
 
public void setService(UserService service) {
  
this.service = service;
 }

 
/**
  * 显示添加用户的界面user/edit.html
  
*/

 
public void add()
 
{
  page(
"edit");
 }

 
public void edit(WebForm form)
 
{
  String id
=(String)form.get("id");
  User user
=this.service.getUser(new Long(id));
  form.addPo(user);
 }

 
public void save(WebForm form)
 
{
  User user
=form.toPo(User.class);
  
if(hasErrors())
  
{
   page(
"edit");
   
return;
  }

  service.saveUser(user);
  forward(
"list");
 }

 
public void update(WebForm form)
 
{
  String id
=(String)form.get("id");
  User user
=this.service.getUser(new Long(id));
  form.toPo(user,
true);
  
if(hasErrors())
  
{
   page(
"edit");
   
return;
  }

  service.updateUser(user);
  forward(
"list");
 }

 
public void delete(WebForm form)
 
{
  String id
=(String)form.get("id");
  User user
=this.service.getUser(new Long(id));
  service.delUser(user);
  go(
"list");
 }

 
public void list(WebForm form)
 
{
  QueryObject qo
=form.toPo(QueryObject.class);
  IPageList pageList
=service.queryUser(qo);
  CommUtil.saveIPageList2WebForm(pageList, form);  
 }

}


UserService接口:
public interface UserService {
 
/**
  * 根据id查询用户
  * 
  * 
@param id
  * 
@return
  
*/

 User getUser(Long id);

 
/**
  * 保存用户
  * 
  * 
@param user
  
*/

 
void saveUser(User user);

 
/**
  * 修改用户信息
  * 
  * 
@param user
  
*/

 
void updateUser(User user);

 
/**
  * 删除用户
  * 
  * 
@param user
  
*/

 
void delUser(User user);

 
/**
  * 查询用户信息
  * 
@param query 
  * 
@return 分页信息及记录集
  
*/

 IPageList queryUser(IQueryObject query);
}


posted on 2007-12-14 13:15 java fan nb 阅读(739) 评论(0)  编辑  收藏 所属分类: struts框架

只有注册用户登录后才能发表评论。


网站导航: