【转】 servlet中怎样接收jsp的form表单的内容

本文介绍了一个Servlet如何处理HTTP请求,包括获取请求参数、读取请求头部信息、获取客户端IP地址等核心功能。同时展示了如何使用Java Servlet API进行操作。
转载自 chunying031最终编辑 chunying031可以查servet的apigetParameterNames(),getParameterMap(),getInputStream(),getAttributeNames(),getParameterValues()等 code:

package com.java91.lesson01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class RequestTestServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


//读取表单参数

request.setCharacterEncoding("utf-8");//使用什么编码读客户端发过来的二进制数据,需要与HTML编码保持一致。在TOMCAT中,如果是get方法传过来的数据,可能不起作用。

String sno=request.getParameter("sno");//获取单个、指定参数的值
System.out.println("-----request.getParameter('sno'):"+sno);

String sname=request.getParameter("sname");//获取单个、指定参数的值
System.out.println("-----request.getParameter('sname'):"+sname);

String grade[]=request.getParameterValues("grade");//获取单个、指定参数的所有值。(一个参数可能有多个值的情况)
System.out.println("-----request.getParameterValues('grade'):"+grade[0]+","+grade[1]);

Enumeration enume= request.getParameterNames();//返回一个枚举类型(Enumeration)的实例,值为表单的所有参数名

Map map=request.getParameterMap();//返回一个Map实例,键-值成对的形式,键为参数名,值为参数值
System.out.println("-----request.getParameterMap():"+map);



//其它信息

String encoding=request.getCharacterEncoding();// 返回请求所用的字符编码。
System.out.println("-----request.getCharacterEncoding(): "+encoding);

String protocol=request.getProtocol();//返回发送请求所使用的名字和版本号,如:HTTP/1.1
System.out.println("-----request.getProtocol(): "+protocol);

String ip=request.getRemoteAddr();//返回客户端的IP地址
System.out.println("-----request.getRemoteAddr(): "+ip);

String scheme =request.getScheme();//返回请求使用的方法的名字,如http,https,ftp等。
System.out.println("-----request.getScheme(): "+scheme);

String serverName=request.getServerName();//返回服务器的名字
System.out.println("-----request.getServerName(): "+serverName);

int port=request.getServerPort();//返回请求被接收的端口号。
System.out.println("-----request.getServerPort(): "+port);

String uri=request.getContextPath();//获取标示请求内容的URI的请求部分。
System.out.println("-----request.getContextPath(): "+uri);

String method=request.getMethod();//返回该请求的HTTP方法名字,如GET/POST
System.out.println("-----request.getMethod(): "+method);

String pathInfo=request.getPathInfo();//返回发出请求的URL客户的相关额外路径信息
System.out.println("-----request.getPathInfo(): "+pathInfo);

String queryString=request.getQueryString();//获取发出请求的URL的路径之后的查询串。
System.out.println("-----request.getQueryString(): "+queryString);

String reURI=request.getRequestURI();//获取在HTTP请求的第一行中的,请求URL中从协议名到查询串的部分。
System.out.println("-----request.getRequestURI(): "+reURI);

StringBuffer reURL=request.getRequestURL();//重构一个发出该请求的URL对象
System.out.println("-----request.getRequestURL(): "+reURL);

String servletPath=request.getServletPath();//获取调用servlet的请求URL部分
System.out.println("-----request.getServletPath(): "+servletPath);

Enumeration lang=request.getHeaders("Accept-Language");//返回指定报头的所有值



/*什么是cookie

   出于安全考虑,动态网站开发语言,无法存储和操作客户端电脑的文件/数据。避免病毒传播

   HTTP提供了一种机制,指定了一个特殊的存储空间,允许服务器向客户端电脑存储少量数据

到该空间 ,该空间被有效的安全控制,对客户端电脑不会造成影响。
   
   它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,

网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,

或者让你不用输入ID、密码就直接登录等等。

*/

//打印所有cookies的值:只有本网站留的cookie才会被带回,其它网站不返回

Cookie [] cook = request.getCookies(); //返回cookie类型的数组
if (cook != null){
for(int i =0; i<cook.length; i++){
Cookie c=cook[i];
System.out.println(c.getName()+":"+c.getValue());
}
}


// 读取cookie值

String cookieName="userID"; //要读取的cookie名为userID
String cookieValue=""; //存放读出的cookie值
Cookie [] cook2 = request.getCookies(); //返回cookie类型的数组
if (cook != null){
for(int i =0; i<cook2.length; i++){
Cookie c=cook2[i];
if (cookieName.equals(c.getName())){
cookieValue=c.getValue();
System.out.println("cookieValue:"+cookieValue);
}
}
}




//向客户端安装一个cookie

/* Cookie cookie = new Cookie("userID" , "1234");
cookie.setMaxAge(60*60*24*7); //保留7天时间。如果设为0则删除该 cookie。无设置则为当前会话
response.addCookie(cookie);

*/



// session机制

HttpSession session = request.getSession();//返回当前会话,如果会话不存在,则创建一个新的会话

session.invalidate();



