2013-07-27 77 views
-1

我的要求是:表单提交应该触发LoginServlet,从中将用户名和密码传递给UserService.login。如果验证用户名和密码(如果语句正常),则应返回用户xml字符串。我需要使用Jaxb还是其他解析器?使用String builder是不错的方法?JAXRS,JAXB实现指南

我用字符串构建为:

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 i.e.Jose到用户界面。 我试着用String索引,不能得到确切的结果,因为用户名总是变化或者用户名长度总是变化的。

+2

为什么不用XML解析器代替解析文本索引 –

+0

为什么不使用DOM/SAX来处理XML? – fnt

回答

2

使用JAXB实现。

一些的参考文献有:

1>code geekers

2>techferry

3>vogella

4>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

首先,注意注释,XML解析器确实是这里正确的路。 但如果你想只为你的代码速战速决,所以在这里你走,这个片段将提取必要的信息:

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

首先,如果这是生成通过StringBuilder一个有效的XML的尝试,你的方法是相当有争议的。

另请参见您的问题的意见(通过Jigar Joshifnt)。

有许多API以编程方式构建XMl。就你而言,由于它是一个简短的文件,我建议DOM。其次,如果你沉迷于宽松的方法,并希望通过这种方法来构建伪xml,那么至少需要在初始化(或作为构造函数的参数)之后添加以下行:

validUser.append("<user>"); 

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

最后,为了 “解决” 您的问题,您可以使用:

String xml = validUser.toString(); 
System.out.println(
    xml.substring(
     xml.indexOf("<firstname>") + 11, xml.indexOf("</firstname>") 
    ) 
); 
+0

我可以使用JAXB代替DOM吗? – bekur

+0

那么通常使用[JAXB](http://docs.oracle.com/javase/tutorial/jaxb/intro/)将XML绑定到数据类,但是,如果您有数据,则可以使用任何绑定框架序列化成XML。 – Mena

+0

我的要求是:表单提交应该触发LoginServlet,从中将用户名和密码传递给UserService.login。如果验证用户名和密码(如果语句正常),则应返回用户xml字符串。这是否意味着,即字符串应返回意味着我需要创建字符串或我可以使用JAXB/DOM? – bekur