概述
servlet的作用是帮助前后端进行互动,以便交互式地修改与浏览内容,狭义的servlet理解为Java语言实现的一个接口,而广义的servlet为任何实现了该接口的类
使用步骤
- 首先,创建一个servlet实现类继承servlet接口,实现其内部方法
public class LoginServlet extends HttpServlet {
@Override
......
}
- 在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对象
生命周期
- 实例化;用户第一次发送请求时,servlet容器会先找到对应的servlet类,如果该类对象不存在,则创建其实例并初始化,如果存在则不会进行初始化操作
- 初始化;有了对应servlet类对象的实例,调用
init()
方法进行初始化 - 处理请求;初始化完成,调用
service()
方法判断用户的请求方式,get还是post - 服务终止;服务器关闭,调用
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 {
......
}