//httpservlet的创建p21_15:00
1.在浏览器里打印内容
public class myHttpservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.print("<h1>Hello servlet<h1>");
}
}
2.设置登录页面(默认首页)
在.xml中配置
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
3.html文件提交复选框
<form action="" method="post">
username:<input type="tetx/html" name="username"><br>
password:<input type="password" name="userpwd"><br>
interest:
learning:<input type="checkbox" name="hobby"><br>
play:<input type="checkbox" name="hobby"><br>
food:<input type="checkbox" name="hobby"><br>
</body>
Map<String,String[]> getParameterMap() 这个是获取Map Enumeration<String> getParameterNames() 这个是获取Map集合中所有的key String[] getParameterValues(String name) 根据key获取Map集合的value String getParameter(String name) 获取value这个一维数组当中的第一个元素。这个方法最常用。 // 以上的4个方法,和获取用户提交的数据有关系。
-
-
- 思考:如果是你,前端的form表单提交了数据之后,你准备怎么存储这些数据,你准备采用什么样的数据结构去存储这些数据呢?
-
- 前端提交的数据格式:username=abc&userpwd=111&aihao=s&aihao=d&aihao=tt
- 我会采用Map集合来存储:
- Map<String,String>
key存储String
value存储String
这种想法对吗?不对。
如果采用以上的数据结构存储会发现key重复的时候value覆盖。
key value
---------------------
username abc
userpwd 111
aihao s
aihao d
aihao tt
这样是不行的,因为map的key不能重复。
Map<String, String[]>
key存储String
value存储String[]
key value
-------------------------------
username {"abc"}
userpwd {"111"}
aihao {"s","d","tt"}
注意:前端表单提交数据的时候,假设提交了120这样的“数字”,其实是以字符串"120"的方式提交的,所以服务器端获取到的一定是一个字符串的"120",而不是一个数字。(前端永远提交的是字符串,后端获取的也永远是字符串。
四个方法的使用
//username=zhangsan&userpwd=123&interest=s&interest=d
/*Map<String,String[]>
key value
---------------------------
"username" {"zhangsan"}
"userpwd" {"123"}
"interest" {"s", "d"} */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException{
/*1.最常用的方式 String getParameter(String name)*/
String username = request.getParameter("username");
String userpwd = request.getParameter("userpwd");
System.out.println(username);
System.out.println(userpwd);
/*2.既然是checkbox,调用方法:request.getParameterValues("interest")*/
String[] interests = request.getParameterValues("interest");
for(String i : interests){
System.out.println(i);
}
/*3.直接通过getParameterNames()这个方法,可以直接获取这个Map集合的所有key*/
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name);
}
/*4.获取参数Map集合*/
Map<String,String[]> parameterMap = request.getParameterMap();
// 遍历Map集合(获取Map集合中所有的key,遍历)
Set<String> keys = parameterMap.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.print(key+"=");
// 通过key获取value
String[] values = parameterMap.get(key);
for(String value : values){
System.out.print(value+",");
}
System.out.println();
/*4.输出结果
username=zhangsan,
userpwd=123,
interest=s,d,
}
请求域
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Date nowTime=new Date();
req.setAttribute("systime",nowTime);
Object obj=req.getAttribute("systime");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("req域当中取的系统当前时间"+obj);
}
请求转发
1.原理: 是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的。
// 第一步:获取请求转发器对象
RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
// 第二步:调用转发器的forward方法完成跳转/转发
dispatcher.forward(request,response);
// 第一步和第二步代码可以联合在一起。
request.getRequestDispatcher("/b").forward(request,response);
//注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
- 转发的下一个资源必须是一个Servlet吗?
不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html....
注意:转发的时候,路径的写法要注意,转发的路径以“/”开始,不加项目名。
关于request对象中两个非常容易混淆的方法
重定向
1.工作原理:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。。
2.实现命令
response.sendRedirect("请求地址")
//注意:重定向地址需要加上 项目名
//因为浏览器发送请求是需要加上项目名的
3.特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求次数
浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。
后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
4.缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
消耗在往返次数上,增加用户等待服务时间
转发和重定向区别
转发和重定向应该如何选择?什么时候使用转发,什么时候使用重定向?
- 如果在上一个Servlet当中向request域当中绑定了数据,希望从下一个Servlet当中把request域里面的数据取出来,使用转发机制。
- 剩下所有的请求均使用重定向。(重定向使用较多。)
- 他俩跳转的资源只要是服务器内部合法的资源即可。(Servlet,JSP,HTML).......
- 转发会存在浏览器刷新问题
解决乱码问题:
tomcat 10以前的都会出现乱码
post 请求体 设置:request.setCharacterEncoding(UTF-8);
post/get 响应乱码 设置 response.setContentType("text/html;charset=UTF-8");