日期:2014-05-16  浏览次数:20449 次

JSF 里的action心得
最近一直都在研究jsf 以前一直对ajax anction actionListener 里的东西不是很清楚 对jsf里的流程都不是很清楚 经过一段时间的学习 现在把自己的学习的心得写出来
首先就是
action的使用规律
  我使用action一般都是用来进行页面的导航可以通过一个result进行导航 具体这个导航的我认为应该是类似于forward的工作模式 就是说request范围的参数也是可以传递的
现在就举一个例子
首先是一个login.xhtml的代码
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Login Face</title>
        <script src="js/login.js" type="text/javascript"></script>
    </h:head>
    <h:body>
        <h:form id="loginForm" onsubmit="return checkForm()">
               <h:outputScript library="javax.faces" name="jsf.js" target="head"/>
               <h:outputLabel value="welcom to Login our site" ></h:outputLabel>
               <br/><h:outputLabel value="#{user.message}"></h:outputLabel>
               <br/><h:outputLabel value="userName:"></h:outputLabel>
               <h:inputText id="userName" value="#{user.userName}" ></h:inputText>
               <br/><h:outputLabel value="password:" ></h:outputLabel>
               <h:inputSecret  id="password" value="#{user.password}"></h:inputSecret>
               <br/><h:commandButton value="submit" action="#{manager.login}" />
               <a href="register.jsf">register</a>
               <a href="forget.jsf">forget</a>
        </h:form>
    </h:body>
</html>

从这个代码中可以看出的是我的业务的逻辑主要是#{manager.login} 所以我先设置的user这个managerBean 是一个request的bean 但是 manager是session的bean
我规定的是加入登录成功的话就转到successfully.jsf的页面 如果输入的用户名不存在的话就在当前页面进行显示 如果密码错误的话就显示密码错误
manager.login的代码如下
 public String  login(){
        String result = null;
        DBibatis db = new DBIbatisImpl();//这是一个数据库操作的接口
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        //获得的是request里的数据
        UserBean loginUser =(UserBean)context.getRequestMap().get("user");
        //从数据库中获得这个用户名的结果
        UserBean dbUser = db.queryByName(loginUser.getUserName());
        if(dbUser == null){
        //没有这个用户名就在request中增加message的内容
         loginUser.setMessage("no this userName here!");
            result = "login.jsf";//规定导航的jsf
        }else {
            if(dbUser.getPassword().equals(loginUser.getPassword())){
                result = "successfully.jsf";//显示的是成功之后的页面
                this.userName = loginUser.getUserName();//在这个sessionScope的manager 我设置了一个用户名的标识userName
            }else{
               //这个原理和第一个是相同的 所以说不再讲解了
               loginUser.setMessage("the password is wrong!");
                result = "login.jsf";
            }
        }
        return result;//返回这个导航的结果
    }

successfully.jsf中的代码是
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:outputLabel value="Welcome you ! "></h:outputLabel>
        <h:outputText value="#{manager.userName}"></h:outputText>
    </h:body>
</html>
我认为有的是直接result 可以将后缀名去掉 我觉得这样是不是让代码变得没有层次感所以这就是我的写的风格 个人喜好 不说也罢