Servlet


概述

servlet的作用是帮助前后端进行互动,以便交互式地修改与浏览内容,狭义的servlet理解为Java语言实现的一个接口,而广义的servlet为任何实现了该接口的类


使用步骤

  1. 首先,创建一个servlet实现类继承servlet接口,实现其内部方法
public class LoginServlet extends HttpServlet {

    @Override
    ......
}
  1. 在web.xml文件里配置前端网页文件的请求url与对应servlet的映射关系
<servlet>
	<servlet-name>自定义名称</servlet-name>
	<servlet-class>处理请求的类的完整路径</servlet-class>
</servlet>
<servlet-mapping><!-- mapping 表示映射 -->
	<servlet-name>自定义名称</servlet-name>
	<url-pattern>请求名</url-pattern>
</servlet-mapping>

内部原理

注意,servlet是单例设计模式,在一个应用程序中,每个servlet类只有一个实例,而该实例由servlet容器产生,比如tomcat

前端用户请求使servlet容器去调用service()方法,并传入ServletRequest对象与ServletResponse两个对象,这两个对象都是由servlet容器封装好的,不需要程序员实现且可以直接使用

ServletRequest对象封装了http请求,使程序员不需要解析处理原始的http数据。而程序员直接操作ServletResponse对象即可把响应发送给用户

对于每一个应用程序,servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个servlet对象也都有一个封装servlet配置的ServletConfig对象


生命周期

  1. 实例化;用户第一次发送请求时,servlet容器会先找到对应的servlet类,如果该类对象不存在,则创建其实例并初始化,如果存在则不会进行初始化操作
  2. 初始化;有了对应servlet类对象的实例,调用init()方法进行初始化
  3. 处理请求;初始化完成,调用service()方法判断用户的请求方式,get还是post
  4. 服务终止;服务器关闭,调用destory()方法进行销毁

请求与响应

Request对象的常用方法:
setCharacterEncoding("编码方式") 设置字体编码方式,从表单获取的字体可能出现乱码
getParameter("name属性名") 从表单组件的name属性名下获取其内容
getParameterValues(String name) 从表单组件里获取多个值,返回类型为String数组
getRequestDispatcher("跳转的页面名") 转发操作,跳转至某页面
setAttribute("key",value) 存储一个键值对
getAttribute("key") 通过键取出某个值,返回类型为object,需要向下转型

Response对象的常用方法:
sendRedirect("跳转的页面名") 重定向操作,跳转至某页面
getWriter()获得字符流,通过字符流的write()方法可以将字符串输出到浏览器端


转发与重定向

相同点:都用于进行页面的跳转
不同点:重定向时,地址栏会改变,Request对象中存储的数据会丢失;转发时地址栏显示的是请求页面的地址栏,Request对象中存储的数据不会丢失
转发属于一次请求一次响应,重定向属于两次请求两次响应

重定向与转发的内部原理图:
在这里插入图片描述
重定向的地址栏实际上改变了两次,因此是两次请求两次响应


Session会话

用户在浏览器打开到关闭的过程,这期间对服务器的访问称为一次会话,session的值在多个页面中共享,只要不关闭浏览器可以一直存在,一个session包含多个request

还有需要注意,session在第一次访问服务器的时候,因此只有访问jsp、servlet等程序时才会创建session,访问静态的html页面是不会创建session的

获取session对象:

HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性

session对象的常用方法:
setAttribute(String key,Object value)存储一个键值对
invalidate()使session失效
getId()获取该sessionID,可以验证会话是以浏览器打开关闭为标准
setMaxInactiveInterval(int interval)设置session的非活动时间


初始化参数

项目中定义初始化参数,以设置字符集等常用数据,便于程序员进行修改、维护

局部定义参数:

在web.xml里定义初始化参数

<servlet> 
<servlet-name>自定义名字</servlet-name> 
<servlet-class>某servlet的绝对路径</servlet-class>
<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
</init-param>
</servlet>

在servlet初始化方法中获取初始化参数,注意该参数只用于web.xml里定义的servlet

public void init(ServletConfig config) throws ServletException { 
		encoding= config.getInitParameter("encoding"); 
}

全局定义参数:

在web.xml里定义全局参数,注意<context-param>标签与<servlet>标签同级别

<context-param>
	<param-name>bianma</param-name>
	<param-value>utf-8</param-value>
</context-param>

此时获取的参数可以用于任何一个servlet

public void init(ServletConfig config) throws ServletException {
		bianhao=config.getServletContext().getInitParameter("bianma");
}

注解实现Servlet

注解@WebServlet加在servlet类的开头,使用注解的方式实现servlet并设置初始化参数,大大减轻了代码量,提高了开发人员的编码效率

@WebServlet(urlPatterns = {"该servlet处理的url"},
    initParams = {
        @WebInitParam(name = "MyEncoding",value = "utf-8")
    }
)
public class LoginServlet extends HttpServlet {
		......
}

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值