如何在单个JSP文件中通过JSTL从同页面input标签设置变量?
在单个JSP中用JSTL从同页面Input设置变量的实现方法
没问题!不过得先搞清楚JSTL和input标签的执行时机差异——JSTL是服务器端运行的,而input是客户端页面元素,所以直接在页面首次加载时用JSTL读取同页面input的初始值是行不通的(服务器渲染页面时,客户端的input还没生成呢)。但如果是用户提交表单后把input值存为JSTL变量,或者结合场景做处理,完全可以实现,下面给你具体方案:
方案1:表单提交后将Input值存为JSTL变量
这是最常用的场景:用户在input中输入内容,提交表单到当前JSP页面,服务器端通过JSTL获取并存储这个值。
示例代码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>JSTL获取Input值示例</title> </head> <body> <!-- 表单提交到当前页面 --> <form method="post" action="${pageContext.request.requestURI}"> <label for="username">用户名:</label> <!-- 用EL表达式回显上次提交的值 --> <input type="text" id="username" name="username" value="${param.username}"> <button type="submit">提交</button> </form> <!-- 判断是否有提交的参数 --> <c:if test="${not empty param.username}"> <!-- 用<c:set>将input值存为page作用域的JSTL变量 --> <c:set var="userNameVar" value="${param.username}" scope="page"/> <p>你提交的用户名是:<strong>${userNameVar}</strong></p> <!-- 之后可以在页面任意位置使用这个变量 --> <p>再次显示变量值:${userNameVar}</p> </c:if> </body> </html>
关键说明
${param.username}是EL表达式的内置对象用法,用来获取请求中名为username的参数(也就是表单里input的值)<c:set>标签用来设置JSTL变量,scope可以指定作用域:page(当前页面)、request(当前请求)、session(会话)、application(全局),根据需求选择即可- 表单提交后,服务器重新渲染页面,此时就能通过JSTL获取并使用input的值了
方案2:实时处理Input值(注意:无法直接生成JSTL变量)
如果想在用户输入时实时获取input的值并处理,这时候不能用JSTL——因为JSTL在服务器端渲染页面后就已经执行完毕,客户端的输入操作无法触发服务器端的JSTL重新运行。这种场景需要用JavaScript来处理:
示例代码
<input type="text" id="username" oninput="showRealTimeValue()"> <p id="realTimeDisplay"></p> <script> function showRealTimeValue() { // 获取客户端input的值 var inputValue = document.getElementById('username').value; // 实时显示到页面 document.getElementById('realTimeDisplay').textContent = '你正在输入:' + inputValue; } </script>
关键说明
- 这种方式是纯客户端操作,和JSTL无关,因为JSTL无法感知客户端的实时输入
- 如果需要把实时输入的值传给服务器并生成JSTL变量,得用AJAX提交请求,后端处理后返回数据,前端再用JS更新页面——但这时候JSTL还是只在初始渲染或后端返回的页面片段中生效
总结
- JSTL是服务器端技术,只能处理服务器能获取到的数据(比如表单提交的参数、会话数据等)
- 要将同页面input的值转为JSTL变量,核心是通过表单提交(或AJAX提交)让服务器拿到input的值,再用
<c:set>存储 - 实时输入场景请用JavaScript,不要试图用JSTL处理客户端实时操作
内容的提问来源于stack exchange,提问作者vishu chaudhary
相关产品推荐
相关产品推荐

