【问题标题】:Servlet to JSP forward leads to jsp page but does not execute java code (only html)Servlet to JSP forward 导致jsp页面但不执行java代码(仅html)
【发布时间】:2014-09-22 06:39:34
【问题描述】:

我使用的系统包括 Jersey (1.18.1) 用于 REST Web 服务 + 自定义 servlet 来处理客户端请求和调用 Web 服务。我也在用FORM方法认证。

问题是在调用 Web 服务之后,servlet 转发s 然后到 index.jsp。在该 JSP 中,html/javascript 代码显示良好,但 java 代码未执行。我必须刷新页面 (F5) 以获取要执行的 java 代码 9 但随后会丢失请求/响应信息)。这种行为的原因可能是什么...?

这是我的 web.xml 的样子:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:sec="http://cxf.apache.org/configuration/security"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<display-name>AdminModule</display-name>
<!-- JERSEY 1.18.1 -->    
<servlet>
    <servlet-name>JerseySpringServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>my.package.restapi</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>MainController</servlet-name>
    <servlet-class>my.package.controller.MainController</servlet-class>
</servlet>
<servlet>
    <description>
    </description>
    <display-name>Logout</display-name>
    <servlet-name>Logout</servlet-name>
    <servlet-class>my.package.controller.Logout</servlet-class>
</servlet>
<servlet>
    <description>
    </description>
    <display-name>DefaultAction</display-name>
    <servlet-name>DefaultAction</servlet-name>
    <servlet-class>my.package.controller.DefaultAction</servlet-class>
</servlet>
<servlet>
    <description>
    </description>
    <display-name>CreateRole</display-name>
    <servlet-name>CreateRole</servlet-name>
    <servlet-class>my.package.controller.CreateRole</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>JerseySpringServlet</servlet-name>
    <url-pattern>/restapi/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>MainController</servlet-name>
    <url-pattern>/CMQAdmin</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>DefaultAction</servlet-name>
    <url-pattern>/DefaultAction</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>CreateRole</servlet-name>
    <url-pattern>/CreateRole</url-pattern>
</servlet-mapping>


<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin security manager</web-resource-name>
        <url-pattern>/index.jsp</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>role1</role-name>
        <role-name>role2</role-name>
        <role-name>role3</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin security manager</web-resource-name>
        <url-pattern>/DefaultAction</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>role1</role-name>
        <role-name>role2</role-name>
        <role-name>role3</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin security manager</web-resource-name>
        <url-pattern>/CMQAdmin</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>role1</role-name>
        <role-name>role2</role-name>
        <role-name>role3</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>


<!-- Define the Login Configuration for this Application -->
<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

<!-- Security roles referenced by this web application -->
<security-role>
    <role-name>role1</role-name>
</security-role>
<security-role>
    <role-name>role2</role-name>
</security-role>
<security-role>
    <role-name>role3</role-name>
</security-role>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

<welcome-file-list>
    <welcome-file>CMQAdmin</welcome-file>
</welcome-file-list>

</web-app>

jsp中的代码。当 servlet 转发后页面显示时,根本不执行任何 java 代码:

<%@ page import="org.json.*"%>
<%@ page import="java.io.*,java.util.*" %>

<html>

    <b>Cookies: ${cookie.username.value} </b>
<head>
<meta charset="utf-8">

<title>Admin</title>

<link rel="stylesheet" href="${pageContext.request.contextPath}/css/jquery.mobile-1.4.2.css" />
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" />
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/component.css" />
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min.js"></script>
<script src="${pageContext.request.contextPath}/js/cbpFWTabs.js"></script>


<script type="text/javascript">

$(document).ready(function() {

    <%
        if(!request.isUserInRole("1") && !request.isUserInRole("2") && !request.isUserInRole("3")) {
    %>
            <p>some html code AAA</p>       
    <%
        }
        else if(request.isUserInRole("1"))
        {
    %>
            <p>some html code BBB</p>
    <%  
        }
        else if(request.isUserInRole("2"))
        {
    %>  
            <p>some html code CCC</p>
    <%
        }
        else if(request.isUserInRole("3"))
        {
    %>  
            <p>some html code DDD</p>
    <%
        }
    %>

});

</script>
</head>
<body>

<div id="logo" class="logo">&nbsp;</div>
<div id="utils" class="utils">
    <div id="logout" class="logout">
        <form action="${pageContext.request.contextPath}/CMQAdmin" method="POST">
            <input type="hidden" name="action" value="logoutaction">
            <input type="submit" value="Logout" />
        </form>
    </div>
