把脚本移出JSP

如果在servlet中我们在request放入了很多的属性,然后需要在页面上展示这些属性,我们该怎么样做呢?
例如:

如果使用脚本的话,页面中的代码应该是:

 

action tag

为了代码的可读性和分工,我们想要去掉其中的脚本,第一个办法是使用action tag。
页面中的代码可以改变为:

  • userBean标签中,type表示一个类型,如果没有class属性的时候表示在指定域中查找同名的顺序,相当于执行Person person =  (Person)request.getAttribute("person");
  • 如果有class属性,其表示要实例化的类,其中type可以使接口或者说是抽象类,如果找不到会新建一个对应的对象
  • setProperty标签中,能够给bean中的属性设置值,value就表示一个具体的值,而param表示在request.getParameter()中获取这个值,
  • 另外还可以写成property="*",会自动在request.getParameter中查找所有的跟属性名相同的参数进行赋值。

使用action只能够操作javabean,并且还不能操作复杂的对象,因此我们还需要更加强大的功能,比如EL表达式。
EL表达式

  • 这里可以看出,主要有两种形式a.b,a[b]
  • .能够适用于使用get方法得到属性值的时候。或者是从map中得到bkey所对应的值
  • []则能够用更多的适应性,a为bean的时候b为属性(需要加双引号),a为map的时候b为key,a为list或者是数组的时候b为下标,并且可以使字符串表示的下标
  • 如果使用[]取得map的值的时候,没有给key值加""会把其作为一个属性,然后在域中查找属性的值来作为Key。
  • 另外[]符号还能够嵌套使用,跟上面的意思差不多,[]中的值都会先试着转化成从域中取值。
  • 如果属性名中有.则不能够使用.符号来获取值了,只能使用[]的方式
  • 另外EL表达式中还能够使用+,-,eq.....等等运算符。

EL能够获取request,session等等域中的值,实际上范围比这个要大,能够取值的范围为:
其中包括了一些内置对象和属性:

  • 属性为page,request,session,application四个域中的属性。
  • 内置对象是EL自己实现的包含了request中对应的对象值的一些map。包括了:pageScope,requestScope,sessionScope,applicationScope,param,paramValues,header,headerValues,cookie,initParam。
  • 还有最后一个pageContext,与JSP中的pageContext相同,是一个javabean

EL语言除了使用属性和bean以外还能够调用方法,要实现这个功能,我们需要按照如下操作:
定义一个类,包含一个返回值不为null的static类型的方法。

然后编写tld文件,放到WEB-INF目录下。内容格式如下:

  • uri是在页面也用时所使用的索引。
  • name同样为页面调用时需要的内容。
  • 需要指定类的路径和方法名,方法中参数和返回值需要使用类的全路径。然后放到WEB-INF目录下。

在页面使用的时候
<%@ taglib prefix="myF" uri="myFunctions" %>
${myF:addOne("aaa") }
这样就能够调用自定义的方法了。

 

action tag除了操作属性以外还有一些其他的功能。
<jsp:include file="">
同样是引入页面但是与<@include >是不相同的。在讲指定的时候已经讨论过一次了,这里再次进行记录。

  • 指令的方式与把引入的页面直接写入到本页面的效果是相同的。
  • 使用<jsp:include >的时候会把请求发送到对应的JSP,然后得到返回结果之后继续进行操作。
  • 指令是在解释成servlet的时候进行的,而<jsp:include>是在运行的时候执行的,会编译成两个不同的servlet。
  • 因为<jsp:include>中的文件只能为jsp页面,它还能提供更多的功能,比如在<jsp:include 标签中使用<jsp:param name="name" value="">设置参数时,能够在include的jsp文件中,使用${param.name}获取到参数的值。


<jsp:forword page="/MyJsp.jsp">
会被翻译为request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);
forword执行的时候,会先把缓存进行清空,在使用forword前是不能够使用out.flush的,否则会出现错误。

 

