Servlet3_单例多线程_转发重定向_登录案例

续Servlet基础二  https://blog.csdn.net/qq_42980244/article/details/96870466

1. Response
1.1 response处理页面中文乱码的问题
Response为响应
     1)获得响应中的字节流  中文并无乱码情况

	//获取响应中的字节流
		OutputStream output = response.getOutputStream();
		byte[] b = new String("你好啊!").getBytes();
		output.write(b);

    2)获取响应中字符流  中文乱码
解决办法:在方法第一句加上response.setContentType("text/html;charset=utf-8");
或者response.setHeader("content-type", "text/html;charset=utf-8");

	//设置响应头中的页面编码格式
		//response.setHeader("content-type", "text/html;charset=utf-8");
		
		//设置content-type响应头
		response.setContentType("text/html;charset=utf-8");
		//获取响应中的字符流
		PrintWriter writer = response.getWriter();
		writer.print("我是中文");
//3s之后刷新到百度
		response.setHeader("refresh", "3,url=http://www.baidu.com");

1.2  Request获取请求参数
1)用localhost:8800/XX/XXX?username=”xiaomingh”&sex=”nv”访问Servlet
其中username=”xiaomingh”&sex=”nv”为请求参数
通过request.getParameter(“username”)和request.getParameter(“sex”)可以获取等号右边的值

2)当请求参数是中文时,会出现乱码情况
根据提交方式不同,处理乱码的方式也不同
Get方式:
解决方法1:将服务器默认编码格式iso-8859-1清空转成字节数组,再把字节数组转化为utf-8的字符串byte[] b = username.getBytes("iso-8851-1");username=new String (b,"utf-8");

解决办法2:在tomcat/conf/server.xml中,connecter节点配置属性URIEncoding="utf-8";该方法针对tomcat7或以下版本,以上版本不用设置也不会出现乱码情况
Post方式:
在dipost()方法中的第一行添加request.setCharacterEncoding("utf-8");

2.Request的常用方法
getParameter()   获取请求参数,获取表单中某个元素的name属性的值
getParameterValues() 获取一个name的所有值,返回数组,常用于复选框


3.Servlet小试牛刀
获取页面传来的参数
Index.html

<!DOCTYPE html>
<html>
  <head>
    <title>index.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
 	<form action="SD" method="get">
		<input name="username"><br/>
		<input name="password">
	爱好:
		<input name="hobby" type="checkbox" value="篮球"> 篮球
		<input name="hobby" type="checkbox" value="足球"> 足球
		
		<button>提交</button>
	</form>  
  </body>
</html>

代码:

package com.c_Servlet;
public class ServlerDemoD extends HttpServlet {	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//同一个name对应多个value--复选框
		String[] hobby = request.getParameterValues("hobby");
		
		System.out.println(username+"--"+password);
		System.out.println(Arrays.toString(hobby));
	
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		doGet(request, response);
	}

}

结果:

点击提交 控制台打印信息

4.Servlet生命周期
Servlet容器调用init()进行初始化
Servlet容器调用service()进行客户端请求处理
Servlet容器调用调用destroy()终止请求
最后JVM垃圾回收


5.Servlet对单例多线程的解释
单例:无论请求多少次Servlet,最多只有一个Servlet实例
多线程:当有多个客户端并发请求Servlet时,服务器会启动多个线程去分别执行该Servlet的service()


6.Servlet的转发与重定向
6.1转发request.getRequestDispatcher(“/XX”);
带数据的页面跳转,相当于转发数据
转发地址栏不变
一次请求,一次响应
可以访问到WEB-INF目录下的文件
6.2重定向 response.sebdRedirect(“xx”);
不带数据的页面页面跳转 相当于重新访问一个页面
重定向地址栏会改变
两次请求,两次响应
不可以访问到WEB-INF目录下的文件
6.3登陆案例(基础)
带错误信息提示+数据回显

package com.d_reqAndrespo;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

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

public class AServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		//获取参数
		String username = request.getParameter("username");
		String pwd = request.getParameter("password");
		HashMap<String,String> errorMap = new HashMap<String,String>();
		//判断数据
		if(username == null || username.trim().isEmpty()){
			errorMap.put("uerror", "用户名不能为空");
		}else if(!username.matches("^.{3,16}$")){
			errorMap.put("uerror", "用户名只能是3-16位");
		}
		
		if(pwd == null || pwd.trim().isEmpty()){
			errorMap.put("perror", "密码不能为空");
		}else if(!pwd.matches("^\\w{6,18}$")){
			errorMap.put("perror", "密码只能是6-18位数字字母下划线");
		}
		
		if(errorMap.size() > 0){//有错误
			System.out.println("登陆失败");
			//把错误信息设置到request域对象中
			request.setAttribute("error", errorMap);
			//将数据转发回登录页面
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else{
			//重定向到首页
			response.sendRedirect("index.jsp");
			System.out.println("登陆成功");
		}
	}
		
	

	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		doGet(request, response);
	}

}

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'login.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
     <form action="rea">
    	<input name="username" value="${param.username }">
    	<div style="color:red;">${error.uerror }</div>
    	<br>
    	<input name="password" >
    	<div style="color:red;">${error.perror }</div>
    	<br>
    	<button>提交</button>
    </form>
  </body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值