Java 如何从用户输入更新bean
我的基本问题是关于JavaEE、JSP和JSTL,如何获得用户更新信息来更新控制器端(即在serlvet中)的bean 我对网络应用相当陌生,我读过几种不同的方法,但我有一种感觉,我现在使用的方法确实过时了,或者有一些我忽略的重大缺陷。我的解决办法如下: 我的特定bean是一个具有属性taskID、title和指令的任务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
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),该怎么办
任务,如您的示例所示)
有没有一种方法可以从请求中获取整个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 );