Email:")%>无效

本文探讨了在Web开发中使用html_escape函数对特殊字符进行转义处理的现象。通过两个实例对比,解释了何时需要使用该函数来确保页面内容的正确显示。

 Email:<%= html_escape(h("Ann & Bill <frazers@isp.email>"))%><br>

输出Email:Ann &amp; Bill &lt;frazers@isp.email&gt;

 

 Email:<%= h("Ann & Bill <frazers@isp.email>")%><br>

输出:Email:Ann & Bill <frazers@isp.email>

 

完全不知道为什么。要加上html_escape才能正确读出?

《web 开发敏捷之道》中的却是写后者 却得到转义后的字符

 

<think>我们将在JSP页面中使用Java代码块(<% ... %>)实现一个勾选框(checkbox)功能。主要步骤包括: 1. 在JSP中声明变量来模拟数据(实际项目中可能来自数据库) 2. 使用循环生成一组记录,每条记录包含一个勾选框 3. 处理表单提交,获取选中的记录 示例场景:用户列表,每条记录前有一个勾选框,用户可以选择多条记录,然后提交表单进行批量操作(如删除)。 步骤: 1. 模拟数据:创建一个用户列表,每个用户有id、name等属性。 2. 生成表单:使用表格展示用户列表,每条记录前添加一个checkbox,其value设置为用户的id。 3. 表单提交:将选中的用户id提交到服务器。 4. 处理提交:在同一个JSP页面(或另一个页面)中,获取选中的id数组,并进行处理。 注意:为了在同一页面处理提交,我们使用一个表单,并将表单的action指向当前页面(或另一个处理页面)。 代码示例:</think>### JSP中使用Java代码块实现勾选框功能 以下是使用JSP脚本元素`<% ... %>`实现勾选框功能的完整解决方案: ```jsp <%@ page import="java.util.*" %> <%@ page contentType="text/html;charset=UTF-8" %> <% // 模拟数据源(实际项目中应从数据库获取) List<Map<String, Object>> userList = new ArrayList<>(); for (int i = 1; i <= 10; i++) { Map<String, Object> user = new HashMap<>(); user.put("id", i); user.put("name", "用户" + i); user.put("email", "user" + i + "@example.com"); user.put("selected", false); // 初始未选中状态 userList.add(user); } // 处理表单提交 if ("POST".equals(request.getMethod())) { String[] selectedIds = request.getParameterValues("selectedUsers"); // 更新选中状态 if (selectedIds != null) { Set<String> selectedSet = new HashSet<>(Arrays.asList(selectedIds)); for (Map<String, Object> user : userList) { int userId = (Integer) user.get("id"); user.put("selected", selectedSet.contains(String.valueOf(userId))); } } } %> ``` #### 表单显示部分 ```jsp <form method="post"> <table border="1" style="width:100%; border-collapse:collapse;"> <tr style="background-color:#f0f0f0;"> <th>选择</th> <th>ID</th> <th>姓名</th> <th>邮箱</th> </tr> <% for (Map<String, Object> user : userList) { boolean isSelected = (Boolean) user.get("selected"); %> <tr> <td style="text-align:center;"> <input type="checkbox" name="selectedUsers" value="<%= user.get("id") %>" <%= isSelected ? "checked" : "" %>> </td> <td><%= user.get("id") %></td> <td><%= user.get("name") %></td> <td><%= user.get("email") %></td> </tr> <% } %> </table> <br> <input type="submit" value="提交选择"> </form> ``` #### 结果显示部分 ```jsp <% if ("POST".equals(request.getMethod())) { String[] selectedIds = request.getParameterValues("selectedUsers"); %> <div style="margin-top:20px; padding:10px; background:#e0f7fa;"> <h3>选中的用户:</h3> <% if (selectedIds != null && selectedIds.length > 0) { %> <ul> <% for (String id : selectedIds) { %> <li>用户ID: <%= id %></li> <% } %> </ul> <p>共选中 <%= selectedIds.length %> 个用户</p> <% } else { %> <p>未选择任何用户</p> <% } %> </div> <% } %> ``` ### 关键实现说明 1. **数据结构设计** ```java Map<String, Object> user = new HashMap<>(); user.put("selected", false); // 存储选中状态 ``` 2. **勾选框绑定** ```jsp <input type="checkbox" name="selectedUsers" value="<%= user.get("id") %>" <%= isSelected ? "checked" : "" %>> ``` - `name="selectedUsers"`:所有勾选框共享相同名称,提交时自动组成数组 - `value="<%= user.get("id") %>"`:将用户ID作为值传递 - `<%= isSelected ? "checked" : "" %>`:动态设置选中状态 3. **表单数据处理** ```java String[] selectedIds = request.getParameterValues("selectedUsers"); ``` - 使用`request.getParameterValues()`获取所有选中的ID值数组 4. **状态同步机制** ```java for (Map<String, Object> user : userList) { user.put("selected", selectedSet.contains(String.valueOf(userId))); } ``` - 将用户选择状态与数据模型同步,实现页面刷新后保持选中状态 ### 高级功能扩展 #### 1. 全选/全不选功能 ```jsp <script> function toggleAll(source) { var checkboxes = document.getElementsByName('selectedUsers'); for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = source.checked; } } </script> <th> <input type="checkbox" onclick="toggleAll(this)"> 全选 </th> ``` #### 2. 批量操作菜单 ```jsp <select name="action" onchange="if(this.value) this.form.submit()"> <option value="">--选择操作--</option> <option value="delete">删除选中</option> <option value="activate">激活账户</option> <option value="deactivate">禁用账户</option> </select> ``` #### 3. 分页集成(结合您之前的需求) ```jsp <% // 分页参数(复用之前的分页逻辑) int pageSize = 5; int currentPage = 1; // ...(分页参数计算逻辑) %> <!-- 在表格下方添加分页导航 --> <div style="margin-top:20px; text-align:center;"> <% for (int i = 1; i <= totalPages; i++) { %> <a href="?page=<%= i %>"><%= i %></a> <% } %> </div> ``` ### 注意事项 1. **数据持久化**:实际项目中应将选中状态存储到数据库或session中 2. **安全防护**:对接收的ID参数进行验证,防止SQL注入 ```java try { int id = Integer.parseInt(request.getParameter("id")); // 处理ID } catch (NumberFormatException e) { // 处理无效输入 } ``` 3. **性能优化**:大数据量时使用分页加载,避免一次加载全部数据 4. **用户体验**:添加AJAX支持实现无刷新操作 5. **样式美化**:使用CSS美化勾选框和表格样式 ### 实际应用场景 - 用户管理系统(批量删除/激活) - 订单处理系统(批量发货) - 内容审核系统(批量审核通过/拒绝) - 数据导出功能(选择特定记录导出)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值