JSF的backing bean关联问题
今天上手写了一个超级超级简单的JSFpage, 被backing managed bean问题卡了两个小时,呼~终于搞定了。记录一下吧。
看oracle教程里的示例程序,对JSF里EL变量可以直接对应到java class,比如说FooBean类可以在JSF page里面通过#{fooBean}直接访问(此处注意大小写)。
我的xhmtl代码如下:
<h:body>
<h:form>
<h:inputText id="userName" title="Enter your user name:" value="#{userNameBean.userName}"></h:inputText>
<h:commandButton id="login" value="Login" action="result" />
</h:form>
</h:body>
我的类代码如下:
@Named
@SessionScoped
public class UserNameBean implements Serializable{
String userName;
public UserNameBean() {
this.userName = null;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
}
这么简单得不能再简单的代码居然运行报错。。。
刚开始报的错是jsf 2.2 - Target Unreachable, identifier “userNameBean” resolved to null in JSF.
好吧,应该是CDI没有正确map userNameBean到UserNameBean类。查了一下官方文档,这个default确实应该就是map到首字母大写的类名啊。
再试试把@Named改成@Named(“userName”), 在JSF里也改成#{userName.userName”), 居然通过了。
仔细想了一想,没道理啊。怎么可能一定要explicitly指定成其它的名字呢,太奇怪了。再回过去,居然deploy报错,非常莫须有的错:
nbproject\build-impl.xml:1045:尚未部署该模块 构建失败
网上查了一下资料,说要先check一下source有没有正确的被编译到正确的位置。
我的这个java类应该会把编译好的包放到这样的一个目录下:
C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes
奇怪的是这个目录下有两个文件夹:
-
C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes\ webapplication1
-
C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes\ webapplication
webapplication1是我之前创建的一个package的名字,后来全部移到webapplication包了,怎么会没有删除呢。我试着删除了webapplication1文件夹,运行正确!!
可是问题是,再一次clean build run,会再一次生成webapplication1文件夹。在项目目录里全局搜索了一下webapplication1,已经没有匹配了。会不会是netbeans IDE的缓存啥的还留有之前的错误名字呢,导致冲突呢?那我是不是应该用package的重命名(rename),而不是之前的移动(move to correct folder)呢?
按照这个思路,把现在package重命名为webapplication1,clean build run. 通过!! Double check一下build目录,没有多余的package生成,终于解决了!

浙公网安备 33010602011771号