Frage zu URLs in JSF

BaseBallBatBoy

Erfahrenes Mitglied
Hi!

Ich hab ne Frage zu den URLs in JSF.
Angenommen man hat zB die Pages Home.jsp und Hallo.jsp (welche in der URL ja als jsf angezeigt werden).
Nun befindet man sich auf Hallo.jsf, aber in der URL steht noch http://localhost:8080/JSF-Page/Home.jsf geschrieben.
Nun die Frage: lässt sich das auch ändern, damit die korrekte URL der aktiven Site angezeigt wird (in diesem Fall http://localhost:8080/JSF-Page/Hallo.jsf)? Ist nämlich für User die zB Bookmarks brauchen möchten ziemlich doof. Hat es evtl damit zu tun, dass JSF nur Post kennt?

Gruss
BBBB
 
Hi,
du benutzt ja bestimmt eine action um von home.jsf -> hallo.jsf zu gelagen. Schreib in die Action (Navigation-case) redirect rein dann ändert sich auch die URL.:

PHP:
<navigation-rule>
<navigation-case>
   <from-outcome>goToHallo</from-outcome>
   <to-view-id>/pages/hallo.jsf</to-view-id>
   <redirect/>
  </navigation-case>
 </navigation-rule>
 
Hallo!

Ok, das mit dem Adresspfad klappt nun! Danke!

ABER: redirect hat ja zur folge, dass auf eine andere JSF Site weitergeleitet wird. Und so das Bean nicht ausgeführt wird (korrigiert micht wenn ich falsch liege).

ich hab nun aber zB folgenden input (um das quadrat einer zahl auszurechenen):
<h:inputText id="number" value="#{myBean.squareNumber}" required="true" />

ist nun redirect aktiviert, ändert sich der pfad erfolgreich von zB eingabe.jsf auf resultat.jsf, aber da das Bean überprungen wurde, existiert kein output in resultat.jsf.

gibt es dazu auch eine lösungsvariante? So dass pfade angepasst und parameter übergeben werden?
 
Ich hab dein Beispiel mal fix durchgespielt (sehr vereinfacht). Probier das hier mal aus:

Input.jsp:
PHP:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
	<head>
		<title></title>
	</head>
	<body>
		<f:view>
			<h:form>
			<h:outputText value="Nummer"/>
			<h:inputText value="#{testBean.number}"/>
			<h:commandButton action="success" value="schleife Nummer ins andere JSP"/>
	 		</h:form>
		</f:view>
	</body>	
</html>


Resultat.jsp:
PHP:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
	<head>
		<title></title>
	</head>
	<body>
		<f:view>
			<h:outputText value="Weitergereichte Zahl: "/>
			<h:outputText value="#{testBean.number}"/>
		</f:view>
	</body>	
</html>


Request-scope Bean mit Name (ist nur eine Variable mit getter+setter, daher verzichte ich auf Source Code :))

faces-xml:
PHP:
<navigation-rule>
  <from-view-id>/pages/general/input.jsp</from-view-id>
  <navigation-case>
   <from-outcome>success</from-outcome>
   <to-view-id>/pages/general/resultat.jsp</to-view-id>
   <redirect/>
  </navigation-case>
 </navigation-rule>

Ich werde weitergeleitet und die Zahl bleibt erhalten.
 
Ich hab dein Beispiel mal fix durchgespielt (sehr vereinfacht). Probier das hier mal aus:

Erst mal Danke, dass du dir die Zeit nimmst!
Und nun zum Thema: ich hab mal schnell dein Beispiel übernommen und bei mir ist der output immmer:

Weitergereichte Zahl: 0

Egal was man eingibt (keine Sorge, ich weis wie man getter/setter schreibt ;) ).

Und du sagst, dass es bei dir klappt? Hm.. interessant. Na dann wirds wohl anderswo liegen.
Mal zu meinen SysParametern: Ich brauche Tomcat 5.5.2, Tomahawk 1.1.3, MyFaces 1.1.4 (api & impl), JSLT 1.1.0. Und wie sieht das bei dir aus?

Oder evtl. den web.xml?

thanks in advance
 
