servlet基础知识 二

12年前
1、例子:
form.html文件抓包分析
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Form</title>
 </head>
 <body>
  <h1>
   表单
  </h1>
  <form action="go" method="get">
  <!--action,表示提交给谁;method表示用什么方式来提交一般使用post来提交-->
   <input type="text" name="user" value="java"/>
   <!--name的意义?将来这个表单提交的时候,name的值作为提交信息的名称-->
   <input type="text" name="pwd" />
   <input type="password" name="pwd1"/>
   <!--type="password",在页面上显示时,输入的内容变成了*号-->
   <input type="hidden" name="id" value="123" />
   <!--type,hidden,在页面上不显示-->
   <input type="submit" value="提交" />
  </form>
 </body>
</html>
其中meta    Content-type:text/html;charset=utf-8
 

全英文
user=memeory&abc=123&pwd=hello
      =    = 
memory&abc=123  
user=memeory%26abc%3D123&pwd=haha
        ==       ==
%跟一16进制的数据,表示一个字符
中文
user=%ED%BD%A0%ET%A5%BD
        ===================
  一个中文,一个utf8的编码是3个字节,所以上面是2个字
  一个中文,gbk编码是2个字节
2、form文件提交的数据 ,会以编码的形式出现在文件中,就要看浏览器用什么的编码打开页面就用什么编码来传输数据
服务器必须通过某种方法知道浏览器是用什么编码方式提交的
 
URLEncoder.encode
URLDecoder.decode

3、servlet如何获取表单的数据??
 
package org.whatisjava.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FormServlet extends HttpServlet{
 public void service(HttpServletRequest request,HttpServletResponse response)
     throws ServletException,IOException{
  //获取请求协议中提交的文本数据
  //tomcat对于特殊字符默认用ISO 8859-1解码
  //
  request.setCharacterEncoding("utf-8");
  //这句话必须写在第一个getParameter之前
  
  String user=request.getParameter("user");
  String pwd=request.getParameter("pwd");
  
  System.out.println(user);
  System.out.println(pwd);
  
  
 }
}
 
4、练习
 
 表格
 添加一个新员工
 添加完成后出现新的员工列表,并返回对应的
 
 
5、Statement与 PreparedStatement的区别
 
