Почему мой Struts 1 I18N не может найти файлы свойств? - PullRequest
0 голосов
/ 15 ноября 2018

Я реализую базовое веб-приложение Struts 1 i18n, и ожидаемый результат (multi-language.jsp) должен быть таким же, как на скриншоте ниже:

p.s. Мой проект доступен только на английском и немецком языках, файлы свойств названы Common.properties & Common_de.properties соответственно.

enter image description here

Однако мое приложение не смогло найти файлы свойств в проекте (расположенном в src/properties/$Common_CountryCode.properties$). Когда я нажимаю URL-адрес приложения, в консоли появляются некоторые предупреждения:

Nov 15, 2018 4:45:20 PM org.apache.struts.util.PropertyMessageResources loadLocale
WARNING:   Resource properties/Common_en_US.properties Not Found.
Nov 15, 2018 4:45:20 PM org.apache.struts.util.PropertyMessageResources loadLocale
WARNING:   Resource properties/Common_en.properties Not Found.

Но дело в том, что в моем проекте нет даже этих двух файлов свойств. И снова, когда я нажимаю на предпочитаемый язык, консоль выскакивает некоторую информацию (не уверена, имеет ли она значение), и браузер отображает 404--Not Found:

Nov 15, 2018 4:50:00 PM org.apache.struts.chain.ComposableRequestProcessor init
INFO: Initializing composable request processor for module prefix ''
Nov 15, 2018 4:50:01 PM org.apache.struts.chain.commands.servlet.CreateAction createAction
INFO: Initialize action of type: action.Action

Это мой struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" 
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<struts-config>

    <form-beans>
        <form-bean
            name="userForm"
            type="form.Form"/>

    </form-beans>

    <action-mappings>

        <action
            path="/LoginPage"
            type="org.apache.struts.actions.ForwardAction"
            parameter="/WebRoot/multi-language.jsp"/>

        <action
            path="/Submit"
            type="action.Action"
            name="userForm"
            validate="true"
            input="/WebRoot/multi-language.jsp"
            >
            <forward name="success" path="/WebRoot/multi-language.jsp"/>
        </action>

        <action
            path="/Locale"
            type="action.Action"
            name="userForm"
            parameter="method"
            validate="false"
            >
            <forward name="success" path="/WebRoot/multi-language.jsp"/>
        </action>

    </action-mappings>

    <message-resources
        parameter="properties.Common" />

</struts-config>

multi-language.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>multi-language.jsp</title>
</head>
<body>
<h1><bean:message key="label.common.message" /></h1>

<html:messages id="err_name" property="common.username.err">
<div style="color:red">
    <bean:write name="err_name" />
</div>
</html:messages>

<html:messages id="err_password" property="common.password.err">
<div style="color:red">
    <bean:write name="err_password" />
</div>
</html:messages>
<br />
<br />

<html:link page="/Locale.do?method=english">English</html:link>
<html:link page="/Locale.do?method=german">German</html:link>


<html:form action="/Submit">
<br />
<bean:message key="label.common.username" /> : <html:text property="username" />
<br />
<br />
<bean:message key="label.common.password" /> : <html:text property="password" />
<br />
<br />

<html:submit><bean:message key="label.common.button.submit" /></html:submit>
</html:form>


</body>
</html>

Action.java (контроллер)

package action;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

public class Action extends DispatchAction {

    public ActionForward german(ActionMapping mapping,ActionForm form,
            HttpServletRequest request,HttpServletResponse response) 
        throws Exception {

            request.getSession().setAttribute(
                    Globals.LOCALE_KEY, Locale.GERMAN);

            return mapping.findForward("success");
        }

        public ActionForward english(ActionMapping mapping,ActionForm form,
            HttpServletRequest request,HttpServletResponse response) 
        throws Exception {

            request.getSession().setAttribute(
                    Globals.LOCALE_KEY, Locale.ENGLISH);

            return mapping.findForward("success");
        }
}

Form.java (просмотр)

package form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

public class Form extends ActionForm{
    String username;
    String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public ActionErrors validate(ActionMapping mapping,
        HttpServletRequest request) {

        ActionErrors errors = new ActionErrors();

        if( getUsername() == null || ("".equals(getUsername())))
        {
           errors.add("common.username.err",
            new ActionMessage("error.common.username.required"));
        }

        if( getPassword() == null || ("".equals(getPassword())))
        {
           errors.add("common.password.err",
            new ActionMessage("error.common.password.required"));
        }

        return errors;
    }

    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        // reset properties
        username = "";
        password = "";
    }
}

Прошу прощения, если здесь слишком много кода, просто хочу прояснить сценарий.

1 Ответ

0 голосов
/ 17 ноября 2018

Конфигурация в вашем struts-config.xml должна выглядеть примерно так:

  <message-resources parameter="Common" null="true" />

Затем Struts 1 (Java) пытается определить ResourceBundle Inheritance для вашей локали, используя Common_en_US,Common_en и Common.В конце концов, если пакет не найден, выдается MissingResourceException.

Класс, отвечающий за загрузку ресурсов, org.apache.struts.util.PropertyMessageResources заменяет "."в

    <message-resources parameter="properties.Common" />

с "/", приводящим к предупреждению Свойства ресурса / Common_en.properties не найдены , так как ".properties" добавляется автоматически, а "properties /" добавляется вдорожка.

Если ваши файлы находятся где-то на пути к классам, например WEB-INF/classes, Struts сможет найти их без предупреждения после того, как вы исправите конфигурацию.

...