severlet get post 请求 响应

来源:互联网 发布:gopro软件中文版 编辑:程序博客网 时间:2024/06/05 11:11
请求方式相关内容
请求: 从客户端向服务器端发送数据.
    常见的请求方式: get post
  
        常见的get请求: 表单的get提交 和 超链接 ,直接访问
        当服务器接收到get请求时,调用Servlet类中的doGet().
  
    1. get请求特点:
        1.get请求会根据"标签name=值"格式,将所有数据填充到地址栏中.
        2.get请求通过url地址传递数据,url地址后的数据不能大于1kb.
        缺点:
            不安全
  
    常见的post请求: 表单的post提交.
        当服务器接收到get请求时,调用Servlet类中的doPost().
  
    2.post请求特点:
        1.post请求不会将传递服务器的数据填充到地址栏
        2.post请求实质是通过请求实体传递数据,理论上传递数据的大小不受限制.
  
    3.get请求和post请求:
        1.get请求会将请求数据填充到地址栏--不安全. post请求不会将请求数据填充到地址栏--安全
        2.get请求通过URL传递数据,数据不能大于1kb. post请求通过请求实体传递数据,数据大小不限
        3.当有个请求时,get请求会迅速处理,不会形成请求队列. post请求有可能形成请求队列.
        
    4.  URL传参格式: ..../项目名/资源名?参数名1=值1&参数名2=值&...
        注意: 整个路径中不能含有多余的符号,比如空格.    
 ======================================================================================
URL的完整格式
    scheme://host.domain:port/path/filename
    网络协议:IP地址(虚拟地址):端口号/路径;参数?查询数据#锚点
<scheme>: 网络协议
http协议  80端口
pop3协议--用于邮件
ftp协议:文件上传,下载
https 443端口  加密传输的HTTP
@<host>主机地址(IP地址)
<port>  端口号
<path >  路径   
绝对路径  从根目录开始找
相对路径 相对于当前文件开始找
;<params>--查询参数
涉及到了cookie
?<query>--请求数据
#<frag> --锚点
---------------------------------
请求方式在severlet中的实现
    1.客户端请求服务器
        a.客户端输入网址
            http://127.0.0.1:8080/myWeb/html/MyHtml.html(这是我的网址)
            访问页面后,提交
                <form action="../enter" method="post">
                    使用POST方式提交   
                   1. webRoot/enter  是虚拟路径,(如果找不见)
                    进到xml中来--->找到类全名--->Myseverlet.java(调用dopost()方法)
                    
                   2.../enter (出html包 找到webRoot/enter  可是没有enter )  
                    /enter  绝对路径好像是不可以的(webRoot就是/,就是根目录)---为毛??
    
        b.服务器响应客户端
            发生在找到severlet类包之后
                响应: 服务器向客户端传递数据
                响应方式: 
                    转发
                        概念:
                            由Web组件1 将 request和response对象 传递给 下一个Web组件(通过下一个web组件响应)
                            整个过程在服务器端进行,使用post方式,不影响 location
                        过程: 
                            浏览器---请求A--->组件1: 处理/不处理 ---请求A--->组件2:
                            处理/不处理----请求A---->组件3....---响应-->浏览器
                        代码: 
                            请求对象.getRequestDispatcher("组件路径").forward(请求对象, 响应对象);
                    重定向
                        概念;
                            由Web组件1(返回响应)更改浏览器的地址栏,并向转向新路径.[告诉浏览器,访问新的Web组件/页面]
                            你改人家地址栏,写了另一个组件地址()---->肯定变成了get方式了
                            所以,在服务器端使用doGET()方法处理
                        过程: 
                            浏览器---请求A--->组件1: 处理/不处理----更改浏览器地址栏--->浏览器请求新路径
               代码: 
                            响应对象.sendRedirect("新路径");
--------------------------------------------
Myseverlet核心代码
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doPost");
String name=request.getParameter("name");//获得请求对象中的指定参数的值
String password=request.getParameter("password");//获得请求对象中的指定参数的值
System.out.println("账号: "+name+" 密码:"+password); //在服务器端打印出客户端请求的的账号,密码
if (name.equals("tom") && password.equals("123456")) {//成功,字符串比较不可以使用"=="
//转发: SuccessServlet
request.getRequestDispatcher("SuccessServlet").forward(request, response);
} else {//失败,转到FailureServlet.java文件,执行相关操作(这是一个路径吧)
//重定向: FailureServlet
response.sendRedirect("FailureServlet");
}
}


//初始化
public void init() throws ServletException {
System.out.println("初始化...");
}


}
SuccessServlet代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");
        /* text/html;charset=UTF-8这一句修改编码,对中文解析很重要 */
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("  <BODY>");
out.println("<h1>恭喜您登陆成功!</h1>");
out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
 FailureServlet代码   
    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


response.setContentType("text/html;charset=UTF-8");
        /* 修改HTML文件编码 */
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("  <BODY>");
out.println("对比起,登陆失败!");
out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
---------------------------------------------
关于请求和响应数据的编码问题:


项目编码与网页编码必须一致,数据库编码可以与项目不一致.


中文编码:gbk,gb2312,utf-8


mysql: gbk
网页: UTF-8
项目/工作区: UTF-8


编码处理技巧:
请求数据的编码格式比较特殊:
    1.处理POST请求中数据:
        request.setCharacterEncoding("UTF-8");//设置请求对象中数据的编码格式
        response.setCharacterEncoding("UTF-8");//设置响应数据的编码格式


    2.处理GET请求中数据:
        String name=request.getParameter("name");//获得请求对象中的指定参数的值
        name=new String(name.getBytes("ISO-8859-1"),"UTF-8");




响应数据的编码控制: 
    1.控制(由服务器生成的网页)生成网页的编码
        response.setContentType("text/html;charset=UTF-8"); 
    2.设置响应数据的编码格式    
        response.setCharacterEncoding("UTF-8");
    
 -------------------------------
代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setCharacterEncoding("UTF-8");//设置响应数据的编码格式

System.out.println("doGet....");
String uname=request.getParameter("uname");//获得请求对象中的指定参数的值
//设置请求函数的编码--记下就好
uname=new String(uname.getBytes("ISO-8859-1"),"UTF-8");
String pwd=request.getParameter("pwd");//获得请求对象中的指定参数的值
System.out.println("账号: "+uname+" 密码:"+pwd);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//一问一答(一次查询,不可以回复多个响应,因此之前的删了)
        
        //设置请求对象中数据的编码格式
request.setCharacterEncoding("UTF-8");
        //设置响应数据的编码格式
response.setCharacterEncoding("UTF-8");
        
String uname=request.getParameter("uname");//获得请求对象中的指定参数的值
String pwd=request.getParameter("pwd");//获得请求对象中的指定参数的值
System.out.println("账号: "+uname+" 密码:"+pwd);
System.out.println("doPOST 函数"); 
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
        
        
原创粉丝点击