本文共 7963 字,大约阅读时间需要 26 分钟。
Servlet 是一种运行在服务器端(一般指的是 Web 服务器)的 Java 应用程序,可 以生成动态的 Web 页面,它是属于客户与服务器响应的中间层。因此,可以说,JSP就是Servlet。两者可以实现同样的页面效果,不过,编写 JSP 和编写 Servlet 相比,前者成本低得多
初次运行,系统会实例化 Servlet
Servlet 采用的是多线程机制,每一次请求,系统就分配一个线程来运行 doGet 函数。但是这样也会带来安全问题,一般说来,不要在 Servlet 内定义成员变量,除非这些成员变量是所有的用户共用的
JSP ——>Java(Servlet)——>JSP
Servlet是一个Java,但不是所有的java都是servlet
Java类必须符合一定的规范:
接受并处理所有get提交方式的请求
接受并处理所有post提交方式的请求
要想使用Servlet,必须配置:
WebContent
src请求——>被web.xml里面的servlet-mapping中的"url-pattern"所拦截,"url-pattern"根据自己的"servlet-name"去匹配——>servlet里面的servlet-name
然后寻找到servlet-class,最后将请求交于该servlet-class的文件index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>Insert title here WelcomeServlet
WelcomeServlet.javapackage servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class WelcomeServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost..."); //所有的请求都会落到doGet()或者doPost()方法里面 /* * 如果是get请求就跳到doGet()方法里面 * 如果是post请求就跳到doPost()方法里面 * 一般写项目的时候不管是get还是post我们处理方式应该是一样的 * 所以我们的一般写法如下: * 不管是get还是post都放到一个里面去处理(get或post) * */ this.doGet(req, resp); }}
web.xml文件Servlet25Project index.html index.htm index.jsp default.html default.htm default.jsp WelcomeServlet servlet.WelcomeServlet WelcomeServlet /WelcomeServlet
直接新建Servlet即可!(继承、重写、web.xml 可以借助Eclipse自动生成)
Servlet3.0不需要在web.xml中配置,但需要在Servlet类的定义处之上编写注解(也就是url-pattern的参数值)
请求地址与@WebServlet中的值进行匹配,如果匹配成功,则说明请求的就是该注解所对应的类
构建目录:
新建abc一个文件夹,但此时abc文件夹不是一个构建目录
将abc变为构建目录
或者直接新建java的源文件会自动添加到构建路径
项目一般默认一个构建路径src
举例理解:
src构建路径中有一个Servlet.java文件
WebContent目录中直接有一个文件index.jsp:并且请求...,则寻找范围:即会在src根目录中寻找,也会在WebContent根目录中寻找如果:index.jsp中请求:
...,寻找范围:先在src或webcontent中找a目录,然后再在a目录中找abc
重点:/到底代表什么东西
web.xml中的/表示:代表项目根路径
http://localhost:8080/Servlet25Project/WelcomeServlet2拼接之后为:http://localhost:8080/Servlet25Project/WelcomeServlet2/a/WelcomeServlet2成为请求路径
jsp中的/:代表的是服务器根路径
表示http://localhost:8080/init()
该方法会在Servlet被加载并实例化的以后 执行 init():默认第一次访问Servlet时会被执行(只执行这一次)可以修改为tomcat启动时自动执行
Servlet2.5版本:
1:表示web.xml文件里面启动时第一个执行的servletServlet3.0版本:在注解里面加loadOnStartup=1 destroy销毁的时候
service()——>doGet()、doPost()
调用几次,则执行几次当客户端向 Web 服务器提出第一次 Servlet 请求时,Web 服务器会实例化一个 Servlet,并且调用 init()方法
如果 Web 服务器中已经存在了一个 Servlet 实例,将直接使用此实例;然后调用 service()方法,service()方法将根据客户端的请求方式来决定调用对应的 doXXX()方法
destroy()
该方法被系统回收时执行关闭tomcat服务时,执行一次
由两个软件包组成:对应于HTTP协议的软件包,对应于除了HTTP协议以外的其他软件包
即Servlet API 可以适用于任何通信协议
我们学习的Servlet‘是位于javax.servlet.http包中的类和接口,是基于HTTP协议设置全局参数,该参数所有的Servlet都可以访问设置局部参数,只有相应的Servlet才能访问
设置全局参数,该参数所有的 Servlet 都可以访问获取参数的方法:设置局部参数,该参数只有相应的 Servlet 才能访问 参数名 参数值 Servlet 名称 Servlet 类路径 参数名 参数值
获取全局参数的方法是: ServletContext application = this.getServletContext(); application.getInitParameter("参数名称"); 获取局部参数的方法是: this.getInitParameter("参数名称");Servlet3.0方式 给当前Servlet设置初始值: @WebServlet(…, initParams={@WebInitParam(name=“servletparaname30”,value=“servletparavalue30”)})
注意,此注解只是隶属于一个具体的Servlet,因此无法为整个web容器设置初始化参数(如果要通过3.0方式设置web容器的初始化参数,仍然需要web.xml中设置)
在doget()方法里面写:
response.setContentType("text/html;charset=gb2312");//设置编码,使得可以打印输出中文字符PrintWriter out = response.getWriter();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //将 request 参数当成 request 对象使用 //将 response 参数当成 response 对象使用 }
HttpSession session = request.getSession();//将session当成session对象来使用
ServletContext application = this.get ServletContext(); //将 application 当成 application 对象来使用
情况一: 为了解决中文乱码问题,我们经常看到一段代码:request.setCharacterEncoding(“gb2312”); response.setContentType(“text/html;charset=gb2312”); 这是 Servlet 用来设置编码用的,如果 Servlet 的处理方法最前面没有加入这一段代码, 就很可能会出现乱码问题。如果是一个大工程的话,会有很多很多的 Servlet,于是很多人发现在这么多代码中重复设置编码,非常麻烦。而且,一旦需求变了,需要换成另外的编码,对程序员来说将是一件很繁琐的事情
情况二:很多的门户网站都会有登录页面,这是为了业务需求,同时也是为了使用户控制更加的安全。如果客户没有登录就访问网站的某一页面,在很多情况下会引发安全问题。应该如何避免这种情况?传统情况下,可以使用 session 检查来完成,但是在很多页面上都添加 session检查代码,也会比较繁琐
情况三:许多的网站都存在着各种不同的权限,比如,只有管理员才可以对网站的某些数据进行维护和修改,一般的普通用户是无法完成该功能的。登录过后,网页如何区分普通用户与管理员?如果是每一个页面写一个判断用户类型的代码,似乎也非常繁琐
实现一个Filter接口
重写方法:init()、destroy() 他们原理、执行时机和Servlet一样配置过滤器,类似servlet(配置xml)
通过doFilter()处理拦截,并且通过chain.doFilter(request, response); //进行放行请求和响应filter映射
dispatcher请求方式:/MyServlet 只拦截访问MyServlet的请求/* 拦截一切请求,每一次访问都会被拦截
过滤器中doFilter方法参数:ServletRequest
在Servlet中方法参数:HttpServletRequest四个范围对象:PageContext、request、session、application
主要监听对象:request、session、application监听以下对象分别对应的类
package listener;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.ServletRequestEvent;import javax.servlet.ServletRequestListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;//实现监听器接口public class ContextSessionRequestListener implements ServletRequestListener, HttpSessionListener, ServletContextListener{ //监听application(ServletContext) public void contextInitialized(ServletContextEvent sce) { System.out.println("监听ServletContext,创建ServletContext对象" +sce); } public void contextDestroyed(ServletContextEvent sce) { System.out.println("监听ServletContext,销毁ServletContext对象.."+sce); } //监听session public void sessionCreated(HttpSessionEvent se) { System.out.println("监听HttpSession,创建HttpSession对象..."+se); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println("监听HttpSession,销毁HttpSession对象.."+se); } //监听request public void requestInitialized(ServletRequestEvent sre) { System.out.println("监听ServletRequest,创建ServletRequest对象..."+sre); } public void requestDestroyed(ServletRequestEvent sre) { System.out.println("监听ServletRequest,销毁ServletRequest对象.."+sre); } }
每个监听器各自提供了两个方法:监听开始、监听结束的方法
ServletContext在Servlet容器启动时自动创建
每个监听器各自提供了三个方法:增加属性、替换属性、删除属性的方法
转载地址:http://vqxzi.baihongyu.com/