将值从servlet传递到另一个

时间:2014-10-10 21:13:36

标签: java servlets

我试图将值从一个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;

5 个答案:

答案 0 :(得分:2)

好的,也许你已经知道了,但这就是你的服务对象(如DAO对象)和域对象(任务列表)可以在你的servlet之间共享的方式:

  1. 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>
    
  2. 在该侦听器的代码中,您初始化数据层并在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) {
        }
    }
    
  3. 在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();
        }
    
    }
    
  4. 此处数据层只是包含静态任务列表的POJO。由于您希望从DB(自然地)获取数据,您应该将JDBC初始化代码放在listener中,如上所示,并使监听器将获得的DriverManager放入上下文中。

  5. 好的,但实际上你会想要改变这些东西: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,因为它是空变量..