• Servlet---基础、转发重定向、编码问题解析


    servlet   是运行在服务器端的三大web组件之一 【web三大组件:Servlet  Filter   Listener】
         是处理客户端请求的 还有表单提交的请求
     
          接收请求:接收前端请求
         处理请求:去数据库查询,获取数据库的数据
         返回结果:
    请求与响应的过程:下图
     

    如何写简单的servlet

         1)自定义一个servlet类实现servlet接口,实现接口就意味着实现接口的方法

    public class AServlet implements Servlet{}
    

          2)在web.xml文件中注册自定义的servlet

    <!-- servlet标签用于向服务器注册一个servlet -->
      <servlet>
      <!-- servlet-name是我们使用的,我们使用这个servlet-name对servlet进行配置 -->
      <servlet-name>AServlet</servlet-name>
      <!-- servlet-class是自定义servlet的全类名,这个全类名是服务器使用,服务器用这个全类名创建一个servlet实例(对象) -->
      <servlet-class>com.neuedu.Servlet.AServlet</servlet-class>
      </servlet>
     
    <!-- servlet-mapping是用于做映射请求的 也就是输入什么地址会到当前servlet下处理-->
      <servlet-mapping>
          <servlet-name>AServlet</servlet-name>
          <url-pattern>/AServlet</url-pattern>
      </servlet-mapping>
    
    //注意:<url-pattern>标签中指定的映射路径不必和<servlet-name>指定的内容保持一致
    只有浏览器地址栏中请求的url和<url-pattern>标签中的映射一致的时候,我们自定义的servlet类才会处理这个请求
    
    servlet 有广义、狭义之分:
         广义servlet:实现了Servlet接口的类都是广义的Servlet,自定义的servlet就是广义的
         狭义servlet:指jdk中提供的servlet接口

    init方法,在创建对象的时候调用,整个生命周期只被调用一次(因为servlet只创建一个对象)
    servlet 生命周期 :由产生到销毁
    servlet是由tomcat服务器管理
    1. 构造方法:只会在第一次访问servlet类的时候调用一次,调用一次就说明 servlet是单例的,多线程的!同时也是非线程安全的,也就是说在servlet中尽量不要再service方法中操作全局变量!!
    2. init方法:只会在第一次访问servlet的时候调用一次,对servlet对象进行初始化操作
    3. 调用service方法处理请求:在每次访问这个servlet的时候都调用一次,而且我们的业务逻辑也写在service方法
    4. destroy 销毁:只会在项目卸载的时候调用,也就是服务器关闭,tomcat关闭的时候
    处理请求,跳转页面的两种方式

    1.转发  --地址不变  只请求一次  不能跨域

    request.getRequestDispatcher("要转发到的地址").forward(request,response);//地址栏地址不变

    2.重定向  --地址变了  多次请求  可以跨域

    response.sendRedirect("要转到的地址");//地址栏地址变了
    
     
    在jsp页面中写
    <form action="abc" method="post">
         用户名<input type="text" name="userid"><br>
         密码<input type="password" name="pwd"><br>
         <input type="submit">
    </form>
    //action method必须有,method为post或者get,使用get会在地址上显示你输入的值
    红框内为输入的值   形式是 name=输入值&name=输入值,但是这样会泄露密码,所以表单提交一般用post  不显示信息

    四个作用域 ---配合jstl用
    • pageContext --当前页面存放, 只能在当前页面取出
    • request --当前页面存放 ,转发页面取出
    • session --当前会话  失效时间(在淘宝页面15分钟不动的话,再次动需要重新登陆)不能跨浏览器,换另一个浏览器需重新登录
    • aqqlication  --当前服务器中  整个服务器共享 服务器不重启就一直有
         最常用的  request ;application 几乎不用
         优先级:pageContext > request > session > aqqlication  
    EL表达式:快速取出作用域中的值 ,所有作用域
    pageContext.setAttribute("a", "page");
    request.setAttribute("a", "request");
    session.setAttribute("a", "session");
    application.setAttribute("a", "application");
    
    ${ a }//会将四个a全都取出来,但是根据优先级取出pageContext
    ${requestScope.a }//将取出request,将requestScope中的request换成session就取出session
    
    ServletConfig  :是一个接口 ,一个ServletConfig对象只代表当前的servlet类的配置信息!
    代表:servlet的配置信息 --xml中的<servlet>
    <servlet>
    <servlet-name>AServlet</servlet-name>
    <servlet-class>com.neuedu.Servlet.AServlet</servlet-class>
    </servlet>
    
    获取方法:由服务器创建,通过init方法的参数直接传递给我们,我们直接在init方法中使用  
    功能:
              getServletName( ) :获取当前servlet-name值
              getInitParam( ) :获取当前的servlet的初始化参数
              getServletConText( ) :获取当前web应用!

    ServletConText    
    代表:当前web应用,也就是web.xml文件中的信息
    获取:通过ServletConfig对象的getServletConText
    功能:
              getInitParameter( ):获取整个web应用的初始化参数,代码就是如下
     
    xml文件中,在<servlet>外写:
    <context-param>
          <param-name>password</param-name>
          <param-value>123456</param-value>
    </context-param>
    
    String initParameter2 = config.getServletContext().getInitParameter("password");
    System.out.println(initParameter2);
    
    String initParameter2 = config.getServletContext().getRealPath(servletName);
    System.out.println(initParameter2);
    //getrealpath()获取真实路径
    - 虚拟路径:http://localhost:8080/day0807-servlet/index.html
    - 真实路径:E:安装软件包eclipse安装 包eclipseworkingday0807-servletWebContentindex.html
    MyGenericServlet
         1.定义一个抽象类实现servlet接口,保留service方法不实现,其余方法都实现!
         2.自定义抽象类子类,在web.xml文件中注册一下这个子类
         3.子类构造器->父类构造器->剩余子类构造器->init方法(如果子类有就调用子类的,没有就调用父类的)
     

     HttpServlet

    public CServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          System.out.println("doGet请求");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doGet(request, response);
    }
    
    HttpServletRequest
    1.代表:浏览器向服务器发送的请求报文
    2.获取:由tomcat服务器创建,然后作为参数传递给我们相对应的doGet或者doPost方法
    3.功能:
              getParameter( ):获取请求参数,如登陆的用户名和密码等
              getContextPath( ):获取当前项目路径
              setAttribute( )/getAttribute( ): 本身就是一个域对象
     
    request.getRequestDispatcher("1.html").forward(request, response);//通过request跳转到1.html
    
    getAttribute( ):四个域对象都可以使用,被作为传递对象,返回值是Object
    getParameter( ):只可以被request使用,用于接收参数【url,form表单中】,返回值是String类型
     
    HttpServletResponse
         1.代表:服务器响应给浏览器的响应报文
         2.获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法!
         3.功能    
    response.getWriter().println("<h3>hello world!</h3>");//可以返回给浏览器一个页面或者一个页面片段!
    response.sendRedirect("/day0807-servlet/1.html");//服务器返给浏览器地址,浏览器需要再次访问服务器给的地址
    
     
    转发和重定向
     
         1.转发:当浏览器向服务器发送请求的时候,服务器自己不处理,而是调用其它的web资源进行处理!
         
         2.重定向:当浏览器向服务器发送请求的时候,服务器返回给浏览器一个特殊的响应,这个特殊的响应告诉浏览器再向另一个地址发送一个请求!
     
     
    发生在浏览器端还是服务器端
    浏览器的请求次数
    浏览器地址栏是否发生变化
    浏览器是否能够感知到
    request
    服务器端
    1
    不变化
    感知不到
    response
    浏览器端
    2
    发生变化
    感知到
     
     get:转发---doGet
             重定向----doGet
    post:转发---doPost 
              重定向---doGet
    编码问题分析
         通信双方在进行通信的时候,实际上是将通信的内容【信息】是按照一定的规则转化为二进制进行通讯的
         而这个一定的规则就是字符的编码:ascii,gb2312,gbk,iso8859-1,utf-8;
     
         在请求到达的时候,另一方就需要解码!
     
         乱码原因
              通信双方的编码方式和解码方式不一致造成的,
         解决办法:
              统一通信双方的编码方式和解码方式,都使用utf-8编码!
     
    编码分类:
             请求编码
                浏览器编码---》服务器解码iso8859-1
             响应编码
                服务器编码----》浏览器解码
                服务器端默认使用的是iso8859-1编码,而浏览器默认使用的是gb2312,当然我们也可以在页面中告诉浏览器用什么编码方式!
     
    请求编码
        get请求
           -  统一浏览器和服务器端的编码格式为utf-8编码:在server.xml文件的connector标签中指定编码格式为utf-8编码:URIEncoding="utf8" 
        post请求
           -  我们可以在post方法中在第一次获取请求参数之前通过request.setCharacterEncoding("utf-8");来设置解码格式!
     
    响应编码
         可以通过response.setContentType("text/html;charset=utf-8");设置服务器和浏览器的编码和解码格式!
     
    路径问题:
            ①相对路径和绝对路径
              绝对路径:是以 / 开头的路径
                   相对于当前服务器的绝对路径:
                   相对于当前web应用的绝对路径:
     
              相对路径:不是以 / 开头的路径
     
            ②常见的路径:
                url-pattern:
                转发的路径:
                    > 这两个的绝对路径由服务器解析,相对于项目的根目录
                        http://主机地址:端口号/项目名/
     
                重定向的路径:
                页面中的路径:
                    > 这两个路径有浏览器解析,相对于服务器的根目录
                        http://主机地址:端口号/
     
    base标签
          base标签里面有一个href属性,这个属性允许我们用使用相对路径的方式使用绝对路径!
          我们再使用相对路径的时候,相对路径会以这个href属性值作为前缀!
  • 相关阅读:
    python的is和==
    pycharm设置
    springboot 配置中心 nacos 简易部署+ 手把手教 涂涂
    解决: springboot 有了eurake怎么再添加 nacos? 【springboot配置多注册中心,同时生效~,不是切换】 涂涂
    .NET Core/.NET5/.NET6 开源项目汇总5:(权限)管理系统项目
    解决ueditor报错:ZeroClipboard undefined
    如何评价 Qt 的发展前景?
    WPF HandyControl开源UI库学习笔记
    C#中的深度学习(一):使用OpenCV识别硬币
    使用SVN进行文档管理和部门知识库建设的建议
  • 原文地址:https://www.cnblogs.com/lwj-0923/p/7352881.html
Copyright © 2020-2023  润新知