在做項目的時候,有一個需求是將資料庫中的信息封裝到實體類返回到jsp界面 傳過來的參數只是實體類的id屬性,然後根據id屬性去查資料庫,事情就是這樣,然後 結果遇到很奇怪的事情,在jsp頁面中使用EL表達式取值,除了id欄位,其他都是NULL 先記錄結論: 分為兩種情況 一:方法參數use的引用值( ...
在做項目的時候,有一個需求是將資料庫中的信息封裝到實體類返回到jsp界面
傳過來的參數只是實體類的id屬性,然後根據id屬性去查資料庫,事情就是這樣,然後
結果遇到很奇怪的事情,在jsp頁面中使用EL表達式取值,除了id欄位,其他都是NULL
先記錄結論:
分為兩種情況
一:方法參數use的引用值(假設地址:0x0011)在Controller層使用中未發生改變
那麼在這個方法中預設有一個req.setAttribute("類名首字母小寫",use);
註意:預設意思這邊你寫不寫這個綁定在jsp頁面都是可以取值的, 綁定值是這邊的參數引用,綁定名是:類名首字母小寫
二:DispatcherServlet分析方法創建一個0x0011的對象賦給use, 方法在調用service層或者持久層時,因為接受調用的返回值而將use的引用值改變(假設改變為0x0022),那麼有以下的結果
根據反覆測試:在DispatcherServlet中有預設的req.setAttribute("類名首字母小寫",use);
註意這邊很關鍵:這邊綁定的use的地址是0x0011(我大膽猜測是在DispatcherServlet中綁定的)
根據spring框架執行流程分析知道:即使你再在controller中綁定"類名首字母小寫",這樣的綁定名,也會到DispatcherServlet中被覆蓋掉
我不知道講的清不清晰,大家隨便提問,筆者會用耐心去解釋這樣的結果,其次,如果有大牛能看懂spring源碼給我點提示,就更好不過了
表現層中主要代碼(其中lis是已經註入的Service)
@RequestMapping("/loginIn.do")
public String loginIn(User use, HttpServletRequest req) {
System.out.println(use);
System.out.println("userName:" + use.getUserName());
System.out.println("paddword:" + use.getPassword());
use = lis.toLoginIn(use);
System.out.println(use);
return "success";
}
Service層中主要代碼
@Service("loginInService")
public class LoginInServiceImpl implements LoginInService {
@Resource(name="loginInDAO")
private LoginInDAO lid;
@Override
public User toLoginIn(User user) {
user = lid.loginIn(user);
return user;
}
}
持久層主要代碼
@Repository("loginInDAO")
public class LoginInDAOImpl implements LoginInDAO {
@Override
public User loginIn(User user) {
user.setPassword("持久層");
return user;
}
}
實體類主要欄位(get/set省)
public class User implements Serializable{
private static final long serialVersionUID = -5298720181994382985L;
private String userName;
private String password;