我想创建一个带有本地化选项的登录屏幕来翻译名称,当我从默认英语更改为阿拉伯语时崩溃
这是faces.config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>ar</supported-locale>
</locale-config>
<resource-bundle>
<base-name>mypack.enar</base-name>
<var>msg</var>
</resource-bundle>
</application>
</faces-config>
ManagedBean
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
/**
*
* @author body
*/
@ManagedBean(name = "localize")
@RequestScoped
public class LocalizeMBean implements Serializable {
/**
* @return the countries
*/
public static Map<String, Object> getCountries() {
return countries;
}
/**
* @param aCountries the countries to set
*/
public static void setCountries(Map<String, Object> aCountries) {
countries = aCountries;
}
private String localeCode;
/**
* Creates a new instance of LocalizeMBean
*/
public void setLocaleCode(String localeCode) {
this.localeCode = localeCode;
}
public Map<String, Object> getCountriesInMap() {
return getCountries();
}
public String getLocaleCode() {
return localeCode;
}
private static Map<String, Object> countries;
static {
setCountries(new LinkedHashMap<String, Object>());
getCountries().put("English", Locale.ENGLISH); //label, value
getCountries().put("Arabic", Locale.UNICODE_LOCALE_EXTENSION);
}
public void countryLocaleCodeChanged(ValueChangeEvent e) {
String newLocaleValue = e.getNewValue().toString();
//loop country map to compare the locale code
for (Map.Entry<String, Object> entry : getCountries().entrySet()) {
if (entry.getValue().toString().equals(newLocaleValue)) {
FacesContext.getCurrentInstance()
.getViewRoot().setLocale((Locale) entry.getValue());
}
}
}
}
JSF页面
<h:head>
<title>My Login Page</title>
<h:outputStylesheet library="mycss" name="login-box.css"/>
</h:head>
<h:body>
<h:form>
<div style="padding: 100px 0 0 250px;">
<div id="login-box">
<H2>Login</H2>
My Login Screen
<br />
<h:selectOneMenu value="#{localize.localeCode}" onchange="submit();"
valueChangeListener="#{localize.countryLocaleCodeChanged}">
<f:selectItems value="#{localize.countriesInMap}" />
</h:selectOneMenu>
<br />
<div id="login-box-name" style="margin-top:20px;">
<h:outputLabel value="#{msg.namee}" />
</div>
<div id="login-box-field" style="margin-top:20px;">
<h:inputText styleClass="form-login" title="Username" value="" size="30" maxlength="2048" />
</div>
<div id="login-box-name">Password:</div><div id="login-box-field"><h:inputSecret styleClass="form-login" title="Password" value="" size="30" maxlength="2048" /></div>
<br />
<div class="login-box-options"><h:selectBooleanCheckbox value="1"/>Remember me<h:commandLink style="margin-left:30px;" value="Forget Password"/></div>
<br />
<br />
<h:commandButton styleClass="button"/>
</div>
</div>
</h:form>
</h:body>
</html>
我改变组合框时的异常
javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: /index.xhtml @29,118 value="": Illegal Syntax for Set Operation
at javax.faces.component.UIInput.updateModel(UIInput.java:853)
at javax.faces.component.UIInput.processUpdates(UIInput.java:735)
at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231)
at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.el.PropertyNotWritableException: /index.xhtml @29,118 value="": Illegal Syntax for Set Operation
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
at javax.faces.component.UIInput.updateModel(UIInput.java:818)
... 38 more
答案 0 :(得分:12)
请仔细阅读异常消息。答案就在那里。
javax.el.PropertyNotWritableException:/index.xhtml @ 29,118 value =“”:设置操作的非法语法
在第29行,/index.xhtml
的字符118您有value=""
。这不是EL值表达式的有效语法,它应该可以通过setter方法写入。
通常,您指定value属性,如value="#{bean.property}"
,其中bean具有getProperty()
和setProperty()
方法符合javabeans规范。
可能是这个:
<h:inputText styleClass="form-login" title="Username" value="" size="30" maxlength="2048" />
我不确定你为什么指定这样的值。这是完全错误的。您应该完全删除它
<h:inputText styleClass="form-login" title="Username" size="30" maxlength="2048" />
或将其绑定到有效的bean属性
<h:inputText styleClass="form-login" title="Username" value="#{someBean.userName}" size="30" maxlength="2048" />
请注意,此问题与更改JSF区域设置无有关。
无关,嵌套表单在HTML中为illegal,因此也在JSF中。您应该通过2个单独的表单拆分语言选择和用户登录。更改语言时,您不想提交登录数据。此外,您可能会发现此答案中的提示有助于如何正确更改JSF区域设置:Localization in JSF, how to remember selected locale per session instead of per request/view