2014-09-04 2 views
0

Я пытаюсь использовать данные сеанса в Servlet Velocity. Я отлаживаю сервлет с помощью Eclipse. Кажется, что сервлет работает (за исключением изменения сообщения), но переменная имени не сохраняется в контексте во время разговора. Я храню данные сеанса в неправильном месте? Или у меня проблема с конфигурацией?Как узнать сеанс приложения скорости Apache?

HelloWorld.java

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.velocity.Template; 
import org.apache.velocity.context.Context; 
import org.apache.velocity.tools.view.VelocityViewServlet; 
public class HelloWorld extends VelocityViewServlet 
{ 
    private static final String HELLO = "Hello! World!"; 
    private static final String GOODBYE = "Goodbye! Columbus!"; 
    private static final String NAME = "name"; 
    protected Template handleRequest(HttpServletRequest request, 
      HttpServletResponse response, Context ctx) 
    { 
      Template template = null; 
     try {template = getTemplate("hello.vm");} 
     catch (Exception e) {throw new RuntimeException(e);} 
     String name = (String)ctx.get(NAME); 
     if (HELLO.equals(name)) 
      name = GOODBYE; 
     else 
      name = HELLO; 
     ctx.put(NAME, name); 
     return template; 
    } 
} 

hello.vm

<html> 
    <head> 
     <script> 
      function goodbye() 
      { 
       var form = document.createElement('form'); 
       form.setAttribute('method', 'post'); 
       form.setAttribute('action', '/HelloWorld?x=yes'); 
       form.style.display = 'hidden'; 
       document.body.appendChild(form); 
       form.submit(); 
      } 
     </script> 
    </head> 
    <body> 
     <h4>$name</4> 
     <button type="submit" onclick="goodbye()">Good-bye</button> 
    </body> 
</html> 

tools.xml

<?xml version="1.0"?> 
<tools> 
    <toolbox scope="session"> 
     <tool key="hello" class="HelloWorld"/> 
    </toolbox> 
</tools> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 
    <servlet> 
     <servlet-name>hello</servlet-name> 
     <servlet-class>HelloWorld</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>serv</servlet-name> 
     <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class> 
     <init-param> 
      <param-name>org.apache.velocity.toolbox</param-name> 
      <param-value>/WEB-INF/tools.xml</param-value> 
     </init-param> 
     <init-param> 
      <param-name>org.apache.velocity.properties</param-name> 
      <param-value>/WEB-INF/velocity.properties</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>serv</servlet-name> 
     <url-pattern>*.vm</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>hello</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

ответ

0

Вы помещаете объект класса HelloWorld в панели инструментов. Но HellowWorld - это сервлет! Инструментарий предназначен только для базовых простых старых Java-объектов с геттерами и сеттерами.

Что вам нужно сделать, это использование сервлет вместо VelocityViewServlet, в сервлет класса тег в web.xml.

Тогда я не знаю точно, что вы намерены делать, но внутри шаблона вы можете ссылаться на свою сессию с помощью $ session.

Если ваш сеанс имеет атрибут 'name', то $ name вернет этот атрибут (при условии, что он не был перегружен значением во вложенной меньшей области видимости, области запроса или самим контекстом).

С последними версиями Velocity/VelocityTools вы можете использовать $ session.name для получения или установки атрибута name. С более старыми вам все равно нужно использовать $ session.setAttribute ('name', 'value') для установки атрибута.

Смежные вопросы