0

我必须在 url 中有 utf-8 个字符。

例如有一个字符串要放在 url 中:

“海兰力克”

我想编码它:

try{
        selected=URLEncoder.encode(selected,"UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("http://" + serverUrl +"/myjsfpage.jsf?param=" + selected );
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }

我调试它,我看到一个预期的字符串:Hayranl%C4%B1k%24

在另一个控制器中,我必须处理它,所以我通过

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

        String selected = (String)req.getParameter("param");

        if(selected ==null){
            //show no result message
            return;
        }

之后我尝试对其进行解码,但是“在”解码之前,我从 url 获得的字符串类似于“Hayranlık$”。

try{
        selected=URLDecoder.decode(selected,"UTF-8");
    }catch(Exception e){
        e.printStackTrace();
    }

JSF 重定向会导致问题,还是浏览器 URL 处理问题?

4

1 回答 1

3

解码 HTTP 请求参数的是 servletcontainer 本身。你不需要也不应该这样做URLDecoder。用于 HTTP 请求参数解码的字符编码需要在 servletcontainer 配置中配置 GET 请求。

目前尚不清楚您使用的是哪一个,但根据您的问题历史,它是 Tomcat。在这种情况下,您需要将Tomcat 中 element的URIEncoding属性设置为.<Connector>/conf/server.xmlUTF-8

<Connector ... URIEncoding="UTF-8">

也可以看看:


与具体问题无关,在 JSF 中拉取请求参数的方式有些笨拙。以下更简单,并且不会在您的 JSF 托管 bean 中引入 Servlet API 依赖项:

String selected = externalContext.getRequestParameterMap().get("param");

或者,如果您在请求范围的 bean 中,只需通过@ManagedProperty.

@ManagedProperty("#{param.param}")
private String param;

(请注意,这#{param}是一个引用请求参数映射的隐式 EL 对象,并且#{param.param}仅返回map.get("param");您可能希望更改参数名称以使其更清晰,例如"?selected=" + selectedthen #{param.selected}

或者,如果您在视图范围的 bean 中,只需将其设置为<f:viewParam>.

<f:viewParam name="param" value="#{bean.param}" />

也可以看看:

于 2012-12-25T15:26:14.493 回答