/*

public ServletInputStream getInputStream() throws IOException//用ServletInputStream得到请求的二进制数据
public BufferReader getReader() throws IOException//用BufferReader读取请求体文本
public RequestDispatcher getRequestDispatcher(String path)//返回指定路径上的资源的RequestDispatcher对象

public long getDateHeader(String name)//返回指定报头的值,作为长整型的日期值返回(毫秒)
public String getHeader(String name)
public Enumeration getHeaderNames()
public Enumeration getHeaders(String name)//返回指定报头的所有值
public int getIntHeader(String name)//返回指定报头的值,作为整型返回

public String getRequestedSessionId()//返回客户的essionID号
public HttpSession getSession()//获取和当前请求相关联的session对象。如果没有则创建一个
public HttpSession getSession(true)//获取和当前请求相关联的session对象,如果没有则创建一个
public HttpSession getSession(false)//获取和当前请求相关联的session对象,如果没有则返回null

*/


//response.setContentType("text/html;charset=utf-8");//指定发送的文件类型为HTML,指定HTML文档编码格式为UTF-8

response.setContentType("text/html");//指定发送的文件类型为HTML,指定HTML文档编码格式为UTF-8

//response.setCharacterEncoding("gbk");


PrintWriter out = response.getWriter();

out.println("<HTML>\n"
+ "<HEAD><TITLE>Hello</TITLE></HEAD>\n"
+ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1>Hello java91 你好</H1>\n"
+ "</BODY></HTML>");
}



public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request,response);
}

}
<think>好的,我现在需要解决用户的问题:如何在Servlet中处理JSP表单提交的多行数据。根据用户提供的引用内容,可能存在路径配置或版本兼容性问题。首先,用户提到在JSP提交表单Servlet时出现404错误,可能和路径配置有关,比如url-pattern是否正确,或者Servlet版本与Tomcat不兼容,如引用[4]提到使用Tomcat 8.5代替10.0解决404问题。因此,首先需要确保环境配置正确。 接下来,用户的问题是关于多行数据的提交,比如表格中的多行输入。常见的方法是在JSP中使用动态生成的表单字段,比如为每行数据添加相同的name属性,但带有索引,如name="item0",name="item1"等,或者在Servlet中使用getParameterValues方法获取数组。例如,引用[2]提到在form的action中添加参数,可能需要处理多个参数的情况。 然后,需要考虑JSP表单中的字段如何命名,以便在Servlet中正确获取。例如,使用name="item[]"这样的数组形式,或者在Servlet中遍历参数。同时,要确保表单的method是post,避免数据过长导致的问题,如引用[2]中的例子使用的是post方法。 另外,Servlet的配置是否正确也很重要,如引用[3]中的servlet-mapping是否正确映射到url-pattern,确保表单的action路径正确。例如,如果Servlet映射到/processMultiRows,那么form的action应该是这个路径,可能需要加上项目上下文路径。 最后,处理多行数据时,可能需要使用循环在Servlet中获取每一行的参数,比如通过request.getParameterValues("item")来获取所有行的值,或者根据索引逐个获取。同时,需要注意字符编码,防止中文乱码,可以在Servlet中设置request.setCharacterEncoding("UTF-8")。 总结步骤:1.确保环境配置正确,如Tomcat版本和Servlet版本兼容;2.检查Servlet的url-pattern和form的action路径是否正确;3.在JSP中使用合适的name属性结构,如带索引或数组形式;4.在Servlet中使用getParameterValues或循环获取多行数据;5.处理字符编码问题。</think>在Servlet中处理JSP表单提交的多行数据,需要结合参数获取方式、路径配置和编码设置。以下是具体步骤: --- ### 一、JSP表单设计 #### 1. **多行数据字段命名** 使用动态索引或数组形式命名表单字段,例如: ```html <form action="/yourContextPath/multiRowServlet" method="post"> <!-- 动态生成多行输入框 --> <input type="text" name="item0"> <input type="text" name="item1"> <input type="text" name="item2"> <button type="submit">提交</button> </form> ``` 或使用数组形式(更推荐): ```html <input type="text" name="items[]"> <input type="text" name="items[]"> ``` #### 2. **路径配置关键点** - 确保`action`中的路径与`web.xml`或注解配置的`url-pattern`一致[^3] - 若项目上下文路径为`/demo`,则完整路径应为`/demo/multiRowServlet` --- ### 二、Servlet数据处理 #### 1. **获取多行参数** - **方法1:通过索引遍历** ```java for (int i=0; ;i++) { String value = request.getParameter("item" + i); if (value == null) break; // 处理每一行数据 } ``` - **方法2:使用`getParameterValues`(数组形式)** ```java String[] items = request.getParameterValues("items[]"); if (items != null) { for (String item : items) { // 处理每一行数据 } } ``` #### 2. **编码设置** 在`doPost`方法首行添加: ```java request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ``` --- ### 三、常见问题排查 1. **404错误处理** - 检查Tomcat版本兼容性(如Tomcat 10需Jakarta EE包,Tomcat 8.5用Javax EE包)[^4] - 验证`<servlet-mapping>`配置是否匹配`action`路径 2. **参数获取为null** - 确认字段`name`属性与Servlet中获取的名称完全一致 - 检查是否遗漏`method="post"`属性[^2] --- ### 四、扩展应用场景 若需处理表格型多行数据(如购物车): ```html <table> <tr> <td><input type="text" name="productId"></td> <td><input type="number" name="quantity"></td> </tr> <!-- 动态添加更多行 --> </table> ``` 在Servlet中可通过: ```java String[] productIds = request.getParameterValues("productId"); String[] quantities = request.getParameterValues("quantity"); // 组合成对象列表处理 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值