2013-07-27 98 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