servlet笔记

本文介绍了如何在Servlet中处理前端表单提交的数据,使用Map存储复选框等多值参数,并探讨了请求转发与重定向的区别。在处理表单数据时,应注意将字符串数组用于存储可能重复的key。此外,还讨论了请求域中的数据传递以及在转发和重定向中的应用,强调了两者在实际开发中的选择和应用场景。
摘要由CSDN通过智能技术生成

//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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值