Statement
 
 String user=request.getParameter("user");
 String pwd=request.getParameter("pwd");
 String url="";
 String username="";
 String password=""
 Class.forName("");
 Connection conn=DriverManager.getConnection(url,username,password);
 Statement stmt=conn.createStatement();
 
 ResultSet rs=stmt.executeQuery("
 select count(*) from t_user
 where user='"+user+"'   and pwd='"+pwd+"'
 ");
 //返回结果是1则存在,返回0则不存在
 
 采用以上方法是有问题的,那么是什么问题呢  ?
 
 假设 第一个文本框 输入 hahaha,第二个 文本框  1'or'2'='2
 那么我们把其放入 以上 select语句中
 select count(*) from t_user where user='hahaha'  and pwd='1'or'2'='2'
 
 rs.next();
 if (rs.getInt(1)!=0){
 //登录成功
 }
 
 SQL Injection!!!
 
PreparedStatement
 
 String user=request.getParameter("user");
 String pwd=request.getParameter("pwd");
 String url="";
 String username="";
 String password=""
 Class.forName("");
 Connection conn=DriverManager.getConnection(url,username,password);
 PreparedStatement ps=conn.createStatement("
 select count(*) from t_user
 where user=? and pwd=?
 ");
 ps.setString(1,user);
 ps.setString(2,pwd);
 ResultSet rs=ps.executeQuery();
 
PreparedStatement已经屏蔽了大多数的 sql注入攻击的
6、重定向
   CLIENT   SERVER
 A----------->B第一次请求
 <------------   response里面带有重定向的url  C
 ------------>C第二次请求
 <------------
 并且地址栏会发生变化成重定向后的地址
抓包分析:
第一次请求:
GET /serlvet02/redirect
...
Connection:keep-alive;

响应
HTTP/1.1 302 Moved Temporarily
Server:Apache=coyote/1.1
Location:
http://localhost:8080/servlet02/target.html
Content-Length:0
第二次请求:
GET /servlet02/taget.html
说明:
servlet只是通过api来生成重定向的位置
http协议本身就支持重定向
response.sendRedirect("target.html");  //重定向的location位置
7、
问题:web.xml在什么时候加载
web.xml在服务器服务启动的时候就将该文件加载到了内存中
问题:一个页面会有多个请求比如文本请求\图片请求等
 
 
8、
如何让服务器发送一个图片到客户端浏览器?
html文件中,加载一个图片文件
<img src="img/tiger.jpg" width="200" height="260"/>
 
9、如何用程序动态生成图片?
比如验证码图片
swing画图
图片在内存中是什么样的?
是以位图来呈现的,位图以像素点个数,一个点的颜色个数
1个像素点=24位真彩图=3个字节(3红绿蓝,1色8位),每颜色颜色值为0-255.3个色都为255则为白,都为0则为黑
3个字节24位=2的 24次方,1个像素就是24位(3个字节)
颜色数和像素数
 内存里面先可以生成一个点阵
  //设置响应类型
  response.setContentType("image/jpeg");
  
  BufferedImage image=new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);
  //可以封存图片在内存中的点阵信息。图片的内存影像
  //TYPE_INT_RGB   RGB,红绿蓝
  
  Random r = new Random();
  Graphics g = image.getGraphics();
  g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
  g.fillRect(0, 0, 600, 500);
  g.setColor(new Color(0,0,0));
  String number = String.valueOf(r.nextInt(99999));
  g.drawString(number, 5, 15);
  // 压缩成jpeg格式
  OutputStream os = response.getOutputStream();
   //response.getWriter();//前面已经应用过response的输出,主要是输出文本具有编码作用(字符流)
   //输出普通字节流的话应该调用getOutputStream();
  //在这里也可以直接将其输出,但是太大,可以通过JPEGCodec压缩后输出
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
  // 把BufferedImage对象中的图像信息编码后
  // 向创建该对象(encoder)时指定的输出流输出
  encoder.encode(image);
response.getWriter()--主要是输出文本
response.getOutputStream()-----主要是输出流
图片识别技术----难度系数比较大
get是协议里面不能带数据,但是可以通过地址栏来携带数据
get和post区别
IE浏览器,地址栏里面最多是2k
post提交的时候,其传输的数据受到服务器的限制
提交的不是文本的话,必须用post
练习中碰到的问题:
 a、out.println("<td><a href='del?id="+rs.getString(1)+"'>delete</a>"+"</td>")
 认真理解这么写的格式:''与""的互相嵌套
 
 while(rs.next()){
    out.println("<tr>");
    out.println("<td>"+rs.getString(1)+"</td>");
    out.println("<td>"+rs.getString(2)+"</td>");
    out.println("<td>"+rs.getString(3)+"</td>");
    out.println("<td><a href='del?id="+rs.getString(1)+"'>delete</a>"+"<td>");
    out.println("</tr>");
   }
 在刷新的时候,同时将href重定向的地址动态加载
 在此练习中可以延伸下批量删除如何实现(在这里可以变更成选择框批量删除);
 更改信息(ID不变)
 
 
 b、
 
 
 
 
10、如何用程序动态生成图片?
 
11、为什么要配置隐藏input呢??
隐藏表单(隐藏域)
   <input type="hidden"   name="" value="">
     ====
     text
     checkbox
     button
     password
     sumbit
是为了提交form
12、Statement和PreparedStatement的参数索引是从1开始
  Class.forName("com.mysql.jdbc.Driver");
  Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test1","root","54255425");
  PreparedStatement ps=conn.prepareStatement("update emp set name=?,salary=? where id='"+id+"' ");
  
  ps.setString(1, name);//是给SQL语句中的第一个?赋予值
  ps.setFloat(2, Float.parseFloat(salary));//是给SQL语句中的第二个?赋值
  //ps.setString(parameterIndex, x),其中参数索引是从1开始
  //java.sql.SQLException: Parameter index out of range (3 > number of parameters,
  //which is 2).