HTML03---服务连接器Servlet

服务连接器Servlet

一 servlet概述

1. 概念

​ Servlet: Server Applet的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应。

  • 作用 :

    •接收客户端请求,完成操作。

    •动态生成网页(页面数据可变)。

    •将包含操作结果的动态网页响应给客户端

2. 基本原理

​ 将网页提交的信息接收 , 使用java语言进行处理,所用到的java文件就是广义上的servlet

3. 流程

  • 创建java EE项目,并为idea配置Tomcat

  • 编写主类,实现servlet,重写5个方法,把需要进行的操作写入到重写的service方法中

  • 编写WEB-INF文件,为servlet起名(用于HTML文件与之相连),并连接主类(servlet-class)

    <servlet>  
    <servlet-name>MyServlet</servlet-name>  
    <servlet-class>com.51doit.MyServlet</servlet-class>  (与主类连接)
    </servlet>  
    
    <!—2、添加servlet-mapping节点一>  
    <servlet-mapping>  
    <servlet-name>MyServlet</servlet-name>  (通过servlet-name与servlet-class连接)
    <url-pattern>/myservlet</url-pattern> (URL样式,在网址栏输入符合此样式的网址就会被接收)
    </servlet-mapping> 
    
  • 将项目加载到Tomcat中

  • 启动Tomcat,此时可以通过在网页直接输入指定的URL样式,直接访问到servlet

二 Servlet详解

1. servlet核心类(HTTPServlet)

1.1 Servlet中的方法
  • 在ServletAPI中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。该接口包括五个需要重写的方法 :

    init(ServletConfig config)//初始化方法
    ServletConfig getServletConfig()//
    service(ServletReq uest req,ServletResponse res)//主服务方法
    String getServletlnfo()//获取服务信息
    destroy()//销毁方法
    
  • GenericServlet使编写Servlet变得更容易。它提供生命周期方法init和destroy的简单实现,要编写一般的Servlet,只需重写抽象 service方法即可。

1.2 HTTPServlet类
  • HttpServlet是继承GenericServlet的基础上进一步的扩展。提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类。

  • HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法之一:

    doGet,如果servlet支持HTTP GET请求。
    doPost,用于 HTTP POST 请求 。
    doPut,用于 HTTP PUT 请求。 
    doDelete,用于 HTTP DELETE 请求。
    

创建Servlet推荐使用继承HTTPServlet的方法进行创建

2. 配置方式

  • 使用web.xml(Servlet2.5之前使用)
  • Servlet3.0后,使用WebServlet注释,注释常用属性如下:
name: Serlvet名字(可选)
value:配置url路径,可以配置多个
urlPatterns:配置url路径,和value作用一样,不能同时使用
loadOnStartup:配置Servlet的创建的时机,如果是0或者正数启动程序时创建,如果是负数,则访问时创建。数子越小优先级越高
代码导包
    </dependency>

	//将以下代码写到pom.xml文件的固定位置,刷新,可自动加载jar包
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.41</version>
    </dependency>

</dependencies>

3. servlet应用

3.1 request对象
  • 在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
  • request对象的主要作用是接受项目的doGet和doPost传递过来的数据(以HTML表单为主)
  • 主要方法 :
req.getParameter(String name) //根据表单组件名称获取提交数据,name为HTML中表单设置的name
req.setCharacterEncoding()    //指定每个请求的编码
3.2 response对象
  • 相应结果给客户端
  • 主要方法 :
setHeader(name,value) 			//设置响应信息头
setContentType(String) 			//设置响应文件类型,响应时的编码格式
setCharacterEncoding(String)	 //设置服务器端响应内容的编码格式
getWriter()					    //获得字符输出流
  
/*字节数出流的应用*/
PrintWriter writer = resp.getWriter();  
writer.println("<html>");  
writer.println("<head><title>login</title></head>");  
writer.println("<body>");  
//writer.println("<h1>login success</h1>");  
writer.println("<h1>登陆成功</h1>");  
writer.println("</body>");  
writer.println("</body>");  
3.3 中文乱码问题
  • request的get中文乱码

    • Tomcat7以下的版本中,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象是使用ISO8859-1的编码格式进行解码的,故出现乱码问题

      //解决办法:在接收到数据后,先获取request对象以IS08859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
      String name = req.getParameter("name");  
      name = new String(name.getBytes("ISO8859-1"),"UTF-8");  
      
    • Tomcat8的版本中get方式不会出现乱码了,因为服务器对url的编码格式可以进行自动转换。

  • request的post中文乱码

    • 乱码问题原因与get相同,由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收。

      //解决方案:使用从ServletRequest接口继承而来的setCharacterEncoding(charset)方法进行统一的编码设置。
      req.setCharacterEncoding("utf-8");  
      String name = req.getParameter("name"); 
      
  • response的中文乱码

    • 因为服务器默认采用ISO8859-1编码相应内容,故输出内容为中文则容易出现乱码

      //同时设置服务器的编码格式和客户端响应的文件类型及响应时的编码格式  
      resp.setContentType("text/html;charset=UTF-8");
      

4. Cookie对象

  • cookie是servlet中的一个应用类
  • 当浏览器访问Web服务器某个资源时,由Web服务器传送一小段数据(包括但不限于账号密码,也包含偏好设置、浏览记录等信息)给浏览器,并保存到浏览器中
  • 浏览器一旦保存了某个网站的Cookie,当再次访问服务器时,Cookie信息会和HTTP的请求一起传至Web服务器
  • —个Cookie主要由标识该信息的名称(name)和值(value)组成

cookie原理

4.1 创建Cookie
//创建cookie  
Cookie cookie = new Cookie("code", "code");  
//设置cookie的路径  
cookie.setPath("/webs");  
//内存存储 取值三种:>0有效期 单位为秒 =0 浏览器关闭 <0内存存储 默认-1  
cookie.setMaxAge(-1);  
//添加到response对象中,响应时发送给客户端  
resp.addCookie(cookie);  
4.2 获取Cookie
//获取cookie  
Cookie[] cookies = req.getCookies();  
//遍历cookie  
for (Cookie cookie1 : cookies) {  
  	if(cookie1.getName().equals("code")){  
        String value = cookie1.getValue();  
        System.out.println(value);  
        break;  
 	}  
}
4.3 修改Cookie
  • 只要保证Cookie的名称和路径一致即可修改(直接覆盖原Cookie的值)
//修改Cookie  
Cookie cookie = new Cookie("code", "code");  //与原cookie相同
cookie.setPath("/webs");  //与原cookie相同
cookie.setMaxAge(-1);  
resp.addCookie(cookie);  //直接覆盖
4.4 中文编码问题
  • Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码。
  • 编码(创建Cookie)可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
  • 解码(读取Cookie)使用java.net.URLDecoder类的decode(String str,String encoding)方法

5. Session对象

  • Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。
  • 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。
5.1 Session原理
  • 服务器会为每一次会话(同一个浏览器发起的多次请求)分配一个Session对象
  • 首次使用到Session时,服务器会自动创建Session,并创建Cookie存储Session发送回客户端
  • 注意:Session是由服务器创建的
5.2 Session的使用

Session作用域:拥有存储数据的空间,作用范围是一次会话有效

  • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
  • 可以将数据存入Session中,在一次会话的任意位置进行获取
  • 可传递任何数据(基本数据类型、对象、集合、数组)

获取Session

//Session对象是由服务器创建的,通过request对象获取。
//获取Session对象  
     HttpSession session = req.getSession();  
     System.out.println(session.getId());//Session的唯一标识  

保存数据

//setAttribute(属性名,Object)保存数据到session中。
session.setAttribute("key",value);//键值对的形式存储在session作用域中,value为要保存的数据

获取数据

//getAttribute(属性名),获取session中的数据。
session.getAttribute("key");//通过String类型的Key,访问Object类型的value  

除移数据

//removeAttribute(属性名),从session中删除数据
session.removeAttribute("key");//通过键移除session作用域中的值

6. ServletContext对象

  • 当Web服务器启动时,会为每一个Web应用程序创建一块共享的存储区域(ServletContext)。
  • ServletContext在Web服务器启动时创建,服务器关闭时销毁。
6.1 获取对象
  • GenericServlet提供了getServletContext()方法(this.getServletContext())。(推荐)
  • HttpServletRequest提供了getServletContext()方法。(推荐)
  • HttpSession提供了getServletContext()方法。
6.2 servletContext的作用
  • 获取项目真实路径
    • String realPath = sc.getRealPath("/");
  • 获取项目上下文路径
    • String contextPath = sc.getContextPath();
    • String contextPath1 = req.getContextPath();
  • 全局容器
    • ServletContext拥有作用域,可以存储数据到全局容器中。
6.3 ServletContext、Session和request的区别
  • HttpServletRequest:一次请求,请求相应之前有效
  • HttpSession:一次会话,浏览器不关闭或者不超时之前有效
  • ServletContext:服务器启动开始,服务器停止之前有效。

三 过滤器

过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术。

servlet过滤器

1. 作用

  • 执行顺序在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中。响应时,会根据执行流程再次反向执行Filter。
  • 可以解决多个Servlet共性代码的冗余问题

2. 过滤器的使用

2.1 编写过滤器
  • Servlet API中提供了一个Filter接口,我们只需要编写一个类实现这个接口即可,这个Java类称之为过滤器。
  • 实现方法需重写其中的3个抽象方法
  • 在doFilter方法中编写拦截逻辑,和过滤后的放行
//过滤器演示
@WebFilter(value = "/filtertest")
public class FilterTest implements Filter {
    //初始化过滤器
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器进行了初始化 init"+filterConfig);
    }

    //执行过滤
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFiter过滤前");
        //过滤之后放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("doFiter过滤后");
    }

    //销毁
    @Override
    public void destroy() {
    }
}
2.2 配置过滤器
注解配置
  • 在自定义的Filter类上使用@WebFilter(value = “过滤目标资源”)
xml配置
<filter>  
     <filter-name>ft</filter-name>  
     <filter-class>com.FilterTest</filter-class>  
 </filter>  
 <filter-mapping>  
     <filter-name>ft</filter-name>  
     <url-pattern>cookietest</url-pattern>  
 </filter-mapping>  

过滤器的过滤路径通常有三种形式:
  1.精确过滤匹配,比如/index.jsp /myservlet1
  2.后缀过滤匹配,比如.jsp、.html、*.jpg
  3.通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值