黑马程序员技术交流社区

标题: webxiaojie [打印本页]

作者: x531661    时间: 2019-6-10 15:03
标题: webxiaojie
Servlet

概念:运行在服务器端的小程序。
* 将来我们自定义一个类,实现Servlet接口,复写方法。
Servlet入门案例
  
1. 创建JavaEE项目
  
       2.  定义一个类,实现Servlet接口
  
              *  public class ServletDemo1 implements Servlet
  
       3.  实现接口中的抽象方法
  
       4.  配置Servlet
  
               在web.xml中配置:
  
           <!--配置Servlet  -->
  
           <servlet>
  
               <servlet-name>demo1</servlet-name>
  
                <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
  
           </servlet>
  
      
  
           <servlet-mapping>
  
                <servlet-name>demo1</servlet-name>
  
                <url-pattern>/demo1</url-pattern>
  
           </servlet-mapping>
  
* 执行原理:
       1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
       2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
       3. 如果有,则在找到对应的<servlet-class>全类名
       4. tomcat会将字节码文件加载进内存,并且创建其对象
       5. 调用其方法
Servlet的体系结构
  
Servlet的体系结构      
  
       Servlet  -- 接口
  
              |
  
       GenericServlet  -- 抽象类
  
              |
  
       HttpServlet  -- 抽象类
  
  
       *  GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
  
              *  将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  
  
       * HttpServlet:对http协议的一种封装,简化操作
  
              1. 定义类继承HttpServlet
  
              2. 复写doGet/doPost方法
  
以后我们使用Serlet的标准代码:
  
public class MyServlet3 extends HttpServlet {
  
      @Override
      protected void doGet(HttpServletRequest  req, HttpServletResponse resp) {
      }
  
      @Override
      protected void doPost(HttpServletRequest  req, HttpServletResponse resp) {
  
      }
  }
  
使用注解开发Servlet
  
Servlet3.0:
  
       *  好处:
  
              * 支持注解配置。可以不需要web.xml了
  
  
       *  步骤:
  
              1.  创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  
              2.  定义一个类,实现Servlet接口
  
              3.  复写方法
  
              4.  在类上使用@WebServlet注解,进行配置
  
                     * @WebServlet("资源路径")
  
示例代码:
@WebServlet("/myServlet3")
  
public class MyServlet3 extends HttpServlet {
  
   
@Override
   
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
  
    }
  
   
@Override
   
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
  
    }
}
  
  
HTTP协议
概念:Hyper Text Transfer Protocol 超文本传输协议
       *传输协议:定义了,客户端和服务器端通信时,发送数据的格式
       *特点:
              1.基于TCP/IP的高级协议
              2. 默认端口号:80
              3.基于请求/响应模型的:一次请求对应一次响应。
              
请求信息
  
1. 请求行
  
              请求方式  请求url 请求协议/版本
  
              GET  /login.html  HTTP/1.1
  
  
              *  请求方式:
  
                     *  HTTP协议有7中请求方式,常用的有2种
  
                            *  GET:
  
                                   1.  请求参数在请求行中,在url后。
  
                                   2.  请求的url长度有限制的
  
                                   3.  不太安全
  
                            *  POST:
  
                                   1.  请求参数在请求体中
  
                                   2.  请求的url长度没有限制的
  
                                   3.  相对安全
  
       2. 请求头:客户端浏览器告诉服务器一些信息
  
              请求头名称: 请求头值
  
              *  常见的请求头:
  
                     1.  User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
  
                            *  可以在服务器端获取该头的信息,解决浏览器的兼容性问题
  
  
                     2.  Referer:http://localhost/login.html
  
                            *  告诉服务器,我(当前请求)从哪里来?
  
                                   *  作用:
  
                                          1.  防盗链:
  
                                          2.  统计工作:
  
       3. 请求空行
  
              空行,就是用于分割POST请求的请求头,和请求体的。
  
       4. 请求体(正文)
  
              *  封装POST请求消息的请求参数的
  
请求信息的字符串表示形式;//将来这一对字符串会变成request对象
  
