在开发jsp / servlet页面时,我的口音管理(字符集)有问题。我认为问题与发布请求参数未正确编码有关。
我有一个index.jsp页面,其表单使用这样的发布请求:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Initialisation des données</title>
</head>
<body>
<h3>Enquête sur les voyages</h3><hr>
<form method="post" action="initProcess.jsp">
<p>
<label for="nom">Entrer votre nom de famille :</label><br>
<input type="text" name="nom" id="nom" tabindex="10">
</p>
<p>
<label for="prenom">Entrer votre prénom :</label><br>
<input type="text" name="prenom" id="prenom" tabindex="20">
</p>
<p>
<label for="pays">Dans quel(s) pays avez vous déja voyagé ? :</label><br>
<select name="pays" id="pays" multiple="multiple" tabindex="30">
<option value="France">France</option>
<option value="Espagne">Espagne</option>
<option value="Italie">Italie</option>
<option value="Royaume-uni">Royaume-uni</option>
<option value="Canada">Canada</option>
<option value="Etats-unis">Etats-Unis</option>
<option value="Chine">Chine</option>
<option value="Japon">Japon</option>
</select>
</p>
<p>
<label for="autre">Entrer ici les autres pays que vous avez visités,
séparés par une virgule :</label><br>
<textarea name="autre" id="autre" tabindex="20" rows="2" cols="40"
tabindex="40" placeholder="Ex: Norvège, Chili, Nouvelle-Zélande"></textarea>
</p>
<input type="submit" value="Valider">
<input type="reset" value="Remettre à zéro">
</form>
</body>
</html>
我们可以看到在这个jsp文件中,我的字符带有重音(Enquête),它们的显示效果很好。这意味着直接在页面中使用重音符号时,字符集/编码没有问题。
但是,当我用带重音符号的字符(例如贝宁)填充表单并将表单发送到initprocess.jsp时,我想显示发送的内容,那么我就有了字符集/编码问题。 Bénin显示Bénin。这意味着它们是一个字符集/编码格式问题,其请求参数是通过后期请求发送的。
但是在initprocess.jsp页面的开头,我放了小脚本
<% request.setCharacterEncoding("UTF-8"); %>
,此问题已解决。我唯一的问题是我不想在jsp页面中使用scriptlet。
如何在不使用脚本的情况下解决此问题。
这是initprocess.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Récupération des données</title>
</head>
<body>
<% request.setCharacterEncoding("UTF-8"); %>
<h3>Fiche de résultat</h3><hr>
<p>
<b>Vous avez renseigné les informations suivantes :</b>
</p>
<%-- parcours de l'objet implicite paramValues qui souvenons nous est une map
pour traiter chaque paramètres de ma requête --%>
<c:forEach var="parametre" items="${paramValues}">
<ul>
<%-- Affiche la clé de la Map paramValues --%>
<li><b><c:out value="${parametre.key}"></c:out></b>:</li>
<%-- parcourt le tableau de String[] associé à la clé traitée --%>
<c:forEach var="value" items="${parametre.value}">
<%-- afficher chacune des valeurs de la clé donnée --%>
<c:out value="${value}"></c:out>
</c:forEach>
</ul>
</c:forEach>
<p>
<b>Vous vous nommez :</b>
</p>
<p>
<%-- Affiche les valeurs des paramètres nom et prénom en y accédant directement
via l'objet implicite (une map) param. On sait en effet qu'il n'y a qu'une seule
valeur associée à chacun de ces deux paramètres. Pas besoin d'utiliser paramValues! --%>
<c:out value="${ param.prenom }"></c:out> <c:out value="${ param.nom }"></c:out>
</p>
<p>
<b>Vous avez visité les pays suivants:</b>
</p>
<p>
<%-- teste l'existence du parametre pays. S'il existe on le traite,
sinon on affiche un message par defaut --%>
<c:choose>
<c:when test="${ !empty paramValues.pays }">
<%-- parcourt le tableau des valeurs associées au parametre pays de la requête,
en utilisant l'objet implicite paramValues. En effet c'est necessaire puisque
le select permet de renvoyer plusieurs pour le seul paramètre nommé pays.--%>
<c:forEach var="pays" items="${ paramValues.pays }">
<c:out value="${ pays }"></c:out>
</c:forEach>
</c:when>
<c:otherwise>
Vous n'avez visité de pays dans la liste proposée
</c:otherwise>
</c:choose>
<%-- Test l'existence du paramètre autre. Si des données existe
on les traite sinon on affiche un message par defaut --%>
<c:choose>
<c:when test="${ !empty param.autre }">
<%-- parcourt les valeurs associées au paramètre autre de la requête,
en utilisant l'objet implicite param. En effet toutes les valeurs sont
ici concatenées et transmise dans une seule chaine de caractères qu'on
parcourt via la boucle forTokens --%>
<c:forTokens items="${ param.autre }" delims="," var="pays">
<c:out value="${ pays }"></c:out>
</c:forTokens>
</c:when>
<c:otherwise>
Vous n'avez pas visité d'autres pays.
</c:otherwise>
</c:choose>
</p>
</body>
</html>
请帮助我。