繁体   English   中英

有关使用servlet的正确方法的问题

[英]Questions about the correct way of using servlets

我想创建一个servlet,使我可以将图像文件从客户端上传到服务器。 我正在帮助我自己在apache网站上找到的教程: http : //commons.apache.org/fileupload/using.html

在途中,我发现了一些复杂性和疑虑:

问题1

我希望我的servlet准备一个具有请求中所有值的对象(包含的图像作为byte []),并将其传递给@EJB,该对象将全部插入数据库中。 那可能吗? 您能否提供一些伪代码技巧来说明如何改进当前的servlet来做到这一点?

@WebServlet(name="uploadServlet")
public class FileUpload extends HttpServlet {

    @EJB
    private DBAccessEJB ejb;

    private static final long serialVersionUID = -1062753489906645120L;

    // Will be triggered when a post method is sent by the user(Example: Form
    // submit)
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // Check if the request is multipart
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);

           // Create the object that willBe passed to the EJB 
              Thing thing = new Thing();

        if (isMultipart) {
            // If it is multipart, save the items in a FileItemfactory
            FileItemFactory factory = new DiskFileItemFactory();
            // Create an upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            try {
                // Get the files out of the request
                List items = upload.parseRequest(req);
                Iterator iterator = items.iterator();
                while (iterator.hasNext()) {
                    // Get each of the items inside the items list
                    FileItem item = (FileItem) iterator.next();
                    // If the item does not come from a field
                    if (!item.isFormField()) {
                       //transform the uploaded images to byte[]
                                       //setTheImageValues of the object
                    }
                                    else {
                                       //set the text values of the object
                                    }
                }
                          //Pass the prepared object to the EJB to be inserted in DB
                          ejb.save(thing)
            } catch (FileUploadException fue) {
                fue.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

问题2

我考虑过将请求通过管理好的bean传递给servlet,而不是从JSF页面传递给servlet,但是我真的不知道该怎么做。 你能给我一些提示吗? 我也不知道该怎么做,从页面上看,您认为哪种方法最好? 到目前为止,这是我对托管bean所做的:

public void save() {

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletRequest req = (HttpServletRequest)fc.getExternalContext().getRequest();

//我还需要什么将请求传递到服务器?
}

这将是一个多部分表单中的页面:

<h:commandButton value="Submit" action="myBackingBean.save"/>

问题3

在我的JSF页面中,我差不多有10个值,几乎都是字符串。 我从JSF中获取它们并将它们临时存储在JSF页面中。 如果servlet可以从请求中获取所有值,那么在后备bean中就不需要此属性。 您认为这种方法是件好事吗? 这将确保流程交易的安全性还是存在任何风险?

疑问1:

看起来您在这里使用EJB作为服务层,其中包含用EJB注释注释的DAO,以使其成为会话bean。 我不喜欢这种方法,您会遇到由EJB世界和HTTP请求世界的差异引起的问题。

需要注意的重要一点是,使用EJB的最大原因之一是管理事务,事务必须保持短(毫秒级)。 这是由于多种原因,例如数据库上的锁。 但是,在处理带有上载的http请求时,该请求不再有效。

从另一个角度来看,服务层应该表示数据库模型的抽象,并且应该从用户角度显示可以对模型进行的操作。 用户不想将图像保存到数据库,而是希望将肖像添加到他的个人资料。

代替

ejb.save(thing)

我喜欢像

profileService.addPortrait(uid, byte[] image);

这清楚地说明了它的作用,也满足了做空交易的要求。 这意味着配置文件实体可用于可能同时出现的其他请求(例如某些状态图像或收件箱状态等)

疑问2:

在罗马做到入乡随俗...

然后从学习语言的一些基础知识开始。 在这种情况下,请从一些教程中学习JSF。

疑问三:

拦截浏览器和JSF组件之间正在运行的request参数将破坏组件体系结构和数据隐藏原理。 它还将绕过JSF组件的服务器端部分中实现的所有安全措施和验证。

如果使用JSF组件框架,则仅从组件而不是从请求本身询问值是有意义的。

从您的三个疑问中,我觉得您有一个更大的疑问:我应该使用JSF吗?

如果您的雇主要求这样做,那就加油,然后开始阅读书籍……了解JSF和EJB解决了哪些问题,并根据这些问题来制定工作框架。

如果您可以自由选择:选择一个较轻的框架,例如Spring + Spring MVC。 您将获得经验,并按自己的进度遇到这些问题。

问题1-

当然,您将需要文件的唯一标识符,但是如果您执行诸如按日期/用户名将文件存储在文件夹中之类的事情,那么这将变得不那么复杂。

根据到目前为止所显示的内容,这是您可以使用的程序的基本工作流程:

客户端计算机-> FileUploadServlet(利用Apache Commons File Upload)

一旦进入FileUploadServlet:

a)通过EJB将请求中的信息保存到数据库中,包括文件名,Mime类型,信息等。

b)仍在servlet内时,将文件上传到您的服务器,或者在需要时使用商业解决方案,例如Amazon S3或Google Storage(通过Java API,例如JetS3t

然后,将所有必要的信息返回给客户端。

问题2 -

您在整个Bean中进行请求的原因是什么,为什么不使Servlet成为动作,并从请求中收集信息呢? 我不会在JSF上提供Bean的save方法,因为这听起来不安全且未经身份验证。

问题3-

与上述相同,为什么在其他地方可用时,即使暂时存储信息,也要存储?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM