Web项目中的Servlet

来源:互联网 发布:单机魔兽数据库端口 编辑:程序博客网 时间:2024/05/16 02:46

Servlet

1.Servlet中的两个接口
  • ServletConfig
    • 代表:Servlet的配置信息
    • 作用:
      • 1)获取Servlet的友好名称
String servletName = config.getServletName();
      • 2)获取Servlet的初始化参数
        • 前提是已经在web.xml文件中进行了配置
<servlet>
          <servlet-name>ServletConfServlet</servlet-name>
          <servlet-class>com.atguigu.servlet.ServletConfServlet</servlet-class>
          <init-param>
              <param-name>username</param-name>
              <param-value>admin</param-value>
          </init-param>
</servlet>
        • 获取
String initParameter = config.getInitParameter("username");
      • 3)获取ServletContext
ServletContext servletContext = config.getServletContext();
  • ServletContext
    • 代表:当前Web应用
    • 作用:
      • 1)获取当前Web应用的初始化参数
//Web应用的初始化参数是全局的,每个Servlet都可以拿到
String initParameter2 = servletContext.getInitParameter("encode");
        • 前提是已经在web.xml文件中进行了配置
<!-- 设置当前Web应用的初始化参数 -->
     <context-param>
          <param-name>encode</param-name>
          <param-value>utf-8</param-value>
     </context-param>
        • 获取
//Web应用的初始化参数是全局的,每个Servlet都可以拿到
String initParameter2 = servletContext.getInitParameter("encode");
      • 2)获取服务器端资源的真实路径
String realPath = servletContext.getRealPath("/index.html");
      • 3)作为一个域对象存在(下回分解)
2.请求和响应
  • HttpServletRequest request
    • 代表:
      • request代表了浏览器发送给服务器的请求报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在两个方法中可以直接使用
    • 作用:
      • 1)获取请求参数
String userName = request.getParameter("username");
String password = request.getParameter("password");
      • 2)获取当前Web应用的路径
String contextPath = request.getContextPath();
      • 3)转发
//获取转发器
RequestDispatcher requestDispatcher = request.getRequestDispatcher("success.html");
//转发
requestDispatcher.forward(request, response);
      • 4)作为一个域对象存在(下回分解)
  • HttpServletResponse response
    • 代表:
      • response 代表了服务器发送给浏览器的响应报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在两个方法中可以直接使用
      • 作用:
        • 1)给浏览器响应一个页面或页面的一个片段
PrintWriter writer = response.getWriter();
writer.write("<h1>Response Success!</h1>");
        • 2)重定向
response.sendRedirect("success.html");
  • 转发与重定向的区别
    • ①转发发送一次请求;重定向发送两次请求
    • ②转发浏览器地址栏无变化;重定向浏览器地址栏有变化
    • ③转发可以访问WEB-INF下的资源;重定向不可以访问WEB-INF下的资源
    • ④转发可以共享request域对象中的资源;重定向不可以共享request域对象中的资源
3.Web应用中的路径问题
  • 相对路径不靠谱
    • 在转发的情况下,由于地址栏无变化会导致浏览器解析地址出错,所以不建议使用相对路径,建议使用绝对路径。
  • 绝对路径
    • 什么是绝对路径:以 / 开头的路径即为绝对路径
    • 绝对路径中的 / 代表什么?
      • 如果地址由浏览器解析:
        • / 就代表当前服务器: 例如: http://localhost:8080
        • 那些地址由浏览器解析?
          • 1)html标签中的路径:例如img标签中额src属性,a标签中的href属性,link标签中的href属性,script中的src属性,form标签中的action属性
          • 2)重定向中的路径
      • 如果地址由服务器解析:
        • / 就代表当前Web应用: 例如:http://localhost:8080/Web01_Servlet_Ex
        • 那些地址由服务器解析?
          • 1)web.xml中的 <url-pattern>/LoginServlet</url-pattern>中的路径
          • 2)转发中的路径
4.中文乱码问题
  • 编码:将字符转换成二进制数
  • 解码:将二进制数转换成字符
  • 乱码:编码和解码使用的字符集不一致就会导致乱码
  • 请求乱码
    • 浏览器发送给服务器:
      • 浏览器编码:浏览器编码使用的字符集就是html页面指定的字符集
      • 服务器解码:服务器默认的字符集是ISO-8859-1
      • 所有出现了乱码
      • 解决方案:
        • 对于POST请求
//改操作一定要在第一次获取请求参数之前
 request.setCharacterEncoding("utf-8");
        • 对于GET请求
        • 使用POST请求的方式不管用:
          • 因为Get请求的请求参数在地址栏中,在到达Servlet之前已经被服务器进行解析,所以在Servlet中设置字符集不管用
          • Get请求的乱码问题需要在server.xml中的第一个Connector标签中添加一个属性:URIEncoding="UTF-8"
  • 响应乱码
    • 服务器发送给浏览器
      • 服务器编码:服务器默认的字符集是ISO-8859-1
      • 浏览器解码:默认使用GBK进行解码
      • 解决方案:
        • 通过设置响应头告诉浏览器使用UTF-8字符集进行解码
//设置响应头 
response.setHeader("Content-Type", "text/html;charset=utf-8");
//设置ContentType
 response.setContentType("text/html;charset=UTF-8");
      • 当在响应头中设置了字符集之后Servlet也会使用设置的字符集进行编码
1 0