如何在重定向到自定义servlet时从JSF添加HttpServletRequest属性?

时间:2017-12-01 10:35:32

标签: jsf

我正在实现一种服务于Image的ImageServlet,受到BalusC示例的启发http://balusc.omnifaces.org/2007/04/imageservlet.html

我的servlet实现期望有一个参数" Animal"动物类型

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        LOGGER.info("On ImageServlet");

        // Get Animal from request.
        Animal animal = (Animal) request.getAttribute("Animal");

我的JSF页面在某个时候有一个graphicImage标签

<h:graphicImage value="faces/image?Animal=#{animalForm.animal}" />

我的animalForm bean正确地为动物服务

public Animal getAnimal()
{
    LOGGER.info("Current animal is : " + this.animal);
    return this.animal;
}

我知道Animal=#{animalForm.animal}是错误的,因为它添加了一个参数,它将是String类型而不是Attribute,但是我找不到在这里添加(Typed)属性的方法。

我还读到了关于使用omnifaces做同样事情的更新的方法,但是现在我处在一个学习曲线上,我(不幸地)开始使用ManagedBean和Tomcat的项目,所以我需要首先切换到CDI对象。一旦我在第一时间工作,我打算做后者

1 个答案:

答案 0 :(得分:0)

有一种方法可以将(imal)对象作为查询字符串的一部分传递,但您需要

  • 将您的动物转换为JSON
  • 然后将“JSON animal”编码为符合URL Query string标准的字符串。

<强>豆

将animal转换为JSON字符串并编码为URL字符串:

import com.google.gson.Gson;
import java.net.URLEncoder;
//.....

Animal animal;

public Animal getAnimal() {
    return animal;
}

//...

String jsonAnimalUrlEncoded;

public String getJsonAnimalUrlEncoded() throws UnsupportedEncodingException{
    Gson gson=new Gson();
    String jsonAnimal=gson.toJson(animal);
    jsonAnimalUrlEncoded=URLEncoder.encode(jsonAnimal, "UTF-8");
    System.out.println("URL encoded JSON animal == " + jsonAnimalUrlEncoded);
    return jsonAnimalUrlEncoded;
}

JSF页面(动物图片)

<h:graphicImage value="faces/image?animal=#{animalForm.jsonAnimalUrlEncoded}" />

这会将URL编码的JSON动物作为animal属性传递给您的servlet。

Servlet方

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    LOGGER.info("On ImageServlet");

    // Get json animal url encoded string from request
    String jsonAnimalUrlEncoded = request.getAttribute("animal");
    //convert it to JSON animal
    String jsonAnimal=URLDecoder.decode(getJsonAnimalUrlEncoded(),"UTF-8");
    //transform json animal to animal java object
    Animal animal = (Animal) new Gson().fromJson(jsonAnimal, Animal.class);

    System.out.println("My name is: " + animal.getName());

    //...
}

Servlet doGet方法将捕获您从JSF页面传递的jsonAnimalUrlEncoded,将其解码回“普通”JSON字符串并将JSON字符串转换为真正的动物Java对象。

写这个很有趣,因为类名是Animal:)