我的要求是:表单提交应该触发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索引,因为用户名总是在变化或用户名长度总是变化的,因此无法获得准确的结果。
答案 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>")
)
);