gpt4 book ai didi

java - 关于servlet的正确使用方法的问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:05 24 4
gpt4 key购买 nike

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

在我的路上,我发现了一些并发症和疑虑:

问题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 而不是从 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,以使其成为 session bean。我不喜欢这种方法,并且您会遇到由 EJB 世界和 HTTP 请求世界的差异引起的问题。

值得注意的是,使用 EJB 的最大原因之一是管理事务,并且事务必须保持较短(以毫秒为单位)。这是出于多种原因,例如数据库上的锁。然而,当处理带有上传的http请求时,这不再有效。

从另一个角度来看,服务层应该代表数据库模型的抽象,并且应该从用户的角度展示您可以使用该模型做什么。用户不想将图像保存到数据库,用户想要将肖像添加到他的个人资料中。

而不是

ejb.save(thing)

我更喜欢这样的功能

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

这明确地说明了它的作用,并且也满足了短事务的要求。这意味着配置文件实体可用于可能同时出现的其他请求(例如某些状态图像或收件箱状态......)

疑点#2:

入乡随俗......

并从学习该语言的一些基础知识开始。在本例中,请通过一些教程来学习 JSF。

疑点#3:

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

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

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

如果您的雇主强制要求:忍住,开始埋头苦读……了解 JSF 和 EJB 解决了哪些问题,并根据这些问题来构建您的工作。

如果你有选择的自由:选择一个更轻的框架,例如 Spring + Spring MVC。您将获得经验并按照自己的节奏解决这些问题。

关于java - 关于servlet的正确使用方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6403587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com