JSP(不是 JSF)中的 CDI 在 Tomcat 10(jakarta.servlet.*)
CDI in JSP ( not JSF ) on Tomcat 10 ( jakarta.servlet.* )
规范: TOMCAT10,来自 jboss
的焊接库
进程: 尝试 (CDI) 从输入文本插入到 pojo 从一个纯粹的简单 JSP 页面
<form method="get">
<table width="25%" border=1>
<tr>
<td>Name :</td>
<td><input type="text" maxlength="10" id="login" name="login" value="${bean.input}"/></td>
</tr>
<tr>
<td colspan=2>
<button type="button" id="TEST" value="${bean.submit()}" name="TEST" />TEST-CDI</button>
</td>
</tr>
</table>
</form>
Pojo如下
@Named()
@RequestScoped
public class Bean implements java.io.Serializable {
private String input;
private String output;
//Get/setters
public String getInput() {return input;}
public void setInput(String input) {this.input = input;}
public String getOutput() {return output;}
public void setOutput(String output) {this.output = output;}
public void submit() {
output = "Hello World! You have typed: " + input;
System.out.println("SUBMITTED : " + output);
}
}
O/p : 已提交:世界您好!您输入了:null
问题:为什么 InputText 的注入没有传递给 pojo?
潜在客户: WWW 上没有 post(google/yahoo...)
关于
卡尔提克
Why Injection of InputText not passed to pojo ?
因为这不是 CDI 做的。
你基本上忘了创建一个如下所示的 servlet:
@WebServlet("/yourServlet")
public class YourServlet extends HttpServlet {
@Inject
private Bean bean;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
bean.setInput(request.getParameter("login"));
if ("submit".equals(request.getParameter("action")) {
bean.submit();
}
request.getRequestDispatcher("your.jsp").forward(request, response);
}
}
您只需要调整表单和提交按钮如下:
<form action="${pageContext.request.contextPath}/yourServlet" method="post">
...
<button type="submit" name="action" value="submit">TEST-CDI</button>
...
</form>
CDI 基本上只在特定范围内首次引用时自动创建 bean 实例,例如 EL 中的 ${bean}
或某些容器管理组件(例如 servlet 或另一个 bean)中的 @Inject
。 CDI 根本不收集和设置提交的 HTTP 请求参数。这是 servlet 的职责。
请注意,使用 JSF 时,不需要整个 YourServlet
,您只需要一个视图(如 JSP 页面)和一个模型(如 CDI bean)。这就是 JSF 的全部意义所在。它带有自己的 FacesServlet
,可以自动完成这一切。它甚至可以做更多,例如(隐式)转换、验证以及重要的 XSS 攻击预防。
另请参阅:
- Easy way of populating Javabeans based on request parameters
- Prepopulate AND redisplay an HTML Form
- Design Patterns web based applications
- What is the need of JSF, when UI can be achieved with JavaScript libraries such as jQuery and AngularJS
规范: TOMCAT10,来自 jboss
的焊接库进程: 尝试 (CDI) 从输入文本插入到 pojo 从一个纯粹的简单 JSP 页面
<form method="get">
<table width="25%" border=1>
<tr>
<td>Name :</td>
<td><input type="text" maxlength="10" id="login" name="login" value="${bean.input}"/></td>
</tr>
<tr>
<td colspan=2>
<button type="button" id="TEST" value="${bean.submit()}" name="TEST" />TEST-CDI</button>
</td>
</tr>
</table>
</form>
Pojo如下
@Named()
@RequestScoped
public class Bean implements java.io.Serializable {
private String input;
private String output;
//Get/setters
public String getInput() {return input;}
public void setInput(String input) {this.input = input;}
public String getOutput() {return output;}
public void setOutput(String output) {this.output = output;}
public void submit() {
output = "Hello World! You have typed: " + input;
System.out.println("SUBMITTED : " + output);
}
}
O/p : 已提交:世界您好!您输入了:null
问题:为什么 InputText 的注入没有传递给 pojo?
潜在客户: WWW 上没有 post(google/yahoo...)
关于 卡尔提克
Why Injection of InputText not passed to pojo ?
因为这不是 CDI 做的。
你基本上忘了创建一个如下所示的 servlet:
@WebServlet("/yourServlet")
public class YourServlet extends HttpServlet {
@Inject
private Bean bean;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
bean.setInput(request.getParameter("login"));
if ("submit".equals(request.getParameter("action")) {
bean.submit();
}
request.getRequestDispatcher("your.jsp").forward(request, response);
}
}
您只需要调整表单和提交按钮如下:
<form action="${pageContext.request.contextPath}/yourServlet" method="post">
...
<button type="submit" name="action" value="submit">TEST-CDI</button>
...
</form>
CDI 基本上只在特定范围内首次引用时自动创建 bean 实例,例如 EL 中的 ${bean}
或某些容器管理组件(例如 servlet 或另一个 bean)中的 @Inject
。 CDI 根本不收集和设置提交的 HTTP 请求参数。这是 servlet 的职责。
请注意,使用 JSF 时,不需要整个 YourServlet
,您只需要一个视图(如 JSP 页面)和一个模型(如 CDI bean)。这就是 JSF 的全部意义所在。它带有自己的 FacesServlet
,可以自动完成这一切。它甚至可以做更多,例如(隐式)转换、验证以及重要的 XSS 攻击预防。
另请参阅:
- Easy way of populating Javabeans based on request parameters
- Prepopulate AND redisplay an HTML Form
- Design Patterns web based applications
- What is the need of JSF, when UI can be achieved with JavaScript libraries such as jQuery and AngularJS