j2ee多参数的传递方式(数组和字符串)

75 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第三天,[点击查看活动详情] (juejin.cn/post/709970… "juejin.cn/post/709970…")

---20220508
今天上机内容为继续做包,然后我这边对于第11个包进行一个讲解


首先打开所有文件,然后查看源码内容与实验要求

image.png\然后通过这边我们可以看出,其实就只是两个主要页面需要我们理解清楚

image.png


第一个页面操作

我们点开login.html文件,可以看到这边就是我们等等会运行的前端页面,老师给的初始文件较为简单,页面也比较粗糙

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录-用户名和密码传参</title>
</head>
<body>
	<form action="./LoginServlet" method="post">
		用户名: <input type="text" name="username" /><br />
		密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码:
		<input type="password" name="password" /><br />
		<input type="submit" value="登录" />
	</form>
</body>
</html>

那么这个就是在我们未作变化之前的登录页面。

image.png
我在这边稍微给他修改了一下,将页面进行美化,代码也较为简单,大家可以稍微参考一下

登录页面美化

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录-用户名和密码传参</title>
<style> 
html,body{
            height: 100%;
        }
        body{
            background: #006666;
        }
        h1{
            color: #FFF;
            text-align: center;
        }
        .container{
            margin: 100px auto;
            width: 30%;
        }
        form{
            background: #FFF;
            height: 300px;
            width: 100%;
            border-radius: 10px;
            position: relative;
        }
        label{
            color: #000;
            font-weight: bold;
            font-size: 20px;
            margin-left: 40px;
        }
         input{
            text-align: left;
            margin: 10px;
        }
        .input{
            width: 80%;
            height: 35px;
            margin-left: 40px;
        }
        .checkbox{
            margin-left: 30px;
        }
        a{
            text-decoration: none;
            font-weight: bold;
        }

        .left{
            margin: 20px;
        }
        .right{
            position: absolute;
            right: 20px;
        }
        </style>
</head>
<body>
  <div class="container">
  <h1>用户登录</h1>
	<form action="./LoginServlet" method="post">
	<br>
	<label for="username">用户名</label>
		<input type="text" name="username" id="username" class="input" value="" placeholder="用户名admin"/><br />
		<label for="pwd">密码</label><br>
		<input type="password" name="password" id="password" class="input" value="" placeholder="密码admin"/><br />
		<input type="submit" value="登录" />
		 <div class="checkbox" float="right">
                <input type="checkbox" name="">
                <span>记住密码</span>
            </div>
	</form>
  </div>
</body>
</html>

修改后页面如下

image.png 关于前端的内容其实并不是很重要 现在让我们来看一下LoginServlet部分

Loginservlet部分 这边我们可以看出使用的是重定向的方式处理登录以后的页面跳转 完成最简单的模拟用户登录检测 其中重点部分,代码中间有注释 那么写死的用户名和密码分别是"zhang2gongzi",“123456”.目前只是简单的模拟登录,大家可以自己尝试换一下

package com.javaee.response;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * @author zzl
 *
 */
public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username);
		System.out.println(password);
		// 写死一对用户名和密码,模拟用户登录检查,要注意业务控制
		if (("zhang2gongzi").equals(username) && ("123456").equals(password)) {
			// 重定向是客户端再发请求,所以/代表的是网站,而不是网站下的应用程序项目,这里要用相对路径
			response.sendRedirect("./welcome.html");
		} else {
			response.sendRedirect("./login.html");
		}
	}

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

image.png

image.png

第二个页面操作