Ich nutze Exadel Studio Pro mit der JSF-Sun 1.1 (Version) und Tomcat 5.5. Desweitern nutze ich RichFaces und ajax4jsf, was aber hier keine Rolle spielen dürfte :)

meine web.xml ist sehr unspektakulär:
PHP:
<?xml version="1.0"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>daa</display-name>
 <context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
 </context-param>
 <listener>
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
 </listener>
 <!-- Faces Servlet -->
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <!-- Faces Servlet Mapping -->
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern>
 </servlet-mapping>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>

 <context-param> 
  <param-name>org.ajax4jsf.SKIN</param-name> 
  <param-value>classic</param-value> 
 </context-param> 

 <filter> 
  <display-name>Ajax4jsf Filter</display-name> 
  <filter-name>ajax4jsf</filter-name> 
  <filter-class>org.ajax4jsf.Filter</filter-class> 
 </filter> 

 <filter-mapping> 
  <filter-name>ajax4jsf</filter-name> 
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
 </filter-mapping>
 
<filter>
<filter-name>AuthorizationFilter</filter-name>
<filter-class>filter.AuthorizationFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>AuthorizationFilter</filter-name>
<url-pattern>/pages/protected/*</url-pattern>
</filter-mapping>
</web-app>

Den Filter und die Ajax Sachen brauchst du net. Ansonsten würde ich mal den Cache vom Browser löschen oder andere Browser ausprobieren. Evtl liegt es ja dadran :) (ich arbeite auch erst seit 3 Wochen mit JSF und bin daher auch nur "begrenzt" eine Hilfe)

Ansonsten stöber mal im offiziellen JSF Forum von SUN rum: http://forum.java.sun.com/forum.jspa?forumID=427

Cu
Alex
 
ok, war wohl was anderes:
hab nämlich mal (so aus lauter 'verzweiflung') den <managed-bean-scope> von request auf session geändert und nun klappt die übergabe der values.

aber wie das halt so ist, ist ein weiterer fehler aufgetreten:
ich brauche auch locals
dh. per klick auf eine landesflagge ändert sich die sprache (brauche propertys). aber nun ratet mal: funktioniert nun natürlich nicht mehr... sondern bleibt immer auf der defalut locale

mal ein paar snippets:

LocaleBean.java
PHP:
package com.myfaces;

import java.util.Locale;
import javax.faces.context.FacesContext;

public class LocaleBean {
	private String german;
	private String english;
	
	public String getEnglish() {
		FacesContext context = FacesContext.getCurrentInstance();
	    context.getViewRoot().setLocale(Locale.ENGLISH);
	    return null;
	}
	public void setEnglish(String english) {
		this.english = english;
	}
	public String getGerman() {
		FacesContext context = FacesContext.getCurrentInstance();
	    context.getViewRoot().setLocale(Locale.GERMAN);
	    return null;
	}
	public void setGerman(String german) {
		this.german = german;
	}	
}

faces-config
PHP:
	<application>
		<locale-config>
			<default-locale>de</default-locale>
			<supported-locale>en</supported-locale>
		</locale-config>
		<message-bundle>com.myfaces.msg</message-bundle>
	</application>
	<managed-bean>
		<managed-bean-name>loc</managed-bean-name>
		<managed-bean-class>
			com.myfaces.LocaleBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

flaggen in der jsf page
PHP:
					<h:commandLink immediate="true" action="#{loc.getGerman}">
						<h:graphicImage value="img/flags/de.jpg" />
					</h:commandLink>
					<h:commandLink immediate="true" action="#{loc.getEnglish}">
						<h:graphicImage value="img/flags/en.jpg" />
					</h:commandLink>

könnt ihr da schon was erkennen, oder soll ich noch mehr posten?
 
also: ich habs!
und ich denke ich poste mal die (beispiel-)lösung, falls mal jemand das gleiche problem haben sollte. schonmal viel erfolg damit! (falls ihrs nicht eh schon wusstet...)

mit dem folgenden code ist nun das möglich:
- bei einem wechsel auf eine andere page wird die korrekte seite in browser angezeigt(url adress)
- locale changes werden auf einer 'neuen' seite sofort ausgeführt dh. beim seitenwechsel das korrekte properties geladen
- trotz redirect gehen informationen aus den beans nicht verloren (-> session)

Blank.java
PHP:
package de.jsfpraxis.blank;

public class Blank {
	
	private int eingabe;
	private int quadrat;

	public Blank() {
		super();
	}

	public String action() {
		quadrat = eingabe * eingabe;
		return "success";
	}

	public int getEingabe() {
		return eingabe;
	}

	public void setEingabe(int eingabe) {
		this.eingabe = eingabe;
	}

	public int getQuadrat() {
		return quadrat;
	}

	public void setQuadrat(int quadrat) {
		this.quadrat = quadrat;
	}
}

Locale.java
PHP:
package de.jsfpraxis.blank;

public class Locale {
	
	private java.util.Locale locale = java.util.Locale.GERMAN;

	public Locale() {
		super();
	}

	public String deutsch() {
		locale = java.util.Locale.GERMAN;
		return null;
	}

	public String englisch() {
		locale = java.util.Locale.ENGLISH;
		return null;
	}

	public String franzoesisch() {
		locale = java.util.Locale.FRANCE;
		return null;
	}
	
	public java.util.Locale getLocale() {
		return locale;
	}
}

messages.properties
PHP:
welcome = Deutsch

messages_en.properties
PHP:
welcome = Englisch

messages_fr.properties
PHP:
welcome = Französisch

index.jsp
PHP:
<%@ page session="false" contentType="text/html;charset=utf-8"%>
<% response.sendRedirect("pages/first-page.jsf"); %>

first-page.jsp
PHP:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=UTF-8">
<title>Blank</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<f:view locale="#{localeHandler.locale}">
	<f:loadBundle basename="messages" var="msg"/>
	<h:form>
		<h:panelGrid columns="1">
			<h:outputText value="#{view.locale}" />
			<h:outputText value="#{msg.welcome}" />
			<h:panelGroup>
				<h:outputText value="Zu quadrierende Zahl:" />
				<h:inputText id="eingabe" value="#{blankHandler.eingabe}" />
			</h:panelGroup>
			<h:commandButton value="Quadrieren" action="#{blankHandler.action}" />
			<h:commandButton value="deutsch" action="#{localeHandler.deutsch}" />		
			<h:commandButton value="englisch" action="#{localeHandler.englisch}" />		
			<h:commandButton value="französisch" action="#{localeHandler.franzoesisch}" />		
		</h:panelGrid>
	</h:form>
</f:view>
</body>
</html>

second-page.jsp
PHP:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=UTF-8">
<title>Blank</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<f:view locale="#{localeHandler.locale}">
	<f:loadBundle basename="messages" var="msg"/>
	<h:form>
		<h:outputText value="#{view.locale}" />
		<h:outputText value="#{msg.welcome}" />
		<h:outputText value="Das Quadrat ist #{blankHandler.quadrat}" />
	</h:form>
</f:view>
</body>
</html>

style.css
PHP:
body {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    font-weight: normal;
    text-align: center;
    color: #000000;
    background-color: #dddddd;
}

faces-config.xml
PHP:
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>

	<application>
		<locale-config>
			<default-locale>de</default-locale>
			<supported-locale>de</supported-locale>
			<supported-locale>en</supported-locale>			
			<supported-locale>fr</supported-locale>			
		</locale-config>
	</application>


	<navigation-rule>
		<from-view-id>/pages/first-page.jsp</from-view-id>
		<navigation-case>
			<from-outcome>success</from-outcome>
			<to-view-id>/pages/second-page.jsp</to-view-id>
			<redirect/>
		</navigation-case>
	</navigation-rule>

	<managed-bean>
		<managed-bean-name>blankHandler</managed-bean-name>
		<managed-bean-class>
			de.jsfpraxis.blank.Blank
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

	<managed-bean>
		<managed-bean-name>localeHandler</managed-bean-name>
		<managed-bean-class>
			de.jsfpraxis.blank.Locale
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
</faces-config>

web.xml
PHP:
<?xml version="1.0"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/faces-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>

    <!-- Faces Servlet -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup> 1 </load-on-startup>
    </servlet>
    <!-- Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    
</web-app>

ps: vielen dank an herrn prof. dr. bernd müller, dem autor von java server faces - ein arbeitsbuch für die praxis. hat mir echt weitergeholfen!
 

Neue Beiträge

Zurück