POST /login.html?user=lisi    HTTP/1.1
  
                  Host: localhost
  
                  User-Agent: Mozilla/5.0  (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
  
                  Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  
                  Accept-Language:  zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  
                  Accept-Encoding: gzip,  deflate
  
                  Referer:  http://localhost/login.html
  
                  Connection: keep-alive
  
                  Upgrade-Insecure-Requests: 1
  
                  
  
                  username=zhangsan        
  
响应信息
  
1. 响应行
  
                     1.  组成:协议/版本 响应状态码 状态码描述
  
                     2.  响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
  
                            1.  状态码都是3位数字
  
                            2.  分类:
  
                                   1.  1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
  
                                   2.  2xx:成功。代表:200
  
                                   3.  3xx:重定向。代表:302(重定向),304(访问缓存)
  
                                   4.  4xx:客户端错误。
  
                                          *  代表:
  
                                                 *  404(请求路径没有对应的资源)
  
                                                 *  405:请求方式没有对应的doXxx方法
  
                                   5.  5xx:服务器端错误。代表:500(服务器内部出现异常)
  
  
2响应头:
  
格式:头名称: 值
  
常见的响应头:
  
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
  
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
  
值:
  
in-line:默认值,在当前页面内打开
  
attachment;filename=xxx:以附件形式打开响应体。文件下载
  
3.响应空行
  
4.响应体:传输的数据
  
  
响应信息的字符串表示形式:将来这个信息由Response对象设置。
  
HTTP/1.1 200 OK
  
              Content-Type:  text/html;charset=UTF-8
  
              Content-Length:  101
  
              Date:  Wed, 06 Jun 2018 07:08:42 GMT
  
  
              <html>
  
                <head>
  
                  <title>$Title$</title>
  
                </head>
  
                <body>
  
                hello , response
  
                </body>
  
              </html>
  
Servlet中的Request对象功能。
  
1. 获取请求行数据
  
(***)获取虚拟目录:/day14
  
        String getContextPath()
  
  
(***)获取请求URI:/day14/demo1
  
              *  String getRequestURI():              /day14/demo1
  
              StringBuffer  getRequestURL()   :http://localhost/day14/demo1
  
  
              *  URL:统一资源定位符 : http://localhost/day14/demo1     中华人民共和国
  
              *  URI:统一资源标识符 : /day14/demo1                                 共和国
  
  
2. 获取请求头数据
  
              *  方法:
  
              *  (***)String getHeader(String name):通过请求头的名称获取请求头的值
  
              
  
3. 获取请求体数据:
  
String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
  
  
Map<String,String[]> getParameterMap():获取所有参数的map集合
  
  
4.解决获取时候的中文乱码
  
***** 中文乱码问题:
  
       * get方式:tomcat 8 已经将get方式乱码问题解决了
  
       *  post方式:会乱码
  
       * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
  
Reuest的请求转发
  
5.请求转发。
  
*2. 请求转发:一种在服务器内部的资源跳转方式
  
1.      步骤:
  
1.      1.通过request对象获取请求转发器对象:RequestDispatcher  getRequestDispatcher(String path)
  
2.      
  
2.      2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse  response)
  
3.      
  
request. getRequestDispatcher(“/index.html”).  forward(request, response);
  
Request域对象。
作用: 共享数据:
       *域对象:一个有作用范围的对象,可以在范围内共享数据
       *request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
       *方法:
              1.void setAttribute(String name,Object obj):存储数据
              2.Object getAttribute(String name):通过键获取值
              3.void removeAttribute(String name):通过键移除键值对
Servlet中的Response对象功能。
  
* 功能:设置响应消息
  
       1.  设置响应行
  
              1.  格式:HTTP/1.1 200 ok
  
              2. 设置状态码:setStatus(int sc)
  
       2. 设置响应头:setHeader(String name, String value)
  
              
  
       3.  设置响应体:
  
              *  使用步骤:
  
                     1.  获取输出流
  
                            * 字符输出流:PrintWriter getWriter()
  
  
                            * 字节输出流:ServletOutputStream getOutputStream()
  
  
                     2.  使用输出流,将数据输出到客户端浏览器
  
Response的重定向功能
  
* 重定向:资源跳转的方式
  
              *  代码实现:
  
                     //1.  设置状态码为302
  
               response.setStatus(302);
  
               //2.设置响应头location
  
                response.setHeader("location","/day15/responseDemo2");
  
       //简单的重定向方法-以后用的技术
  
         response.sendRedirect("/day15/responseDemo2");
  
重定向和转发的区别
  
* forward 和  redirect 区别
  
重定向的特点:redirect   
  
                     1.  地址栏发生变化
  
                     2.  重定向可以访问其他站点(服务器)的资源
  
                     3.  重定向是两次请求。不能使用request对象来共享数据
  
* 转发的特点:forward
  
                     1.  转发地址栏路径不变
  
                     2.  转发只能访问当前服务器下的资源
  
                     3.  转发是一次请求,可以使用request对象来共享数据
  
响应乱码的解决:
  
* 乱码问题:
  
              1.  PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
  
              2.  设置该流的默认编码
           resp.setCharacterEncoding("utf-8");  
              3.  告诉浏览器响应体使用的编码
         resp.setHeader("Content-type","text/html;charset=utf-8");  
  
  
//简单的形式,设置编码,是在获取流之前设置《我们以后用的》
  
response.setContentType("text/html;charset=utf-8");
  
ServletContext对象
获取方式:
1. 通过request对象获取
              request.getServletContext();
       2.通过HttpServlet获取
              this.getServletContext();//this是servlet对象

作用:

  
1. 获取MIME类型:
  
              * MIME类型:在互联网通信过程中定义的一种文件数据类型
  
                     * 格式: 大类型/小类型   text/html         image/jpeg
  
  
              * 获取:String getMimeType(String  file)  //a.txt
  
2. 域对象:共享数据
  
              1. setAttribute(String  name,Object value)
  
              2. getAttribute(String name)
  
              3. removeAttribute(String name)
  
* ServletContext对象范围:整个web应用。
  
  
3. 获取文件的真实(服务器)路径 -- / 代表web文件夹
  
              1. 方法:String  getRealPath(String path)  
  
                     String b = context.getRealPath("/b.txt");//web目录下资源访问
  
                 System.out.println(b);
  
      
  
                String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
  
                System.out.println(c);
  
  
                String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
  
                System.out.println(a);
  






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2