Jakarta ee 如何将请求参数输入查询条件?
我已经阅读了关于JSF2和Weld示波器的所有资料。我想我已经读了巴卢斯写的关于这个主题的几乎所有东西,但我仍然无法理解这一点。我不想让你们认为我不是一个人努力想得到这个 我有一个非常简单的应用程序与搜索页面和结果页面。真正的应用程序比这个测试应用程序大得多,大约有20个参数。有两个RequestScope bean,一个支持搜索,另一个支持结果。有一个EJB接收输入,创建查询并将匹配实体的列表返回给结果 我有一个问题和一个问题。问题是我试图从搜索结果中获取参数值的尝试不起作用。我经常看到这种模式被使用,但我试图让它发挥作用却失败了 问题是。。。。将参数从搜索页面获取到EJB的最佳方法是什么,这些参数将在EJB中用作查询的一部分。我应该是从EJB访问请求参数映射的abel吗?我试过了,但没有成功——不确定这是我正在做的事情,还是这根本不可能。这个EJB应该是有状态的还是无状态的 Search.xhtmlJakarta ee 如何将请求参数输入查询条件?,jakarta-ee,jsf-2,ejb,cdi,Jakarta Ee,Jsf 2,Ejb,Cdi,我已经阅读了关于JSF2和Weld示波器的所有资料。我想我已经读了巴卢斯写的关于这个主题的几乎所有东西,但我仍然无法理解这一点。我不想让你们认为我不是一个人努力想得到这个 我有一个非常简单的应用程序与搜索页面和结果页面。真正的应用程序比这个测试应用程序大得多,大约有20个参数。有两个RequestScope bean,一个支持搜索,另一个支持结果。有一个EJB接收输入,创建查询并将匹配实体的列表返回给结果 我有一个问题和一个问题。问题是我试图从搜索结果中获取参数值的尝试不起作用。我经常看到这种模
<html>
<h:head></h:head>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Hostname" />
<h:inputText value="#{deviceSearch.hostname}" />
</h:panelGrid>
<h:commandButton action="#{deviceSearch.navigate('devices')}"
value="Devices Page">
<f:param name="hostname" value="#{deviceSearch.hostname}" />
</h:commandButton>
<h:button value="Reset" immediate="true" type="reset" />
</h:form>
</html
DeviceResult.java
@Named
@RequestScoped
public class DeviceResult {
@Inject DeviceService deviceListService;
String hostname;
public void init(){
deviceList = deviceListService.fetchDevices(hostname);
}
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
// Results
List<Devices> deviceList = new ArrayList<Devices>();
public List<Devices> getDeviceList() {
deviceList = deviceListService.fetchDevices(hostname);
return deviceList;
}
}
DeviceService.java
@Stateful
public class DeviceService {
@PersistenceContext
EntityManager em;
public DeviceService() {
}
String hostname;
List<Devices> devicesList = new ArrayList<Devices>();
@SuppressWarnings("unchecked")
public List<Devices> fetchDevices(String hostname) {
Query qry = em.createQuery("SELECT d FROM Devices d WHERE d.name=:name");
qry.setParameter("name", hostname);
devicesList = qry.getResultList();
return devicesList;
}
}
也许您应该使用会话范围的bean或会话范围的bean来保存搜索结果。此外,在搜索表单中不需要param标记。文本输入绑定到deviceSearch.hostName这一事实足以确保在支持bean中设置属性。当用户提交表单时,setHost setter将被自动调用。此外,您的导航方法非常奇怪,似乎不必要。导航应该通过返回bean操作的结果来处理,该结果引用Navigation.xml文件中的条目!如果你买了一本书,从一开始就花一天时间阅读,所有这些东西都会更有意义。如果你在互联网上乱七八糟地阅读随机信息,我向你保证,事情对你来说仍然会很混乱。导航方法在整个即将推出的应用程序中更有意义,因为在这个应用程序中,除了一个结果之外,还有更多的可能性@jahroy我相信你对这本书的看法是正确的,你也知道在互联网上蹦蹦跳跳的陷阱。我真正喜欢的是一门课——我在那里比在阅读中学到的好得多,而且学得也快得多,但我个人负担不起,我的雇主也不会赞助,因为java web app开发不是我团队的实际任务。我推荐。你可以在那里免费阅读。至少看看导航部分。。。谁知道呢,也许修复你的导航会修复你的其他一些问题。事实上,我昨天有了一个顿悟,突然一切都恢复了。同样,我之前也提出过类似的问题,这是CDI/JSF混淆,请参见上面的@Named。我还没有意识到CDI和JSF处理请求参数的机制是不同的。在我心目中,我把这一切都混为一谈了。不过我现在是异性恋了。谢谢你的参考书。有几种选择,所以你的建议很有帮助。
@Named
@RequestScoped
public class DeviceResult {
@Inject DeviceService deviceListService;
String hostname;
public void init(){
deviceList = deviceListService.fetchDevices(hostname);
}
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
// Results
List<Devices> deviceList = new ArrayList<Devices>();
public List<Devices> getDeviceList() {
deviceList = deviceListService.fetchDevices(hostname);
return deviceList;
}
}
@Stateful
public class DeviceService {
@PersistenceContext
EntityManager em;
public DeviceService() {
}
String hostname;
List<Devices> devicesList = new ArrayList<Devices>();
@SuppressWarnings("unchecked")
public List<Devices> fetchDevices(String hostname) {
Query qry = em.createQuery("SELECT d FROM Devices d WHERE d.name=:name");
qry.setParameter("name", hostname);
devicesList = qry.getResultList();
return devicesList;
}
}