html
<form action="/test/getData" method="post">
<input type="text" name="id"><br>
<input type="text" name="username"><br>
<input type="submit" value="提交">
</form>

首先方式是post,用户点击提交,输入的数据用post进行传递。
发现action是/test/getData,去web.xml里去找对应的路径。
java
<servlet>
<servlet-name>getdata1</servlet-name>
<servlet-class>com.example.servlet.getdata</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getdata1</servlet-name>
<url-pattern>/test/getData</url-pattern>
</servlet-mapping>
发现是到servlet里的getdata类,转到getdata。getdata有两个方式,一个是doGet,一个是doPost,之前规定了是Post方法,所以数据包就会交给doPost方法进行解决。里面的req就是请求包,我们可以去接收req的数据,req.setCharacterEncoding("UTF-8")是怕里面有乱码先设置一下编码格式,其他的也非常好容易理解。
java
public class getdata extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("id: " + req.getParameter("id"));
System.out.println("username: " + req.getParameter("username"));
System.out.println("ContextPath: " + req.getContextPath());
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
System.out.println(headerName+(req.getHeader(headerName)));
System.out.println("--------------");
}
String id = req.getParameter("id");
String username = req.getParameter("username");
resp.setContentType("text/html;charset=UTF-8");
String str = "id:"+id+"<br>"+"name:"+username;
resp.getWriter().write(str);
// 可以添加响应内容
resp.getWriter().write("提交成功");
resp.getWriter().flush();
}
}
重定向问题:
-
resp.sendRedirect()是重定向,两次响应,第一次是返回需要重定向的页面名字,第二次是返回重定向页面的内容,所以url地址会直接变掉。
-
req.getRequestDispatcher(str).forward(req,resp);是转发,就是一次请求,不需要去告诉页面名字,直接将页面数据返回回来,所以url地址没有变化。
Session
其实很简单,就是req是一次响应就是,发数据回数据,session就是将很多次的发数据回数据称为一次会话。就是当登录成功时,会有一个session标识,只要携带了这个对应的session标识就说明这次响应是在同一个会话里完成的。
jsp
本质上也是一个servlet,但是是基于网站的servlet,类似于在html里做一些动态设置。
request.getAttribute()
和 request.getParameter()
完全不是一回事。
request.getParameter和request.get
Attribute的区别
request.getParameter
是用来取 HTTP 请求参数 (比如表单提交、URL 里的 ?cmd=xxx
)。数据来源:浏览器提交。例子
http://localhost:8080/test.jsp?cmd=whoami
string val = request.getParameter("cmd"); // whoami
request.getAttribute("key")
是你自己在服务器端 手动存进去的属性,用
request.setAttribute("key", "xxx")
才能取。
数据来源:后端代码,不会自动和表单绑定。
request.setAttribute("key", "whoami"); String val = (String) request.getAttribute("key"); // whoami