Question

home.jsp

<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

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

inclure.jsp

<%=username%>

Cela donne une erreur disant que «nom d'utilisateur» n'est pas défini dans include.jsp, même si la portée du bean est l'application…

Était-ce utile?

La solution

Quant à votre problème, tout ce que vous déclarez localement en utilisant les scripts à l'ancienne est ne pas lié à un jsp:useBean. De plus, déclarer une variable Scriptlet locale est ne pas Visible dans les pages incluses, vous devez les mettre explicitement dans au moins la portée de la demande. Comme l'utilisation de scripts est un mauvaise pratique. Je recommande de l'oublier du tout.

Dans votre cas spécifique, créez simplement un réel Java Bean pour tenir les données. Autrement dit, une classe avec un constructeur par défaut (implicite) et des propriétés privées qui sont exposées par des getters / setters publics. Voici un exemple de base:

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Ensuite, vous pouvez utiliser une classe de servlet pour prétraiter les demandes. Vous pouvez utiliser des servlet doGet() Méthode pour cela.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    User user = new User();
    user.setName("Jitendra");
    request.setAttribute("user", user); // Store in request scope.
    request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}

Mapper ce servlet dans web.xml sur un url-pattern de par exemple /show. Ce servlet devrait alors être accessible par http://example.com/context/show et son doGet() serait exécuté immédiatement.

Puis modifiez / créez le fichier jsp show.jsp dans lequel vous placez /WEB-INF pour empêcher un accès direct (afin que les clients ne puissent pas y accéder par http://example.com/context/show.jsp mais sont "forcés" à appeler le servlet) avec la ligne suivante:

<p>User name: ${user.name}</p>

La ${user} fait référence à l'objet qui est associé à toute clé de demande / session / application d'attribut user. Cela fait dans les coulisses jspContext.findAttribute("user"). Comme le retourné User L'instance conforme la spécification Javabean, le ${user.name} invoquera le getName() Méthode sur le User Instance et EL affichera son résultat.

Oh, je devrais ajouter, tu fais ne pas besoin jsp:useBean Pour cela, le servlet a déjà créé et mis le haricot souhaité dans la portée.

Cela dit, je recommande de commencer par un tutoriel / livre JSP / servlet décent. Exemples:

J'espère que cela t'aides.

Autres conseils

Votre code est "mauvais" parce qu'un java.lang.String n'est pas vraiment un haricot. De manière significative, il n'a pas de méthode "définie" pour modifier son texte (c'est intentionnel, il est censé être immuable).

La façon dont vous accédez aux haricots est d'en déclarer un, puis d'utiliser ses propriétés (c'est-à-dire les noms derrière les méthodes get () et set ()) pour la modifier. Vous ne pouvez pas modifier directement l'instance de bean réelle, seulement ses valeurs.

Sur Tomcat 6, home.jsp est traduit par le code servlet:

java.lang.String username = null;
synchronized (application) {
  username = (java.lang.String) _jspx_page_context.getAttribute("username", 
                                                  PageContext.APPLICATION_SCOPE);
  if (username == null){
    username = new java.lang.String();
    _jspx_page_context.setAttribute("username", username,
                                                  PageContext.APPLICATION_SCOPE);
  }
}

username="Jitendra"; 

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
                                                 "include.jsp", out, false);

Bien que le comportement soit le même, le code exact généré dépend de l'implémentation du serveur d'applications.

La portée du local username la variable ne s'étend pas dans le servlet qui sera généré à partir de include.jsp. Vous ne définissez pas la valeur "jitendra" dans la portée de l'application, définissant uniquement la valeur de la variable locale.

Comme d'autres l'ont souligné, une chaîne immuable ne fait pas un très bon haricot.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top