什么是- Servlet?
Servlet是Server与Applet的缩写,是服务端小程序的意思。使用Java语言编写的服务器端程序,可以像生成动态的WEB页,Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准来开发的类。是SUN公司提供的一门用于开发动态Web资源的技术。(言外之意:要实现 web开发,需要实现 Servlet标准)
Servlet 本质上也是Java类,但要遵循Servlet规范进行编写,没有 main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如Tomcat)。(言外之意:写自己的类,不用写main方法,别人自动调用)
Servlet是和HTTP协议是紧密联系的,其可以处理HTTP协议相关的所有内容。这也是Servlet应用广泛的原因之一。
提供了Servlet功能的服务器,叫做Servlet容器,其常见容器有很多,如Tomcat, Jetty, WebLogic Server,WebSphere,JBoss 等等。
2.实现Servlet
- 1.创建普通java类
- 2.实现Servlet的规范,继承httpSevlet类
- 3.重写servlet方法,用来处理请求
- 4.设置注解,指定访问的路径
- //@WebServlet("/ser01")
// @WebServlet(name=“servle01”,value = “/ser01”)和上面一样的效果,value也可以设置多个
//@WebServlet(name=“servle01”,value ={"/ser01","/ser001"} )//里面的参数都可以访问
//@WebServlet(name=“servle01”,urlPatterns = “/ser01”) //urlPatterns写多个 写一个也行
//@WebServlet(name=“servle01”,urlPatterns = {"/ser01","/ser001"})
3.关于用户访问网站的一个流程
网站:http://localhost:8080/s0/ser01
- 服务器的端口号 localhost:8080
- 服务器下的一个项目s0
- 项目下的某一个分支ser01
代码实现:
//@WebServlet("/ser01")
// @WebServlet(name="servle01",value = "/ser01")和上面一样的效果,value也可以设置多个
//@WebServlet(name="servle01",value ={"/ser01","/ser001"} )//里面的参数都可以访问
//@WebServlet(name="servle01",urlPatterns = "/ser01") //urlPatterns写多个 写一个也行
//@WebServlet(name="servle01",urlPatterns = {"/ser01","/ser001"})
@WebServlet("/ser01")//正常写这个就好了
public class Servle01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//打印内容在控制台
System.out.println("hello servlet");
//通过流输出数据到浏览器
resp.getWriter().write("hello servlet");
}
}
4.实现Servlet的三种方法:
1.继承 GenericServlet
2.继承HttpServlet
3.实现Servlet接口
实用性:个人觉得继承比较好用一点,因为实现要实现所有的,继承可以想用那个用那个
代码实现:
1.
@WebServlet("/ser02")
public class Servlet02 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("继承GenericServlet");
}
}
2.@WebServlet("/ser01")//正常写这个就好了
public class Servle01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//打印内容在控制台
System.out.println("hello servlet");
//通过流输出数据到浏览器
resp.getWriter().write("hello servlet");
}
}
3.
public class Servlet03 implements Servlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("实现servlet接口");
}
5.Servlet的生命周期
直接上代码你就懂了:
@WebServlet("/ser03")
public class Servlet03 implements Servlet {
* 初始化方法
系统方法,服务器自动调用
* 当请求到达Servlet容器时,Servlet容器会判断Servlet对象是否存在,如果不存在,则创建实列并初始化,
方法只会执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
* 最先调用Servlet类
* 就绪/服务方法(处理请求数据)
* 系统方法 服务器自动调用
* 当有请求到达Servlet时,就会调用该方法
* 可以被多次调用
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("实现servlet接口");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
6.HttpServletRequest对象
什么是HttpServletRequest对象?
HttpServletRequest对象∶主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomcat封装好传递过来。
HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?
从长远上讲:现在主要用的协议是HTTP协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承ServletRequest接口就行了。
在HttpServletRequest接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?不需要,直接在Service方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。、
1.常用方法| getRequestURL() | 获取客户端发出请求时的完整URL |
|---|---|
| getRequestURI() | 获取请求行中的资源名称部分(项目名称开始) |
| getQueryString() | 获取请求行中的参数部分 |
| getMethod() | 获取客户端请求方式 |
| getProtocol() | 获取HTTP版本号 |
| getContextPath() | 获取webapp名字 |
示例
// * 常用方法
// * 1.获取请求时的完整路径(从http开始,到?前面结束)
String url = req.getRequestURL() + "";
System.out.println("获取请求时的完整路径:" + url);
// *2.获取请求时的部分路径(从项目的站点名开始,到?前面结束)
String uri = req.getRequestURI() + "";
System.out.println("获取请求时的部分路径:" + uri);
// * 3.获取请求时的参数字符串(从?后面开始,到最后的字符串)
String queryString = req.getQueryString();
System.out.println("获取请求时的参数字符串:" + queryString);
// * 4.获取请求的方式(get和post)
String method = req.getMethod();
System.out.println("获取请求的方式:" + method);
// * 5.获取当前协议版本(http/1.1)
String prototol = req.getProtocol();
System.out.println("获取当前协议版本:" + prototol);
// * 6.获取项目的站点名(项目对外访问路径)
String webapp = req.getContextPath();//上下文路径
System.out.println("获取项目的站点名" + webapp);
2.获取请求的参数
| getParameter(name) | 获取指定名称的参数 |
|---|---|
| getParameterValues(String name) | 获取指定名称参数的所有值 |
7.上下文参数
什么是上下文参数?
个人理解就是像类里面的全局变量定义出来每个方法都能调用
而在javaweb中可以在任意一个Servlet里面调用
//设置contextParam Hello Servlet
//调用
String initParam = getInitParameter("initParam");
String contextParam = this.getServletContext().getInitParameter("contextParam");
System.out.println("Servlet初始化参数“+initParam);
System.out.println("系统初始化参数”+contextParam);



