0

multipart による追加データの送信によると、request.getParameter;では使用できませんenctype="multipart/form-data"。process.jsp では、 を使用しませんでしrequest.getParameterた。ただし、jsp:getPropertynull 値を返します。削除enctype="multipart/form-data"は正常に機能します。enctype="multipart/form-data" がどのように影響するか知りたいjsp:setProperty and jsp:getPropertyです。それらはどのように接続されていますか?私jsp:setPropertyは方法が好きではないことを知っています。私は古いコードで作業しているため、フレームワークや MVC は使用されていません。しかし、サーブレット 3.0 と tomcat 8.5 で実行する必要があります。enctype="multipart/form-data"JspからJspへの使用中にデータを渡す他の方法はありますか?

フォーム.jsp

<!--    <form action="process.jsp" method="post" enctype="application/x-www-form-urlencoded"> -->
<!--    <form action="process.jsp" method="post"> -->
    <form action="process.jsp" method="post" enctype="multipart/form-data">
        Name:<input type="text" name="name"><br> 
        Password:<input type="password" name="password"><br> 
        Email:<input type="text" name="email"><br> 
        File:<input type="file" name="fileName"><br> 
        <hr>
        <input type="submit" value="register">
    </form>

プロセス.jsp

<jsp:useBean id="bean" class="dao.User" scope="page">
<jsp:setProperty property="*" name="bean"/>  
</jsp:useBean>  

Record:<br>  
<jsp:getProperty property="name" name="bean"/><br>  
<jsp:getProperty property="password" name="bean"/><br>  
<jsp:getProperty property="email" name="bean" /><br>  

ユーザー.java

public class User {

    private String name;
    private String password;
    private String email;
    private String fileName;

// getter and setter...

}
4

2 に答える 2

0

enctype="multipart/form-data"で動作しない理由がわかりましたjsp:setProperty and jsp:getProperty。Tomcat で実行しているため、process.jsp は process_jsp.java として生成されました。

  dao.User bean = null;
  bean = (dao.User) _jspx_page_context.getAttribute("bean", javax.servlet.jsp.PageContext.PAGE_SCOPE);
  if (bean == null){
    bean = new dao.User();
    _jspx_page_context.setAttribute("bean", bean, javax.servlet.jsp.PageContext.PAGE_SCOPE);
    out.write('\n');
    org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("bean"), request);
    out.write(' ');
    out.write(' ');
    out.write('\n');
  }

上記に従ってソースコードorg.apache.jasper.runtime.JspRuntimeLibrary.introspectが呼び出されました。

   public static void introspect(Object bean, ServletRequest request) throws JasperException
    {
        Enumeration<String> e = request.getParameterNames();
        while ( e.hasMoreElements() ) {
            String name  = e.nextElement();
            String value = request.getParameter(name);
            introspecthelper(bean, name, value, request, name, true);
        }
    }

上記のコード マップ リクエスト パラメータと名前 (Bean プロパティ名) は、introspecthelperを使用して適切なセッター メソッドに値が渡されますjava.lang.reflect.Method.invoke

で作業する場合enctype="multipart/form-data"Enumeration<String> e = request.getParameterNames()問題です。要素が見つからintrospecthelperなかったため、実行されません。

なぜならJspRuntimeLibrary.introspect静的メソッドだからです。その動作をオーバーライドすることはできません。したがって、カスタムタグを作成するか、JSP/サーブレットを使用してファイルをサーバーにアップロードする方法に従ってください。問題を解決する唯一の方法です。

于 2019-03-11T17:28:16.707 に答える