首页 > 奇闻 > 正文内容

JSP如何接收多个URL参数?中文乱码解决方案

奇闻2025-05-27 22:27:29

(开场白)
刚入门的小王盯着屏幕抓耳挠腮:"这个用户搜索页怎么传了3个参数就收不到?中文搜索词全变成问号!"——别慌!今天咱们用三个真实开发场景,手把手教你??既收得到参数,又治得好乱码??的绝活!


场景一:分页查询翻车现场

"产品列表页要同时传页码、分类、排序方式三个参数,后台怎么接?"

??硬核解决方案:??

jsp复制
<%
// 基础版:直接挨个取参数
String pageNo = request.getParameter("page");
String categoryId = request.getParameter("cat");
String sortType = request.getParameter("sort");

// 增强版:带默认值处理
int currentPage = Integer.parseInt(pageNo == null ? "1" : pageNo);
%>

??重点注意!??

  1. 所有参数值默认都是String类型,??数字必须转型??
  2. 用三目运算符处理null值,避免空指针异常
  3. 参数名严格区分大小写(cat和Cat是两个参数)

场景二:中文搜索词变天书

"用户搜'华为手机',后台收到'??????',这还怎么查数据库?"

??乱码四步根治法:??

jsp复制
<%-- 第一步:在获取参数前设置解码方式 --%>
<% request.setCharacterEncoding("UTF-8"); %>

<%-- 第二步:处理GET请求的额外配置 --%>
// 修改Tomcat的server.xml(加上URIEncoding="UTF-8")
"8080" URIEncoding="UTF-8"/>

<%-- 第三步:手动转码的保底方案 --%>
String keyword = new String(request.getParameter("kw").getBytes("ISO-8859-1"),"UTF-8");

<%-- 第四步:输出前确认编码 --%>
<%@ page contentType="text/html;charset=UTF-8" %>

??原理揭秘:??

  • POST请求靠setCharacterEncoding
  • GET请求依赖Tomcat配置+手动转码双保险
  • 就像快递包裹,??寄件人(浏览器)和快递站(服务器)必须用同一种包装方式??

场景三:批量操作参数爆炸

"要同时处理20个商品ID,地址栏变成?id=1&id=2&id=3...这也太丑了吧?"

??优雅解决方案:??

jsp复制
<%-- 用数组接收同名参数 --%>
String[] productIds = request.getParameterValues("id");

<%-- 配合EL表达式更清爽 --%>
forEach items="${paramValues.id}" var="id" varStatus="vs">
    第${vs.index+1}个ID:${id}
forEach>

??开发技巧:??

  • 表单中多个同名input会自动拼成数组
  • paramValues对象直接获取参数集合
  • 遇到逗号分隔的复合参数(如id=1,3,5),可以用String.split(",")拆解

防坑指南(血泪经验)

  1. ??编码设置的顺序很重要??
    见过有人把setCharacterEncoding写在取参数之后,那就像炒完菜才开火——完全没用!

  2. ??GET/POST要区别对待??
    POST请求改配置就能搞定,但GET请求必须改Tomcat配置,这个坑我当年踩了三次!

  3. ??浏览器地址栏的陷阱??
    直接在地址栏输入中文参数,不同浏览器表现不同(建议用encodeURIComponent预处理)

  4. ??终极检测工具??
    在JSP页面插入这段代码,立刻看到原始参数:

    jsp复制
    原始字节数据:<%= Arrays.toString(request.getQueryString().getBytes("ISO-8859-1")) %>

个人私房解决方案

干了十年JSP开发,我的配置习惯是:

  1. ??所有项目标配过滤器??
    java复制
    public class EncodingFilter implements Filter {
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
            req.setCharacterEncoding("UTF-8");
            res.setContentType("text/html;charset=UTF-8");
            chain.doFilter(req, res);
        }
    }
  2. ??URL传参必用JSTL??
    jsp复制
    <c:url value="/search.jsp">
        <c:param name="keyword" value="华为手机"/>
    c:url>
  3. ??遇到疑难杂症直接看字节流??
    new String(request.getParameter("kw").getBytes("ISO-8859-1"),"UTF-8")这招能解决90%的乱码问题

记住,参数接收就像吃火锅——食材(参数)要新鲜,锅底(编码)要调对味,火候(处理顺序)要掌握好。下次再遇到乱码问题,按这三个场景对症下药,保证药到病除!

搜索