JQuery无法解析JSP EL

JQuery not able to parse JSP EL

本文关键字:JSP EL JQuery      更新时间:2023-09-26

我的JQuery process.js文件无法解析JSP EL表达式。我只是想在JSP中显示一个List对象。如果我只是使用${students}对象,它正确地工作,并显示所有的学生,但如果我试图使用JQuery来显示它,它只是显示${students}字符串,因为它是在浏览器中。我在web.xml中禁用了脚本,并使用EL显示数据。

有其他的方法来处理这个吗?

浏览器输出:

Hello World from JQuery!
From JSP:  
[Student{id=1, name=Jack}, Student{id=2, name=Jill}]
From JQuery:
${students}

home.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
        <script src="js/process.js"></script>
    </head>
    <body>
        <div id="mydiv"></div>
        <h2>From JSP: <p/> ${students}</h2>
        <h3>From JQuery: <div id="studentDiv"></div></h3>
    </body>
</html>

process.js

$(document).ready(function () {
    //static message
    var msg = "Hello World from JQuery!";
    $("#mydiv").text(msg);
    //dynamic message
    var students = '${students}';
    $("#studentDiv").text(students);
});

HomePageController.java

@WebServlet(name = "HomePageController", urlPatterns = {"/homePageController.do"})
public class HomePageController extends BaseController {
    private static final String VIEW_NAME = "/jsp/home.jsp";
    @Override
    public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Student> students = getAllStudents();
        request.setAttribute("students", students);
        request.getServletContext().getRequestDispatcher(VIEW_NAME).forward(request, response);
    }
    private List<Student> getAllStudents() {
        List<Student> students = new ArrayList<>();
        Student student1 = new Student(1, "Jack");
        Student student2 = new Student(2, "Jill");
        students.add(student1);
        students.add(student2);
        System.out.println("students = " + students);
        return students;
    }
}

BaseController.java

public abstract class BaseController extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
    public abstract void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

web . xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!-- Disable scripting -->
    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <scripting-invalid>true</scripting-invalid>
        </jsp-property-group>
    </jsp-config>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

EL表达式仅由JspServlet (*.jsp)和FacesServlet (*.xhtml)求值。但是,默认情况下,.js文件不由这些servlet处理,而是由容器内置的默认servlet处理。这不是jQuery的错。这都是你的错。

一个快速的技巧是将*.js URL模式添加到JspServlet映射中。在确定了容器的内置JspServlet(它位于Tomcat中并克隆了jsp)的名称后,将以下条目添加到web应用程序的web.xml中:
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

替代:

  1. 将其重构为webservice调用,并使用$.getJSON()
  2. 打印为HTML5 data属性并使用$.data()
  3. 在包含所需脚本之前,将其作为内联脚本变量打印到JSP中。