<think>好的,用户问是否可以将JSP文件中的Java代码移出。首先,我需要回顾之前的对话,用户提供的JSP代码确实混合了大量的Java代码和HTML,这会导致维护困难和潜在的安全问题。用户可能希望改善代码结构,提升可维护性和安全性。 接下来,我需要确定用户的需求。他们可能希望遵循MVC模式,将业务逻辑和视图分离。这通常意味着使用Servlet处理业务逻辑,JSP仅负责展示。同时,用户可能关心如何具体实施,比如如何替换脚本片段,使用哪些设计模式或框架。 然后,我需要考虑用户可能的技能水平。他们可能对JSP有一定了解,但可能没有深入使用过现代Java Web框架。因此,回答需要提供具体的步骤和示例代码,同时解释好处,帮助他们理解如何操作。 接下来,我需要分析用户提供的代码中的Java部分。例如,代码中有很多业务逻辑处理,如获取会话属性、处理菜单信息、查询数据库等。这些都可以Servlet或后端控制器中。此外,JSP中的脚本片段可以用JSTL和EL表达式替代,减少Java代码的存在。 然后,我需要考虑如何结构化回答。首先指出可以移出的代码部分,然后分步骤说明如何重构,比如创建Servlet处理请求,使用JavaBean封装数据,利用JSTL和EL表达式,以及引入MVC框架。每个步骤需要给出具体例子,如将用户信息存储在模型类中,并在JSP中使用EL表达式显示。 同时,用户可能关心迁过程中需要注意的问题,比如如何保持会话管理、防止线程安全问题、处理异常等。需要提醒用户这些注意事项,并提供解决方案,比如使用Servlet过滤器处理异常,或者使用Spring的注解驱动开发。 最后,确保回答符合格式要求,包括提出相关问题。相关问题应涵盖用户可能进一步需要的信息,如MVC模式的好处、JSTL使用、框架推荐等。确保回答清晰、有条理,并提供足够的细节帮助用户实施迁。</think>可以将JSP中的Java代码移出,这是现代Web开发推荐的做法。以下是重构方案: ### 1. **Servlet处理业务逻辑** ```java @WebServlet("/main") public class MainServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 获取会话信息 HttpSession session = request.getSession(); String userId = (String) session.getAttribute("APP_USER"); // 2. 获取用户信息 List<Map<String, Object>> resultList = MenuDisp.getGyoumuAndKanriMenu(userId); UserInfo userInfo = new UserInfo(); userInfo.setName((String) resultList.get(0).get("氏名")); userInfo.setDepartment((String) resultList.get(0).get("所属")); // 3. 处理菜单数据 List<Menu> menus = new ArrayList<>(); for (Map<String, Object> map : resultList) { menus.add(new Menu( (String) map.get("メニュー順"), (String) map.get("メニュー名称"), (String) map.get("メニューID") )); } // 4. 设置请求属性 request.setAttribute("userInfo", userInfo); request.setAttribute("menus", menus); request.setAttribute("infoList", CommonMethod.getInformation("CM")); // 5. 转发到JSP request.getRequestDispatcher("/WEB-INF/views/main.jsp").forward(request, response); } } ``` ### 2. **创建JavaBean模型类** ```java public class UserInfo { private String name; private String department; // getters/setters... } public class Menu { private String order; private String name; private String id; // getters/setters... } ``` ### 3. **重构后的JSP页面(使用JSTL+EL)** ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!-- 用户信息展示 --> <dl> <dt>所属</dt> <dd>${userInfo.department}</dd> <dt>氏名</dt> <dd>${userInfo.name}</dd> </dl> <!-- 菜单渲染 --> <c:forEach items="${menus}" var="menu"> <c:if test="${menu.order == '6'}"> <div style="display:${menu.displayStyle}"> <a onclick="opensayibu('${menu.id}')"> <span>${menu.name}</span> </a> </div> </c:if> </c:forEach> <!-- 信息公告 --> <c:forEach items="${infoList}" var="info"> <tr> <td><span class="warning-icon" style="display:${info.priorityFlag ? '' : 'none'}">!</span></td> <td>${info.notice}</td> </tr> </c:forEach> ``` ### 4. **迁步骤建议** 1. **创建Servlet控制器**:将所有业务逻辑Servlet 2. **封装数据模型**:使用JavaBean替代直接操作Map 3. **使用JSTL标签**:替代所有<% %>脚本片段 4. **配置web.xml**:设置Servlet映射和JSP安全路径 5. **引入MVC框架**(可选):如Spring MVC或Struts2 ### 5. **重构优势** - 提升代码可维护性:业务逻辑与视图分离 - 增强安全性:避免直接暴露Java代码 - 提高可测试性:Servlet可进行单元测试 - 改善代码复用:JavaBean可在多个页面复用 - 符合现代开发规范:遵循MVC模式 ### 6. **注意事项** 1. 需要配置web.xml或使用@WebServlet注解 2. JSP至WEB-INF目录防止直接访问 3. 需要处理线程安全问题(Servlet是单例的) 4. 建议使用DAO模式处理数据库操作 5. 可结合过滤器处理公共逻辑(如登录验证)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值