这次项目中用Freeer框架,取Session报错.报session未定义.main.ftl中代码:    <#if session.currentUser?exists>
                     <#include "/control/con_login1.html">
                        <#else>
                             <#include "/control/con_login.html">
     </#if>con_login1.ftl中代码:<#if Session["currentUser"]?exists>
<#assign currentUser = Session["currentUser"]>
</#if><div class="dengluchenggong">
    <div class="index_login" style="margin-top:0;">
        <div class="index_login_top"></div>
        <div class="index_login_mid">
            <div class="yonghu_pic">
                <div class="yh_pic">
                    <img
                        src="/huigou/images/huigou/touxiang.gif" />
                </div>
                 <font disabled>欢迎光临会购</font>
            </div>
            <p>
                手机号:${currentUser.mobile?if_exists}
            </p>
            <p>
                <#if currentUser.petname?exists>
                   
                            昵称:${currentUser.petname?if_exists}
                    <#else>
                        昵称: ${currentUser.username?if_exists}
                </#if>
            </p>
            <li>
                <div class="login_bottom">
                    <a href="/huigou/huigou/user.jsp"> <img
                            src="/huigou/huigou/images/gerenzhongxin.gif"
                            width="67" height="19" border="0" /> </a>
                     &nbsp;&nbsp;&nbsp;&nbsp;
                    <a href="/huigou/loginout.jsp"><img
                            src="/huigou/huigou/images/gif-0545.gif"
                            width="57" height="18" border="0" /> </a>
                </div>
            </li>
        </div>
        <div class="index_login_bot"></div>
    </div>
    <div class="clr"></div>
</div>con_login中代码:
<script src="/huigou/dwr/util.js"
        type="text/javascript"></script>
<script src="/huigou/dwr/engine.js"
        type="text/javascript"></script>
<script src="/huigou/dwr/interface/userService.js"
        type="text/javascript"></script>
<script type="text/javascript"
    src="/huigou/js/huigou/reg.js"></script>
<script type="text/javascript">
<!--
function submitLoginForm(){
      var username=document.getElementById("username");
      var password=document.getElementById("password");
      if(username.value==""){
      alert("用户名不能为空!");
      username.focus();
      return false;
      }
      if(password.value==""){
      alert("密码不能为空!");
      password.focus();
      return false;
      }
      userService.singleton(username.value,password.value,function(flag){
               if(flag!=""){
                     switch(flag){
                        case '0':
                              alert("密码错误");break;
                        case '1':
                             alert("账号不存在");break;
                        case '-100':
                             alert("出错了!");break;   
                        default:
                            document.getElementById("abc").innerHTML="<div class='dengluchenggong'>"
    +"<div class='index_login' style='margin-top:0;'>"
       +"    <div class='index_login_top'></div>"
        +"<div class='index_login_mid'>"
            +"<div class='yonghu_pic'>"
                +"<div class='yh_pic'>"
                    +"<img src='/huigou/images/huigou/touxiang.gif' />"
                +"</div>"
                   +"<font disabled>欢迎光临会购</font>"
            +"</div>"
            +"<p>"
                +"<font disabled>手机号:</font>"+flag
            +"</p>"
            +"<p>"
                +"<font disabled>昵称:</font>"+username.value
            +"</p>"
            +"<li>"
                +"<div class='login_bottom'>"
                    +"<a href='/huigou/huigou/user.jsp'> <img src='/huigou/huigou/images/gerenzhongxin.gif' width='67' height='19' border='0' /> </a>"
                     +"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
                    +"<a href='/huigou/loginout.jsp'><img src='/huigou/huigou/images/gif-0545.gif' width='57' height='18' border='0' /> </a>"
                +"</div>"
            +"</li>"
        +"</div>"
        +"<div class='index_login_bot'></div>"
    +"</div>"
    +"<div class='clr'></div>"
+"</div>";
                     }
            }
      })
    }
//-->
</script>
<div class="index_login" id="abc">
    <div class="index_login_top"></div>
        <div class="index_login_mid">
            <ul>
                <li>
                    <font disabled>账号:</font>
                    <input type="text" name="username" size="6" id="username" />
                </li>
                <li>
                    <font disabled>密码:</font>
                    <input type="password" name="password" size="6" id="password" />
                </li>               
                <li>
                    <div class="login_bottom">
                      <a href="#" onclick="submitLoginForm();">
                             <img
                                src="/huigou/huigou/images/index_denglu.gif"
                                width="73" height="23" border="0" /> </a>
                        <a
                            href="/huigou/c/user.shtml?method=toreg"><img
                                src="/huigou/huigou/images/index_zhuche.gif"
                                width="73" height="23" border="0" /> </a>
                    </div>
                    <font disabled> 卡用户密码"5higo.com"</font>
                </li>
            </ul>
        </div>
    <div class="index_login_bot"></div>
