===============
既然有客户端,那么应该就有网页了
<h2>输入帐号密码</h2>
<!-- 这里填写的是Servlet的url-pattern -->
<form action="_006_">
帐号: <input type="text" name="username"/><br/>
密码: <input type="text" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
这是servlet
static int num=0;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//获取数据,这个Parameter是我们提交表单的时候name的数值
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println(username+" "+password);
//获取输出流
PrintWriter pw1=response.getWriter();
//校验数据
if ("admin".equals(username) && "123".equals(password))
{
// 设置状态码,302代表成功,然后下面的setHeader才有效,重定向不需要设置这个
// response.setStatus(302);
//获取之前的次数,然后+1
// Object num=getServletContext().getAttribute("count");
// Integer oldnum=0;
// if (num!=null)
// {
// oldnum=(Integer)num;
// }
//直接利用static来加也可以
num++;
//设置一个属性,这个属性是用来计算登录成次数的
ServletContext sev1=super.getServletContext();
sev1.setAttribute("count", num);
//设置跳转的页面,这是早期写法
//response.setHeader("Location","_006_successful.html");
//现在一般直接写重定向
response.sendRedirect("_006_successful.html");
//或者写转发请求
//request.getRequestDispatcher("_006_successful.html").forward(request, response);
//这2者的区别,重定向是发送302和location给客户端,然后客户端去跳转到页面去
//地址栏会是真实的页面地址
//而转发请求是服务器内部给我们跳转到那个页面去,地址栏还是之前的地址
}else
{
//会直接向屏幕输出内容
pw1.write("login flase");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
这是跳转到的页面
<h1>登录成功</h1>
<a href="_006_success">点击此获取登录次数</a>
这是获取结果的servlet
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//获取计算后的count
ServletContext sev1=super.getServletContext();
Integer count=(Integer)sev1.getAttribute("count");
//直接向网页写入内容
response.setContentType("text/html; charset=UTF-8");
response.getWriter().write("登录了"+count.intValue()+"次");
}
下面是编码问题
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// get数据在地址栏输入即可 ?user=huangtiandi&password=123 前面有一个?代表参数和路径的分割
test01(request);
}
// 响应数据乱码问题
private void test04(HttpServletResponse response) throws IOException
{
// 以字符流的方式写数据,只能写文字
// response.getWriter().write("<h1>hello<h1>");
// 以字节流的方式写数据
response.getOutputStream().write("<h1>hello2<h1>".getBytes());
// 指定输出到客户端的时候,这些文字使用UTF-8编码
// response.setCharacterEncoding("UTF-8");
// 但是使用字节流的时候,上面的设置文字编码肯定是不管用了
// 因为java是utf-8的,所以输出去的字节也是utf-8形式的
// 所以我们可以设置输出的字节流是什么形式的
// 当然浏览器那边也需要相应的设置一下
// response.getOutputStream().write("wwsaf刚".getBytes("GB2312"));
// 规定浏览器看这份数据的时候,用什么编码来看
// 这个text/html是固定的
// response.setHeader("Content-Type", "text/html; charset=GB2312");
// 但是还有一个终极的方案,这个会把输出的流变成指定的编码
// 而且还会设置浏览器用什么方式解码 ,一般推荐用这个方法,后面用框架的时候不需要考虑这些
response.setContentType("text/html; charset=GB2312");
}
// get请求(提交)的数据的中文乱码问题
// 因为tomcat7.x以上get方式好像就不支持中文作为参数,用了就异常,所有这里实验不了
// 如果是7.x以下就用下面的方法转码,或者用post方式传参数也可以
private void test03(HttpServletRequest request) throws UnsupportedEncodingException
{
Enumeration<String> parmNames1 = request.getParameterNames();
while (parmNames1.hasMoreElements())
{
String name = (String) parmNames1.nextElement();
String value = request.getParameter(name);
// get过来的数据,在url已经编码过了,这码和java的不同,所以我们看到的是乱码
// getParameter里面默认使用iso-8869-1去解码,而我们不应该用这个去解码
// 所以要让文字先编码回到iso-8869-1对应的字节数组的方式,再按utf-8解码
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
// 方法2
// 直接在tomcat的conf里的server.xml配置,
// <Connector connectionTimeout="20000" port="8080"
// protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
// 添加URIEncoding="UTF-8"
// 以后get请求过来的数据永远是UTF-8
System.out.println(name + "==" + value);
}
}
// 获取我们提交的参数
private void test02(HttpServletRequest request)
{
// 方法1
// //获取所有参数的枚举
// Enumeration<String> parmNames1=request.getParameterNames();
// while (parmNames1.hasMoreElements())
// {
// String name = (String) parmNames1.nextElement();
// String value=request.getParameter(name);
// System.out.println(name+"=="+value);
// }
// 方法2 一般是用方法2
// //获取所有参数的map
// Map<String, String[]> map1=request.getParameterMap();
// Set<Entry<String,String[]>> set1= map1.entrySet();
// Iterator<Entry<String,String[]>> iterator1=set1.iterator();
// for (Entry<String, String[]> entry : set1)
// {
// String name=entry.getKey();
// String value=entry.getValue()[0];
// System.out.println(name+"=="+value);
// }
// 方法3
// 获取所有参数的map,但用keySet来遍历
Map<String, String[]> map1 = request.getParameterMap();
Set<String> set1 = map1.keySet();
Iterator<String> iterator1 = set1.iterator();
while (iterator1.hasNext())
{
String name = (String) iterator1.next();
String value = map1.get(name)[0];
System.out.println(name + "==" + value);
}
}
// 获取提交的头数据,不是我们手动提交的,头数据一般是浏览器发送的
private void test01(HttpServletRequest request)
{
// 获取所有的头数据,浏览器提交的头数据名称
Enumeration<String> headers1 = request.getHeaderNames();
while (headers1.hasMoreElements())
{
String name = (String) headers1.nextElement();
// 根据名称获取头数据的数值
String value = request.getHeader(name);
System.out.println(name + value);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}