JAXRS,JAXB实现指南

时间:2013-07-27 20:33:42

标签: java xml

我的要求是:表单提交应该触发LoginServlet,用户名和密码从该服务器传递给UserService.login。如果验证用户名和密码(如果语句正常),则应返回用户xml字符串。我需要使用Jaxb或任何其他解析器吗?使用String builder是一种很好的方法吗?

我使用String builder作为:

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();

从上面的字符串中得到结果,我需要获取/显示firstName ieJose到UI。 我尝试使用String索引,因为用户名总是在变化或用户名长度总是变化的,因此无法获得准确的结果。

3 个答案:

答案 0 :(得分:2)

首先,要注意评论,XML解析器确实是走到这里的正确方法。 但是,如果您只想快速修复代码,那么请在此处,此代码段将提取必要的信息:

Matcher matcher =  Pattern.compile("<firstname>(.*?)</firstname>").matcher(result);
matcher.find();
System.out.println(matcher.group(1));

答案 1 :(得分:2)

使用JAXB实现。

一些参考文献是:

1&GT; code geekers

2 - techferry

3&GT; vogella

4&GT; java papers

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();
            }
}

User.java:

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

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

}

InvalidUser.java:

@XmlRootElement(name = "status")
@XmlType(propOrder = { "code", "message" })
public class InvalidUser {
    private int code;
    private String message;
    ...set/get
}

答案 2 :(得分:1)

首先,如果这是尝试通过StringBuilder生成有效的XML,那么您的方法是值得商榷的。

另请参阅对您问题的评论( Jigar Joshi fnt )。

有很多API可以通过编程方式构建XMl。在您的情况下,因为它是一个简短的文档,我建议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>")
    )
);