我刚刚开始学习servlet而且我正在尝试做一个购物项目。 问题是,当所有超链接具有相同的操作servlet时,如何识别多个超链接中的哪些超链接? 这是代码:
HTML code:
Product 1
<a name="sub" value="1" href="Cart">Add to cart?</a>
Product 2
<a name="sub" value="2" href="Cart">Add to cart?</a>
Servlet代码(Cart.java):
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Connection con=DriverManager.getConnection("...","...","...");
int id=Integer.parseInt(request.getParameter("sub").trim());
PreparedStatement ps=con.prepareStatement("select price,qty from product where pid=?");
PrintWriter out=response.getWriter();
ps.setInt(1, id);
ResultSet rs=ps.executeQuery();
}
我不能为每个超链接创建单独的servlet,因为页面上有很多超链接,我也有多个页面。所以这是不可能的。
我尝试在标记中添加一个值字段并使用getParameter()获取值,但是我得到一个NULL指针异常。 我该怎么办? 如果我明确地在servlet中设置id的值,那么代码运行正常。但是,由于servlet仅适用于该特定产品,因此无法完成。 我只是一个初学者,不知道java中是否存在任何方法。 :(
我还想问一下,如果几个html页面调用相同的servlet,有没有办法在servlet中获取该html文件的名称?
答案 0 :(得分:1)
您是正确的,无法区分同一资源的两个链接:Cart
资源是Cart
资源,无论谁链接到它。
你可以创建一个新的servlet来处理将每个产品添加到购物车:
Product 1 <a href="AddProduct1">Add to cart?</a>
Product 2 <a href="AddProduct2">Add to cart?</a>
Product 3 <a href="AddProduct3">Add to cart?</a>
Product 4 <a href="AddProduct4">Add to cart?</a>
<!-- etc. -->
但正如你在OP中所指出的那样,这不是一个好方法 - 这不会扩展。
与所有事情一样,有很多方法可以解决这个问题。一种方法是向资源添加query parameter。这样做可以让你将一些数据传递给servlet(并通过getParameter("product")
在servlet中获取)。例如,您可以创建如下链接:
Product 1 <a href="Cart?product=1">Add to cart?</a>
Product 2 <a href="Cart?product=2">Add to cart?</a>
以上都将链接到相同的servlet,相同的资源,但每个链接都会将不同的数据传递给servlet。在servlet中,您可以获取此数据并使用它来确定需要执行的操作:
String productId = request.getParameter("product");
// Add product to cart
来自{JAVadoc for getParameter(String name)
,强调我的:
以String形式返回请求参数的值,如果参数不存在,则返回null。请求参数是随请求一起发送的额外信息。 对于HTTP servlet,参数包含在查询字符串或发布的表单数据中。