</div>
<div id="mainDiv" class="main">
    <div id="title" class="title">Admin Module</div>
    <div id="tabs" class="tabs">
        <nav>
            <ul>
                <%
                    if(request.isUserInRole("2") || request.isUserInRole("1")) {
                %>
                    <li><a href="#section-3" id="section-3-tab" class="icon-patients"><span>a</span></a></li>
                    <li><a href="#section-1" id="section-1-tab" class="icon-cfgclinics"><span>b</span></a></li>
                    <li><a href="#section-2" id="section-2-tab" class="icon-users"><span>c</span></a></li>
                    <li><a href="#section-4" id="section-4-tab" class="icon-patients"><span>d</span></a></li>
                    <li><a href="#section-5" id="section-5-tab" class="icon-cfgclinics"><span>e</span></a></li>
                <%
                    }
                    else if(request.isUserInRole("3")) {
                %>
                    <li><a href="#section-5" id="section-5-tab" class="icon-cfgclinics"><span>b</span></a></li>
                    <li><a href="#section-3" id="section-3-tab" class="icon-patients"><span>a</span></a></li>
                    <li><a href="#section-1" id="section-1-tab" class="icon-cfgclinics"><span>c</span></a></li>
                    <li><a href="#section-2" id="section-2-tab" class="icon-users"><span>d</span></a></li>
                    <li><a href="#section-4" id="section-4-tab" class="icon-patients"><span>e</span></a></li>
                <%
                    }
                %>


            </ul>
        </nav>
        <div id="menu" class="menu">
            <%
                if(request.isUserInRole("2")) {
            %>
                <section id="section-3">
                    <div id="getPatientInfos" class="button">
                        <a id="lnkGetPatientInfos"
                            class="ui-btn ui-icon-plus ui-btn-icon-left ui-corner-all ui-shadow">Get infos</a>
                    </div>
                    <div id="creditTokens" class="button">
                        <a id="lnkCreditTokens"
                            class="ui-btn ui-icon-plus ui-btn-icon-left ui-corner-all ui-shadow">Post info</a>
                    </div>
                    <div id="createPatient" class="button">
                        <a id="lnkCreatePatient"
                            class="ui-btn ui-icon-plus ui-btn-icon-left ui-corner-all ui-shadow">put info</a>
                    </div>
                    <div id="registerPatient" class="button">
                        <a id="lnkRegisterPatient"
                            class="ui-btn ui-icon-plus ui-btn-icon-left ui-corner-all ui-shadow">delete info</a>
                    </div>
                </section>
            <%
                }
                else if(request.isUserInRole("3")) {
            %>
                <section id="section-5">
                    <div id="IndiActivation" class="button">
                        <a id="lnkIndiActivation"
                            class="ui-btn ui-icon-plus ui-btn-icon-left ui-corner-all ui-shadow">get info</a>
                    </div>
                </section>
            <%
                }
                else if(request.isUserInRole("1")) {
            %>
                    <section id="section-3">
                    ...
                    </section>
            <%
                }
            %>
        </div>
        <!-- /menu -->
    </div>
    <!-- /tabs -->
    <div id="content" class="content">Click on any button on the
        left to load content in here.</div>
    <!-- /content -->
    <div id="info" class="info">&nbsp;</div>
</div>
<!-- /mainDiv -->
<script>
    new CBPFWTabs(document.getElementById('tabs'));
</script>
</body>
</html>

调用 web 服务(调用正常)然后转发回 index.jsp 的 servlet:

public class CreateRole extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Autowired
    private RoleFacade roleFacade;

    /**
     * Logger...
     */
    private static final Logger logger = Logger.getLogger(CreateRole.class.getName());

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        logger.info("CreateRole::processRequest");

        String createRole = "AdminModule/SaveOrUpdateRole";

        logger.info("CreateRole::rolename+description: " + rolename + " + " + description);

        // get user roles from web service
        String baseURL = https://localhost/AdminModule/restapi;

        Form form = new Form();
        form.add("rolename", rolename); 
        form.add("description", description);

        JerseyClient client = new JerseyClient(form, baseURL+createRole);
        ClientResponse clientResponse = client.post_Form(form);

        if(clientResponse.getStatus() == 200 || clientResponse.getStatus() == 201) {
            logger.info("ROLE [" + clientResponse.getEntity(String.class) + "] has been successfully created");

            // do whatever with response
            client.close();

            request.setAttribute("", request.getParameter("action"));

            this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
            return;
        }
        else {
            request.setAttribute("error", true);
            request.setAttribute("wrErrorMessage", "Could not create new role");
            RequestDispatcher r = this.getServletContext().getRequestDispatcher("/index.jsp");
            r.forward(request, response);
            return;
        }
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

}

【问题讨论】:

  • 除了${cookie.username.value},我在 index.jsp 中看不到 java 代码。还是您指的是进口?
  • 我写这行代码只是为了说明我至少应该在显示屏上看到“Cookies:...”,但我什么也没看到。其余的 html 打印正常。要我包含所有 index.jsp 代码吗?
  • 有一个不起作用的样本会很好

标签: java jsp rest servlets


【解决方案1】:

我认为您可能缺少 /script 上方 javascript 位的结束 }

script type="text/javascript">

。 . .

        <p>some html code DDD</p>
<%
    }
%>


/script>

BTW Scriptlet 已被弃用。我倾向于使用 Java 标准标记库 (JSTL) 和 bean。

http://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm

【讨论】:

  • 我的错误,'}' 确实在我的代码中。我将更新示例。
  • scriptlet 会导致这种行为吗?
  • 你能看看在某个文件夹中是否有一个 index_jsp.java 文件正在创建。查看预处理的代码可能会有所帮助。
  • 脚本 'if(request.isUserInRole("1"))' 的等效 jstl 代码是什么?
  • 另外,为了关闭这篇文章,我发现我使用的一个 JQuery Mobile 库正在复制我的主 div 并将属性 data-external-page 设置为“true”。这个 div 是考虑到的,但没有保存正确的信息……糟糕的调试时间……
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多