servlet 获取请求和发送响应 以及 表单提交中的编码问题

关于表单提交中的编码问题 

对于post方法,可以直接更改request的编码

req.setCharacterEncoding("utf-8");
//接收表单数据
String username = req.getParameter("username");
String password = req.getParameter("password");

对于get方法就只能手动转换了,对post也同样有效

//接收表单数据
String username = new String(req.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
String password = new String(req.getParameter("password").getBytes("ISO-8859-1"),"utf-8");

 获取请求

  • 获取请求头数据
  • 获取请求行数据
  • 获取用户数据
//获取请求头数据
    //获取请求方式
    String method = req.getMethod();
    System.out.println("请求方式:" + method);
    //获取URL
	String url = req.getRequestURL().toString();
	System.out.println("URL:" + url);		
	//获取协议
	String agreement = req.getScheme();
	System.out.println("协议:" + agreement);
//获取请求行数据(键值对)
	//获取指定键的值
	String value = req.getHeader("Cookie");
	System.out.println(value);
	//获取所有的键
	Enumeration key = req.getHeaderNames();
	while(key.hasMoreElements()) {
		String k = (String)key.nextElement();
		String v = req.getHeader(k);
		System.out.println(k + ":" + v);
	}

发送响应 

//设置响应头
	resp.setHeader("key","123");//设置响应头,同键覆盖
	resp.addHeader("key","456");//设置响应头,同键不覆盖
	//设置编码格式
	resp.setHeader("content-type", "text/html;charset=utf-8");
	//resp.setContentType("text/html;charset=utf-8");
//设置响应状态码 
	resp.sendError(404,"我设置的error404");
//设置响应实体
	resp.getWriter().write("你好,我是Service");

Servlet 处理表单数据

  • String getParameter(String name):以字符串形式返回请求参数的值,或者如果参数不存在则返回 null
  • String[ ] getParameterValues(name):如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
  • Enumeration getParameterNames():获取表单所有name参数,返回一个枚举。则可以以标准方式循环枚举,使用 hasMoreElements() 方法来确定何时停止,使用 nextElement() 方法来获取每个参数的名称

 编写一个表单,通过post方法提交

用户名:
密 码:
单选按钮:中国 美国 法国
复选框:篮球 足球 乒乓球

表单界面显示

servlet 获取请求和发送响应 以及 表单提交中的编码问题_第1张图片

重写 doPost方法,在里面获取表单数据

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置响应内容类型
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = resp.getWriter();

		String s1 = coding(req.getParameter("user"));//获取user的值
		s1 = "用户名:"+s1;
		String s2 = coding(req.getParameter("password"));
		s2 = s1 +"
密码:"+s2; s1 = coding(req.getParameter("nationality")); s2 += "
国籍:" + s1; String[] s = req.getParameterValues("hobby");//获取同名的多个值 s2 += "
爱好:"; for(String temp:s) { s2 += coding(temp); } pw.write(s2); //获取全部的表单数据 pw.write("

-----完整表单获取------
"); Enumeration all = req.getParameterNames(); while(all.hasMoreElements()) { String name = (String)all.nextElement(); pw.write("
" + name+":"); String values[] = req.getParameterValues(name); for(String temp:values) { pw.write(coding(temp)); } } } private String coding(String s) { //处理编码为"utf-8" String res=""; try { res = new String(s.getBytes("ISO8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return res; }

获得返回的结果: 

servlet 获取请求和发送响应 以及 表单提交中的编码问题_第2张图片

练习——通过数据库验证登录信息是否正确

resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
//获取登录信息	
String user = req.getParameter("user");
String password = req.getParameter("password");
//声明JDBC对象
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println(1);
			//获取连接对象
			String url = "jdbc:mysql://localhost:3306/lcb?serverTimezone=GMT";
			conn = DriverManager.getConnection(url, "root", "lanse0305**");
			System.out.println(2);
			//创建sql命令
			String sql = "select * from Login where user=? and password=?";
			//创建sql命令对象
			ps = conn.prepareStatement(sql);
			System.out.println(3);
			//给占位符赋值
			ps.setString(1, user);
			ps.setString(2, password);
			//执行
			rs = ps.executeQuery();
			System.out.println(4);
			if( rs.next()) {
				pw.write("密码正确");
			}else {
				pw.write("密码错误!");
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			//关闭资源
			try {
				rs.close();
				ps.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

 

你可能感兴趣的:(后端基础)