上面第一个登录页面不是特别重要,目前我们这边来进行一下第二个页面,这个较为复杂一点

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>多参数传递</title>
</head>
<body>
 	<form id="form1" action="RequestParamsServlet" method="GET">
 	 	用户名:<input type="text" name="username"><br />
 	 	密&nbsp;&nbsp;&nbsp;&nbsp;码:
 	 	<input type="password" name="password">
         <br />
 	 	爱好:
 	 	<input type="checkbox" name="hobby" value="sing">唱歌
 	 	<input type="checkbox" name="hobby" value="dance">跳舞
 	 	<input type="checkbox" name="hobby" value="net">上网
 	 	<input type="checkbox" name="hobby" value="joke">打牌
 	 	<input type="checkbox" name="hobby" value="draw">画画
 	 	<input type="checkbox" name="hobby" value="piano">弹琴
 	 	<input type="checkbox" name="hobby" value="egame">玩游戏<br />
 	 	<input type="submit" value="提交">
 	</form>
 	<hr>
 	<form id="form2" action="ParamsServlet" method="GET">
 	 	用户名:<input type="text" name="username"><br />
 	 	密&nbsp;&nbsp;&nbsp;&nbsp;码:
 	 	<input type="password" name="password">
         <br />
 	 	爱好:
 	 	<input type="checkbox" name="hobby" value="sing">唱歌
 	 	<input type="checkbox" name="hobby" value="dance">跳舞
 	 	<input type="checkbox" name="hobby" value="net">上网
 	 	<input type="checkbox" name="hobby" value="joke">打牌
 	 	<input type="checkbox" name="hobby" value="draw">画画
 	 	<input type="checkbox" name="hobby" value="piano">弹琴
 	 	<input type="checkbox" name="hobby" value="egame">玩游戏<br />
 	 	<input type="submit" value="提交">
 	</form>
 	<hr>
 	<form id="form3" action="paramsservletplus" method="GET">
 	 	用户名:<input type="text" name="username"><br />
 	 	密&nbsp;&nbsp;&nbsp;&nbsp;码:
 	 	<input type="password" name="password">
         <br />
 	 	爱好:
 	 	<input type="checkbox" name="hobby" value="sing">唱歌
 	 	<input type="checkbox" name="hobby" value="dance">跳舞
 	 	<input type="checkbox" name="hobby" value="net">上网
 	 	<input type="checkbox" name="hobby" value="joke">打牌
 	 	<input type="checkbox" name="hobby" value="draw">画画
 	 	<input type="checkbox" name="hobby" value="piano">弹琴
 	 	<input type="checkbox" name="hobby" value="egame">玩游戏<br />
 	 	<input type="submit" value="提交">
 	</form>
</body>
</html>

form.html运行页面如下

image.png 传递method这一块因为我之前在这篇文章里介绍过[(doGet()与doPost)](j2ee用户登录模拟(详解)与doGet()doPost()差别(第十三天学习j2ee) - 掘金 (juejin.cn))的差别,所以这次这边就不会再讲解了,大家自己看以前的文章吧

form1具体讲解 我们首先在第一个表格中填入信息,然后,选择爱好,提交所填和所选的信息,其中form1的action=“RequestParamsServlet”,传递方式method=“GET”

image.png

image.png
因为使用Get(),所以这边可以看到

image.png console当中的输出

image.png

具体给大家介绍一下这边的action

RequestParamsServlet

package com.javaee.request;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * @author zzl
 */
public class RequestParamsServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("this is RequestParamsServlet...");
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("username");
		String password = request.getParameter("password");
		// name=new String(name.getBytes("iso8859-1"),"utf-8");
		System.out.println("用户名:" + name);
		System.out.println("密  码:" + password);
		// 获取参数名为“hobby”的值
		String[] hobbys = request.getParameterValues("hobby");
		System.out.print("爱好:");
		for (int i = 0; i < hobbys.length; i++) {
			System.out.print(hobbys[i] + ", ");
		}

		// 到别的Servlet处理输出
		RequestDispatcher rd = request.getRequestDispatcher("/ParamsServlet");
		rd.forward(request, response);
		
		System.out.println("RequestParamsServlet end...");
	}

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

获取单个参数值,直接输入

String name = request.getParameter("username");
String password = request.getParameter("password");

获取多个参数值,以数组方式组织

String[] hobbys = request.getParameterValues("hobby");

那么此代码是在别的servlet当中进行的输出,调用了新的ParamsServlet.java

form2具体详解

ParamsServlet

第二个要讲解的是圈起来的这个

image.png

image.png

package com.javaee.response;

import java.io.IOException;
import java.io.PrintWriter;

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


/**
 * @author zzl
 */
public class ParamsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ParamsServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("<br>this is ParamsServlet...");
		// 设置输入的编码
		request.setCharacterEncoding("utf-8");
		// 单个参数
		String name = request.getParameter("username");
		String password = request.getParameter("password");
		// 设置输出类型和编码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("用户名:" + name);
		out.println("<br />密码:" + password );
		
		// 获取参数名为“hobby”的值【里面可能会有多个值---构成数组结构】,输出到页面
		String[] hobbys = request.getParameterValues("hobby");
		out.print("<br />爱好:");
		if (hobbys == null) {
			out.println("没有爱好.");
		}else {
			for (int i = 0; i < hobbys.length; i++) {
				out.print(hobbys[i] + ", ");
			}
		}
		out.println("<br />");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

这部分代码其实和上一个很像,差别在于这边多参数的接收用的是字符串。重点是最后一个’,'要怎么隐藏的问题

最后一个“,”的隐藏

这是一个比较常用的方法,去掉最后一个字符串的值

for (int i = 0; i < hobbis.length; i++) {
    sb.append(hobbis[i]+",");
}
// 处理最后一个逗号
str = sb.substring(0, sb.length()-1);

form3的详解

这个就没什么特别的了,只有他接受的method=“GET”,所以会隐藏密码,更加安全罢了