Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从用户输入更新bean_Java_Jsp_Jakarta Ee_Web Applications_Jstl - Fatal编程技术网

Java 如何从用户输入更新bean

Java 如何从用户输入更新bean,java,jsp,jakarta-ee,web-applications,jstl,Java,Jsp,Jakarta Ee,Web Applications,Jstl,我的基本问题是关于JavaEE、JSP和JSTL,如何获得用户更新信息来更新控制器端(即在serlvet中)的bean 我对网络应用相当陌生,我读过几种不同的方法,但我有一种感觉,我现在使用的方法确实过时了,或者有一些我忽略的重大缺陷。我的解决办法如下: 我的特定bean是一个具有属性taskID、title和指令的任务bean。它实际上有更多的属性,但为了这个问题,我缩小了它 public class Task { private int taskID; private Str

我的基本问题是关于JavaEE、JSP和JSTL,如何获得用户更新信息来更新控制器端(即在serlvet中)的bean

我对网络应用相当陌生,我读过几种不同的方法,但我有一种感觉,我现在使用的方法确实过时了,或者有一些我忽略的重大缺陷。我的解决办法如下:

我的特定bean是一个具有属性taskID、title和指令的任务bean。它实际上有更多的属性,但为了这个问题,我缩小了它

public class Task {
    private int taskID;
    private String title;
    private String instructions;

    constructor here...

    getters and setters defined here...
在servlet中,我从DAO获取bean并将其放入请求中:

Task task = dao.getTaskByID(taskID);
request.setAttribute("task", task);
在JSP页面中,我使用taskID的隐藏输入将相应的输入设置为beans属性。用户查看数据、对其进行更改并提交:

<form action="./UpdateTask" method="POST">
    <input type="hidden" name="taskID" value="${task.taskID }">
    <input type="text" id="taskTitle" name="taskTitle" value="${task.title }">
    <input type="text" id="taskInstructions" name="taskInstructions" value="${task.instructions}">
    <button type="submit">Submit</button>
</form>
有几个具体问题:

  • 我是否误解了JSTL和bean是如何一起使用的
  • 有没有一种方法可以从请求中获取整个bean,而不必像我那样重新构建它
  • 如果我最终从请求数据重建bean,如果我不想向用户公开一些属性值(比如外键ID),该怎么办
我知道询问最佳实践是不受欢迎的,所以我不是在询问“最佳”方式,而是简单地说,如果我所描述的是一种偏离标准实践的非正统方式。或者,如果我没有做一些事情,这将使它更简单,或者更符合当前实践的速度

我还考虑将TaskBean作为一个会话变量来维护对象的状态,然后在请求后从会话中获取它,并根据用户输入更新可能已更改的字段,但我担心这种方法的并发性问题

谢谢你的帮助。帮助新手也很了不起。信息太多了,变化太快了,弄清楚学习的方法肯定会让人不知所措

我是否误解了JSTL和bean是如何一起使用的

除此之外,考虑到这是一个“普通的”JSP/Servlet web应用程序,您也做得很好

您刚刚意识到这一切都是样板代码。需要收集请求参数、转换和验证它们、更新模型值和调用业务逻辑的代码。您可以在几乎每一个“普通”servlet中看到这一点。你需要一遍又一遍地重复同样的代码逻辑

这就是为什么像JSF、Spring MVC、Wicket、Play这样的MVC框架!,支柱等存在。它们提供了一个单一的“控制器”servlet/过滤器,它接管(大部分)样板代码,因此您最终只需要一个JSP或Facelets文件作为“视图”,一个Javabean类作为“模型”。根据MVC框架的性质,它将为您透明地使用转换、验证和/或原始提交的值更新引用的实体(
任务,如您的示例所示)


有没有一种方法可以从请求中获取整个bean,而不必像我那样重新构建它

我还考虑将TaskBean作为一个会话变量来维护对象的状态,然后在请求后从会话中获取它,并根据用户输入更新可能已更改的字段,但我担心这种方法的并发性问题

当最终用户在多个浏览器选项卡/窗口中打开同一视图时,将其放入会话范围可能确实会导致问题。例如,javaee的MVC框架JSF提供了“视图范围”,只要您在备份bean第一次初始化时所使用的表单上进行后期备份,就可以保持备份bean的活动状态。可以在以下问答中找到中的“主详细信息”示例:


如果我最终从请求数据重建bean,如果我不想向用户公开一些属性值(比如外键ID),该怎么办


您将始终需要传递一些标识符,例如
dao.getTaskByID(taskID)
示例中的
taskID
。系统还应如何知道最终用户希望查看/编辑的实体?您不需要传递所有其他标识符或未使用的属性。您只需使用
taskID
从DAO获取
Task
实体,然后更新其属性,而不是从头开始重新创建
Task

Wow,这是一个很棒的答案。谢谢我不使用框架,因为我想好好学习基础知识,我想我是的!你最后的评论是我想做的,但我担心会导致太多DOA电话。很高兴知道不是这样,所以我会这么做的!将taskID存储在隐藏输入中是从请求中获取它的标准还是有更安全的方法?如果您担心“太多的DB调用”,那么问题应该通过后端DB和DAO之间的二级实体缓存来解决,而不是通过在前端的所有会话上复制实体来解决。JavaEE的ORM框架JPA支持这一点。回到基础知识(我总是支持先学习基础知识,这样你会更好地理解为什么所有这些抽象框架都存在;),我可以假设你很清楚我们的servlets wiki页面和这个关于幂等性的问答吗?如果没有,也看一遍。我没有那些参考资料,它们很棒。我不知道XSS攻击。非常有用。关于:将taskID存储在隐藏输入中;可以吗?我在那些页面上没有看到任何关于这方面的内容。我现在不再打扰你了:)再次谢谢!答案取决于您首先是如何获得任务ID的(对于
dao.getTaskByID(taskID)
)。如果它已经作为URL查询字符串参数传递,比如so
/edittask?taskID=42
,那么混淆隐藏的输入值是没有意义的。最终用户已经知道确切的值。对。我应该
int taskID = Integer.parseInt(request.getParameter("taskID));
String title = request.getParameter("taskTitle");
String instructions = request.getParameter("taskInstructions");

Task updatedTask = new Task(taskID, title, instructions);

dao.updateTaskInfo(updatedTask );