</div>运行时就报错:Expression Session is undefined on line 128, column 54 in main.ftl.
The problematic instruction:
----------
==> if-else  [on line 128, column 49 in main.ftl]
----------Java backtrace for programmers:
----------
freeer.core.InvalidReferenceException: Expression Session is undefined on line 128, column 54 in main.ftl.
    at freeer.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:75)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.BuiltIn$existsBI._getAsTemplateModel(BuiltIn.java:636)
    at freeer.core.BuiltIn$existsBI.isTrue(BuiltIn.java:647)
    at freeer.core.IfBlock.accept(IfBlock.java:80)

解决方案 »

  1.   

    FreeMarker中Session应该怎么取啊??有人知道吗?
      

  2.   

    这个问题我没碰到过,绑定先.记得
    以前做过一个FreeMarker的项目,session就和jsp里一样取的.因为最后拼装好还是一张jsp吧
      

  3.   

    <#if Session["currentUser"]?exists>       <#include "/control/con_login1.html">
                            <#else>
                                 <#include "/control/con_login.html">
                              </#if>
    或者说
    <#if Session.currentUser?exists>       <#include "/control/con_login1.html">
                            <#else>
                                 <#include "/control/con_login.html">
                              </#if>
    我都试过啦,报一样的错,都是
    2010-01-18 09:41:30 [freeer.runtime]-[ERROR]
    Expression Session is undefined on line 128, column 54 in main.ftl.
    The problematic instruction:
    ----------
    ==> if-else  [on line 128, column 49 in main.ftl]
    ----------Java backtrace for programmers:
    ----------
    freeer.core.InvalidReferenceException: Expression Session is undefined on line 128, column 54 in main.ftl.
    at freeer.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:75)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.BuiltIn$existsBI._getAsTemplateModel(BuiltIn.java:636)
    at freeer.core.BuiltIn$existsBI.isTrue(BuiltIn.java:647)
    at freeer.core.IfBlock.accept(IfBlock.java:80)
    at freeer.core.Environment.visit(Environment.java:196)
    at freeer.core.MixedContent.accept(MixedContent.java:92)
    at freeer.core.Environment.visit(Environment.java:196)
    at freeer.core.Environment.process(Environment.java:176)
    at freeer.template.Template.process(Template.java:232)
    at com.dahe.huigou.util.Freeer.makeHtml(Freeer.java:84)
    at com.dahe.huigou.action.HMainAction.index(HMainAction.java:154)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.dahe.huigou.util.filter.EncodingFilter.doFilter(EncodingFilter.java:93)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527)
    at java.lang.Thread.run(Unknown Source)Expression Session is undefined on line 128, column 54 in main.ftl.
    The problematic instruction:
    ----------
    ==> if-else  [on line 128, column 49 in main.ftl]
    ----------Java backtrace for programmers:
    ----------
    freeer.core.InvalidReferenceException: Expression Session is undefined on line 128, column 54 in main.ftl.
    at freeer.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:75)
    at freeer.core.Expression
      

  4.   

    freeer内置session对象。<#if Session["currentUser"]?exists> 
    改成:
    <#if session["currentUser"]?exists> 
      

  5.   

    好象你写的格式不对,建议看下FreeMarker的语法格式,好象不用写session,
    直接
    <#if currentUser?exists>试试
      

  6.   

    对,不用写session 直接取就可以
      

  7.   

    main.ftl中
      <#if currentUser?exists>
     <#include "/control/con_login1.html"> 
                            <#else>
                                 <#include "/control/con_login.html">
                              </#if>
    用currentUser不没有报错但在
    con_login1.ftl中会报
    currentUser没定义错误
    <div class="dengluchenggong">
    <div class="index_login" style="margin-top:0;">
    <div class="index_login_top"></div>
    <div class="index_login_mid">
    <div class="yonghu_pic">
    <div class="yh_pic">
    <img
    src="/huigou/images/huigou/touxiang.gif" />
    </div>
     <font disabled>欢迎光临会购</font>
    </div>
    <p>
    手机号:${currentUser.mobile?if_exists}
    </p>
    <p>
    <#if currentUser.petname?exists>

        昵称:${currentUser.petname?if_exists}
    <#else>
    昵称: ${currentUser.username?if_exists}
    </#if>
    </p>
    <li>
    <div class="login_bottom">
    <a href="/huigou/huigou/user.jsp"> <img
    src="/huigou/huigou/images/gerenzhongxin.gif"
    width="67" height="19" border="0" /> </a>
         &nbsp;&nbsp;&nbsp;&nbsp;
    <a href="/huigou/loginout.jsp"><img
    src="/huigou/huigou/images/gif-0545.gif"
    width="57" height="18" border="0" /> </a>
    </div>
    </li>
    </div>
    <div class="index_login_bot"></div>
    </div>
    <div class="clr"></div>
    </div>
      

  8.   

    由此看来,currentUser是一个类.那你需要在后台定义好currentUser的实例,然后引用该实例来进行操作
      

  9.   

    currentUser不是类,只是存放Session的一个常量.
      

  10.   

     登陆用ajax写的
    public String  singleton(String username , String password){
    try{
    CUser sheetRegUser = null;
    List userList = this.userDAO.getByProperty("username", username);
    List petlist = this.userDAO.getByProperty("petname",username );
    if(userList != null && !userList.isEmpty()){
    sheetRegUser = (CUser) userList.get(0);
    }else if (petlist != null && !petlist.isEmpty()){
    sheetRegUser = (CUser) petlist.get(0);
    }else{
    return "1"; //用户不存在
    }
    if (sheetRegUser.getPassword().equals(
    new MD5().getMD5ofStr(password))) {
    WebContext ctx = WebContextFactory.get();
    HttpSession session = ctx.getHttpServletRequest().getSession();
    if (sheetRegUser != null) {
    if (sheetRegUser.getLogintimes() == null
    || "".equals(sheetRegUser.getLogintimes())) {
    session.setAttribute("logintime",
    ConvertTime.getTime());
        }
    session.setAttribute("logintime",
    sheetRegUser.getLogintimes());
    sheetRegUser.setLogintimes(ConvertTime.getTime());
    sheetRegUser
    .setOnline_status(HConstants.CEM_HMK_USER_ONLINE_STATUS_YES);
    this.userDAO.save(sheetRegUser);
    session.setAttribute("mobile",
    sheetRegUser.getMobile());
    session.setAttribute(
    HConstants.SESSION_CURUSER, sheetRegUser);System.out.println("Session里放入对象........");
    }
        return sheetRegUser.getMobile();
       }else{
            return "0"; //密码错误
       }
    }catch(Exception e){
    e.printStackTrace();
    return "-100";     //登录异常
    }
    }
    首页Action:
    public ActionForward index(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    this.InitIndexFormData(request);
    Freeer.makeHtml(request, "root", "r", "con_login.ftl",
    "/con_login.html");
    Freeer.makeHtml(request, "root", "r", "con_login1.ftl",
    "/con_login1.html");//取session报错
    Freeer.makeHtml(request, "root", "r", "con_right_top_guanggou.ftl",
    "/con_right_top_guanggou.html");
    Freeer.makeHtml(request, "main.ftl", "/main.html");
    return mapping.findForward("index");
    }
      

  11.   

    main.ftl和con_login1.ftl不是同一路径,会不会因此取不到currentUser?猜想
      

  12.   

    con_login1.ftl代码:<div class="dengluchenggong">
    <div class="index_login" style="margin-top:0;">
    <div class="index_login_top"></div>
    <div class="index_login_mid">
    <div class="yonghu_pic">
    <div class="yh_pic">
    <img
    src="/huigou/images/huigou/touxiang.gif" />
    </div>
     <font disabled>欢迎光临会购</font>
    </div>
    <p>
    手机号:${session["currentUser"].mobile?if_exists}
    </p>
    <p>
    <#if currentUser.petname?exists>

        昵称:${session["currentUser"].petname?if_exists}
    <#else>
    昵称: ${session["currentUser"].username?if_exists}
    </#if>
    </p>
    <li>
    <div class="login_bottom">
    <a href="/huigou/huigou/user.jsp"> <img
    src="/huigou/huigou/images/gerenzhongxin.gif"
    width="67" height="19" border="0" /> </a>
         &nbsp;&nbsp;&nbsp;&nbsp;
    <a href="/huigou/loginout.jsp"><img
    src="/huigou/huigou/images/gif-0545.gif"
    width="57" height="18" border="0" /> </a>
    </div>
    </li>
    </div>
    <div class="index_login_bot"></div>
    </div>
    <div class="clr"></div>
    </div>
    取session报错:
    2010-01-18 10:30:30 [freeer.runtime]-[ERROR] 
    Expression session is undefined on line 14, column 39 in con_login1.ftl.
    The problematic instruction:
    ----------
    ==> ${session["currentUser"].mobile?if_exists} [on line 14, column 37 in con_login1.ftl]
    ----------Java backtrace for programmers:
    ----------
    freeer.core.InvalidReferenceException: Expression session is undefined on line 14, column 39 in con_login1.ftl.
    at freeer.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:75)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.Dot._getAsTemplateModel(Dot.java:74)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.BuiltIn$if_existsBI._getAsTemplateModel(BuiltIn.java:677)
    at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
    at freeer.core.Expression.getStringValue(Expression.java:93)
    at freeer.core.DollarVariable.accept(DollarVariable.java:76)
    at freeer.core.Environment.visit(Environment.java:196)
    at freee
      

  13.   

    currentUser存放Session,和路径会有关系吗?
      

  14.   

    currentUser.petname,后台没看到你赋值和取值的过程,那段代码能不能贴下?
      

  15.   

    只是猜想.去年初的项目.我没用到session,直接取就ok了.所以猜想下
      

  16.   

    上面给了13楼,currentUser里面就是存放一个CUser,petname是CUser的属性
      

  17.   

    我也一第一次使用这个FreeMarker
      

  18.   

    难道CUser currentUser=sheetRegUser?你先直接把currentUser替换成sheetRegUser试试
      

  19.   

    还有,currentUser定义全局了么?
      

  20.   

    HConstants.SESSION_CURUSER=currentUser这里就是currentUser
      

  21.   

    我仔细想了下。访问首页,对首页进行了缓存,但登陆时候用到AJAX时局部更新,在点击到其他页面后返回就加载的是未登录时候的缓存页面,导致了页面为获取到session,有没有这个可能?你把sessionid打出来看一看,前后是否一样.
      

  22.   

    首页Action改为
    public ActionForward index(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    this.InitIndexFormData(request);
    Freeer.makeHtml(request, HConstants.SESSION_CURUSER, request
    .getSession(), "con_login.ftl", "/con_login.html");
    Freeer.makeHtml(request, HConstants.SESSION_CURUSER, request
    .getSession(), "con_login1.ftl", "/con_login1.html");
    Freeer.makeHtml(request, "root", "r", "con_right_top_guanggou.ftl",
    "/con_right_top_guanggou.html");
    Freeer.makeHtml(request, "main.ftl", "/main.html");
    return mapping.findForward("index");
    }直接把Sessiont放进CurrentUser里Freeer.makeHtml(request, HConstants.SESSION_CURUSER, request
    .getSession(), "con_login1.ftl", "/con_login1.html");
    但是我现在在con_login1.ftl中取currentUser好象为空!
      

  23.   

    这句操作在哪里实现的?就是
    currentUser里面就是存放一个CUser
      

  24.   

    CUser sheetRegUser = null;
    ...............
    session.setAttribute(HConstants.SESSION_CURUSER, sheetRegUser);
    HConstants.SESSION_CURUSER存放currentUser;
      

  25.   

    session.setAttribute(HConstants.SESSION_CURUSER, sheetRegUser); 
    HConstants.SESSION_CURUSER存放currentUser;
    不是直接覆盖掉了么?
      

  26.   

    用户登陆时保存session.setAttribute(HConstants.SESSION_CURUSER, sheetRegUser); 
    首页Action中Freeer.makeHtml(request, HConstants.SESSION_CURUSER, request.getSession(),
    "con_login1.ftl", "/con_login1.html");
    中HConstants.SESSION_CURUSER还是指向同一个currentUser;
      

  27.   

    HConstants.SESSION_CURUSER存放currentUser; 
    这步怎么实现的?
      

  28.   

    没有存放啊,是一个地址指向啊.
    /**
     * 会话标识-存放普通用户登录成功的信息
     */
    public final static String SESSION_CURUSER = "currentUser";
      

  29.   

    public final static String SESSION_CURUSER = "currentUser"; 
    你这个currentUser是string啊,怎么可能存放CUser呢.
    况且这种定义也不能直接currentUser.petname来引用.还要getAttributer的方法取得吧
      

  30.   

    在Action中
    CUser user = (CUser) request.getSession().getAttribute(
    HConstants.SESSION_CURUSER);
    把Session中数据放进数据模型中传到模板中就可以啦!
      

  31.   

    <#assign session = stack.context["session"]>
    这样session就直接取出来了