如何将servlet输出包含到jsp文件中 [英] How include servlet output to jsp file

查看:91
本文介绍了如何将servlet输出包含到jsp文件中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Web应用程序中,我有一个包含一些信息的主页.该页面由servlet和相应的jsp文件创建. Web应用程序中的几乎所有其他页面必须包含与主页相同的信息以及一些附加信息.我不想复制代码,所以我想在其他jsp文件中使用主servlet的输出.以下是我尝试完成的简单示例.

In my web application I have a main page that contain some information. This page is created by servlet and corresponding jsp file. Almost all other pages in my web application must contain the same information as main page plus some addition information. I don't want dublicate code, so I want to use output of main servlet in other jsp files. Below is a simple example of what I try to accomplish.

这是 web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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">

    <servlet>
        <servlet-name>servlet1</servlet-name>
        <servlet-class>app.Servlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet1</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping> 

    <servlet>
        <servlet-name>servlet2</servlet-name>
        <servlet-class>app.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet2</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>     

</web-app>

这是 java 文件:

servlet1.java

package app;


import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Servlet1 extends HttpServlet {        

    @Override
    public void doGet(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException {                      

        request.setAttribute("servletAttribute", 1);

        RequestDispatcher view = request.getRequestDispatcher("/servlet1.jsp");      
        view.forward(request, response);
    }                                                                               
}

servlet2.java

package app;


import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Servlet2 extends HttpServlet {        

    @Override
    public void doGet(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException {                      

        request.setAttribute("servletAttribute", 2);

        RequestDispatcher view = request.getRequestDispatcher("/servlet2.jsp");      
        view.forward(request, response);
    }                                                                               
}

这是 jsp 个文件:

servlet1.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

servlet1

<%
    Integer servletAttribute = (Integer)request.getAttribute("servletAttribute");                   
    out.print("<br>servletAttribute:" + servletAttribute);
%>   

servlet2.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<jsp:include page="/servlet1" />

servlet2

<%
    Integer servletAttribute = (Integer)request.getAttribute("servletAttribute");                   
    out.print("<br>servletAttribute:" + servletAttribute);
%>   

因此servlet2.jsp必须显示servlet1的输出.它显示它,但不显示来自servlet2的附加信息.而且我在日志文件中收到此错误:

So servlet2.jsp must display output of servlet1. It display it, but it doesn/t display addition information from servlet2. And I get this error in Log file:

org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [servlet2] in context with path [/WebApplication3] threw exception [java.lang.IllegalStateException: Exception occurred when flushing data] with root cause
java.io.IOException: Stream closed

据我所知,出现此错误的原因是,当servlet2.jsp调用"/servlet1"时,servlet1向客户端发送了响应,而servlet2.jsp不再具有会话.

As I understant this error appears because when servlet2.jsp call "/servlet1" servlet1 sent response to client and servlet2.jsp doesn't have session anymore.

所以我的问题是-如何修正我的代码以完成我想要的?是否可以将某些servlet的输出包含到某些jsp文件中?如果可能的话,这是好事还是坏事?

So my question is - How can I fix my code to accomplish what I want? Is it possible to include output of some servlet to some jsp file? If it's possible, is it a good or bad practice?

推荐答案

在servlet2.jsp中:

In servlet2.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:include page="/servlet1" />

在servlet2.jsp中,您使用了jsp:include. 它包括servlet1响应的响应.

In servlet2.jsp, you have used jsp:include. It is including the response of the servlet1 response.

但是 servlet1 ,它将把响应转发到另一个jsp.这样就会发生异常.

But the servlet1, it is going to forward the response to another jsp. So that exception occurs.

为避免这种情况,在Servlet1类中应使用 view.include(request,response); 而不是 view.forward(request,response); .

To avoid this, in Servlet1 class should use view.include(request,response); instead of view.forward(request, response);.

package app;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Servlet1 extends HttpServlet {        

    @Override
    public void doGet(HttpServletRequest request, 
            HttpServletResponse response) 
            throws ServletException, IOException {                      

        request.setAttribute("servletAttribute", 1);

        RequestDispatcher view = request.getRequestDispatcher("/servlet1.jsp");      
        view.include(request, response);
    }                                                                               
}

这篇关于如何将servlet输出包含到jsp文件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