-1

私の要件は次のとおりです。フォームの送信は、ユーザー名とパスワードが UserService.login に渡される LoginServlet をトリガーする必要があります。ユーザー名とパスワードが検証された場合 (if ステートメントに問題がない場合)、ユーザー xml 文字列が返されます。Jaxb やその他のパーサーを使用する必要がありますか? Stringビルダーを使用するのは良いアプローチですか?

Stringビルダーを次のように使用しました:

StringBuilder validUser = new StringBuilder();  
validUser.append("<username>");
validUser.append(username);
validUser.append("</username>");
validUser.append("<firstname>");
validUser.append("Jose");
validUser.append("</firstname>");
validUser.append("<lastname>");
validUser.append("Tom");
validUser.append("</lastname>");
validUser.append("</user>");
String result = validUser.toString();

上記の文字列、つまり結果から、UI に firstName ieJose を取得/表示する必要があります。ユーザー名が常に変更されるか、ユーザー名の長さが常に変化するため、正確な結果を取得できませんでした。

4

3 に答える 3

2

まず最初に、コメントに注意してください。XML パーサーは確かに正しい方法です。しかし、コードの簡単な修正だけが必要な場合は、このスニペットで必要な情報を抽出できます。

Matcher matcher =  Pattern.compile("<firstname>(.*?)</firstname>").matcher(result);
matcher.find();
System.out.println(matcher.group(1));
于 2013-07-27T20:52:47.823 に答える
2

JAXB 実装を使用します。

参照の一部は次のとおりです。

1>コードオタク

2>テックフェリー

3>ヴォゲラ

4> Java論文

String USER_DETAILS_XML = "./user-details.xml";
String USER_ERROR_XML = "./user-error.xml";

    public String login(String username, String password)
                throws JAXBException, PropertyException, FileNotFoundException {        
                    User user = new User();
            InvalidUser invalidUser = new InvalidUser();

            if ((username !=null && password !=null)) {
                user.setUserName(username);
                user.setFirstName("Jose");
                user.setLastName("Tom");

                JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                marshaller.marshal(user, System.out);
                marshaller.marshal(user,new File(USER_DETAILS_XML));

                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                User userResult = (User) jaxbUnmarshaller.unmarshal(new FileReader(
                        USER_DETAILS_XML));
                return userResult.getFirstName();
            }
            else{
                invalidUser.setCode(400);
                invalidUser.setMessage("something wrong here");
                JAXBContext jaxbContext = JAXBContext.newInstance(InvalidUser.class);
                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                marshaller.marshal(invalidUser, System.out);
                marshaller.marshal(invalidUser, new File(USER_ERROR_XML));

                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                InvalidUser invalidUserResult = (InvalidUser) jaxbUnmarshaller.unmarshal(new FileReader(USER_ERROR_XML));
                return invalidUserResult.getMessage();
            }
}

ユーザー.java:

@XmlRootElement(name = "user")
@XmlType(propOrder = { "userName", "firstName", "lastName" })
public class User{

    private String userName;
    private String firstName;
    private String lastName;
    ....get/set

}

無効なユーザー.java:

@XmlRootElement(name = "status")
@XmlType(propOrder = { "code", "message" })
public class InvalidUser {
    private int code;
    private String message;
    ...set/get
}
于 2013-07-27T23:45:53.613 に答える
1

まず、これが を介して有効な XML を生成する試みである場合StringBuilder、あなたのアプローチは非常に議論の余地があります。

質問へのコメントも参照してください ( Jigar Joshiおよびfntによる)。

プログラムで XML を構築するための API は多数あります。あなたの場合、短いドキュメントなので、DOMをお勧めします。

第二に、緩いアプローチにふけり、それでもこの方法論で疑似 xml を構築したい場合は、少なくともStringBuilder初期化の後に (またはコンストラクターへの引数として)次の行を追加する必要があります。

validUser.append("<user>");

また

StringBuilder validUser = new StringBuilder("<user>");

最後に、問題を「解決」するには、次を使用できます。

String xml = validUser.toString();
System.out.println(
    xml.substring(
        xml.indexOf("<firstname>") + 11, xml.indexOf("</firstname>")
    )
);
于 2013-07-27T20:55:17.273 に答える