我试图将值从一个servlet传递到另一个servlet,我想我已经尝试过几乎所有东西,但它总是以null结束。 我想要获得" id"从旁边删除任务。我已经尝试将其存储在会话中,我尝试过使用request.getParameter。关于我应该做什么的任何想法?
try{
int id = DataAccess.getUserID(name);
list = DataAccess.displayTasks(id);
}
catch(Exception e){e.printStackTrace();}
out.println(OurUtils.getHeader("List of Tasks"));
out.println("<center><h2>List of Your Tasks</h2>");
out.println("<table>");
for (Tasks T : list){
out.println("<tr>");
out.println("<td><a href = \"DeleteTask?id="+T.getId()+"\">Delete</a></td>");
out.println("<td><a href = \"ModifyTask?id="+T.getId()+"\">Modify</a></td>");
out.println("<td>"+T.getTask()+"</td></tr>");
}
out.println("</table>");
out.println("");
out.println("<a href=\"AddTask\">Add a new task</a>");
out.println("</center>");
out.println(OurUtils.getFooter());
这是我的显示任务方法
public static ArrayList<Tasks> displayTasks(int id) throws ClassNotFoundException,
IllegalAccessException, InstantiationException,SQLException{
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url,sqluser,sqlpass);
st = con.createStatement();
String sql = "SELECT task from Assignment2Tasks where userID = "+id+"";
ResultSet rs = st.executeQuery(sql);
ArrayList<Tasks> list = new ArrayList<Tasks>();
while(rs.next()){
Tasks T = new Tasks(rs.getString(1));
list.add(T);
}
con.close();
return list;
答案 0 :(得分:2)
好的,也许你已经知道了,但这就是你的服务对象(如DAO对象)和域对象(任务列表)可以在你的servlet之间共享的方式:
在web.xml
中定义listener
对象,实现ServletContextListener
,一旦将应用程序部署到Servlet容器(jetty,tomcat)中,将调用侦听器:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>Main</servlet-name>
<servlet-class>vic.web.MainServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<listener>
<listener-class>vic.web.AppInitializationListener</listener-class>
</listener>
<servlet-mapping>
<servlet-name>Main</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
</web-app>
在该侦听器的代码中,您初始化数据层并在ServletContext
内部对其进行引用,这保证在您的webapp的所有servlet之间共享,这些servlet在同一JVM中运行: / p>
public class AppInitializationListener implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(MainServlet.class);
static final String INITIAL_TASKS_KEY = "INITIAL_TASKS_KEY";
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("Application initialization commences...");
sce.getServletContext().setAttribute(INITIAL_TASKS_KEY,
new TasksList(Arrays.asList("From me to you", "We can work it out", "Long and winding road")
));
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
在servlet的代码中,覆盖init(ServletConfig config)
方法,初始化servlet后由容器调用该方法。在那里,你可以找到在听众中初始化的数据,然后你就去了!
public class MainServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(MainServlet.class);
private TasksList initialTasks;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
logger.info("Here");
ServletContext ctx = getServletContext();
//noinspection unchecked
initialTasks = (TasksList) ctx.getAttribute(AppInitializationListener.INITIAL_TASKS_KEY);
logger.info("Got: " + initialTasks);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
StringBuilder sb = new StringBuilder("<html><body>Hello there. Here are your tasks:<br><ol><br>\n");
for (String task : initialTasks.getTasks()) {
sb.append("<li>").append(task).append("</li><br>\n");
}
sb.append("</ol>\n</body></html>");
writer.write(sb.toString());
writer.flush();
writer.close();
}
}
此处数据层只是包含静态任务列表的POJO。由于您希望从DB(自然地)获取数据,您应该将JDBC初始化代码放在listener
中,如上所示,并使监听器将获得的DriverManager
放入上下文中。
好的,但实际上你会想要改变这些东西:a)使用一些MVC框架而不是手工创建HTML; b)使用DataSource
和JDBC连接池而不是DriverManager
答案 1 :(得分:1)
我不知道你为什么要使用所有那些out.println而不是至少jsp。我在jsp中完成了这个。
我在servlet中的列表
List<User> list = userService.viewUser(); //userService is used to access the data from db by calling the daoservice
request.setAttribute("list",list);
rs=request.getRequestDispatcher("manageuser.jsp");
rs.include(request,response);
这是我在jsp中的代码,请注意所有这些数据都在表标记
中<%List list=(List)request.getAttribute("list");%> //Getting the list attributes from the appropriate servlet
<c:forEach items="${list}" var="user"> //for each loop
<tr>
<td><c:out value="${user.userId}" /></td>
<td><c:out value="${user.userName}" /></td>
<td><c:out value="${user.emailId}" /></td>
<td><a href="menuaction?redirectValue=edituser&Id=${user.userId}">Edit</a>
<a href="menuaction?redirectValue=deleteuser&Id=${user.userId}">Delete</a></td>
</tr>
</c:forEach>
然后在我正在进行删除操作和editind操作的servlet中,(对你来说它只是删除)
int id = Integer.parseInt(request.getParameter("Id")); //Do the appropriate actions from this id variable
答案 2 :(得分:0)
servlet间通信: RequestDispatcher对象可以将客户端的请求转发给资源(Servelt / Jsp)。您希望Servlet_A调用Servlet_B.Use
RequestDispatcher dispatcher = getRequestDispatcher("Servlet_B");
dispatcher.forward( request, response );
答案 3 :(得分:0)
<a href = \DeleteTask?id = 15>Delete</a>
当用户点击删除时,您可以通过request.getParameter(“id”)获取id 所以你可以通过请求将id传递给其他servlet。
此外,您可以将其存储在会话中并获取它。
request.getSession(true).setAttribute("name",'AAAA');
request.getSession().getAttribute("name");
答案 4 :(得分:0)
我发现了解决问题的方法。在我的DisplayTasks方法中,我只是为任务拉出字符串并将其放在t对象中,而我没有从表中提取ID。我无法将ID传递给另一个servlet,因为它是空变量..