Java 关于正确使用servlet的问题

Java 关于正确使用servlet的问题,java,jsf,servlets,jakarta-ee,jsf-2,Java,Jsf,Servlets,Jakarta Ee,Jsf 2,我想创建一个servlet,它允许我将图像文件从客户端上传到服务器。我正在帮助自己学习apache站点上的教程: 在路上,我发现了一些复杂和疑问: 问题1 我希望我的servlet准备一个包含请求中所有值的对象(包括图像,作为byte[]),并将其传递给@EJB,该@EJB将在数据库中插入所有值。 可能吗?您能否提供一些关于如何改进我当前的servlet来实现这一点的伪代码提示 @WebServlet(name="uploadServlet") public class FileUpload

我想创建一个servlet,它允许我将图像文件从客户端上传到服务器。我正在帮助自己学习apache站点上的教程:

在路上,我发现了一些复杂和疑问:

问题1

我希望我的servlet准备一个包含请求中所有值的对象(包括图像,作为byte[]),并将其传递给@EJB,该@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页面,但我真的不知道如何做。你能给我一些提示吗?我也不知道如何以正常的方式做,从页面上看,你认为什么是最好的方式? 这就是我到目前为止对托管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

疑问3:

在浏览器和JSF组件之间拦截飞行中的请求参数打破了组件体系结构和数据隐藏原则。它还将绕过在JSF组件的服务器端部分实现的任何安全措施和验证

如果您使用JSF组件框架,只从组件而不是从请求本身请求值是有意义的

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

如果这是你的雇主要求的:接受它,并开始努力工作。。。了解JSF和EJB解决了哪些问题,并根据这些问题构建您的工作框架

如果您有选择的自由:选择一个更轻的框架,例如Spring+SpringMVC。你将获得经验,并以自己的速度遇到这些问题

怀疑#1:

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

需要注意的是,使用EJB的最大原因之一是管理事务,事务必须保持短,以毫秒为顺序。这有很多原因,例如数据库上的锁。但是,在处理带有上载的http请求时,这不再有效

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

而不是

ejb.save(thing)
我更喜欢这样的函数

profileService.addPortrait(uid, byte[] image);
这明确说明了它的功能,也满足了短期交易的要求。这意味着配置文件实体可用于可能同时出现的其他请求(如某些状态图像或收件箱状态…)

疑问2:

在罗马时,要像罗马人那样做

从学习语言的一些基础知识开始。在本例中,从一些教程中学习JSF

疑问3:

在浏览器和JSF组件之间拦截飞行中的请求参数打破了组件体系结构和数据隐藏原则。它还将绕过在JSF组件的服务器端部分实现的任何安全措施和验证

如果您使用JSF组件框架,只从组件而不是从请求本身请求值是有意义的

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

如果这是你的雇主要求的:接受它,并开始努力工作。。。了解JSF和EJB解决了哪些问题,并根据这些问题构建您的工作框架


如果您有选择的自由:选择一个更轻的框架,例如Spring+SpringMVC。你将获得经验,并以自己的速度遇到这些问题

问题1-

你绝对需要独一无二的身份证明