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