servlet
servlet介绍
概念
- Servlet它是JavaWEB三大组件(Filter/Listener)之一,也是最重要的一个
- 它是一个接口(规范),servlet是运行在 Web服务器中的小型 Java程序
- servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web客户端的请求
servlet作用
- 获取请求数据
- 处理请求
- 完成响应
实现Servlet的方式
- 实现Servlet接口,并实现该接口下指定的5个方法
- 继承Servlet的已知实现类GenericServlet(抽象类),那么必须实现抽象方法 service(ServletRequest request,ServletResponse response)
- 继承Servlet的已知实现类HttpServlet(抽象类),根据需要(如果是get请求,书写doGet方法;如果是post请求,书写doPost方法)重写doXXX方法!
如何使用
- 编写一个类
- 继承HttpServlet
- 重写doGet或者doPost方法
- 编写配置文件
- 注册servlet
- 绑定路径
- 访问
入门案例
编写HelloServlet类:
package com.itheima.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 HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求已经收到");
}
}
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>web_day34</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 注册servlet -->
<servlet>
<!-- servlet-name:给当前的servlet起个名字 全局唯一 -->
<!-- servlet-class: servlet的全限定类名 -->
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet-mapping:绑定路径 -->
<servlet-mapping>
<!-- servlet-name: 使用上面起好的名字,建议复制过来 -->
<servlet-name>HelloServlet</servlet-name>
<!-- url-pattern:访问路径,要求:必须以“/”开头,唯一 -->
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
访问路径:
http://localhost:8080/web_day34/HelloServlet
执行结果:
servlet执行流程
servlet体系结构
servlet生命周期
生命周期
一个对象的创建到销毁
创建的问题
但凡与Servlet相关的对象,都不是程序员自己创建的,而是由服务器容器tomcat来负责创建的
默认情况
- 用户第一次发送请求,由服务器容器创建Servlet实例(一种类型的Servlet只会创建一个实例对象),会调用初始化方法init(ServletConfig config),该方法在整个Servlet生命周期中只会被执行一次
- 紧接着会调用服务方法service(ServletRequest request,ServletResponse response),该方法在整个Servlet生命周期中会被调用多次(用户发送一次请求,调用一次)
- 当正常关闭服务器或者将这个项目从服务器容器中移除的时候,调用销毁方法destory(),该方法在整个Servlet生命周期中只会被调用一次(在关闭服务器之前调用)
servlet相关配置
服务器启动时创建servlet
- load-on-startup配置项(在web.xml文件中配置)
- 配置一个参数load-on-startup,让servlet在服务器启动的时候就被创建以及初始化
案例
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AServlet implements Servlet {
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("AServlet被初始化了……");
}
/**
* 所有用户请求的代码写在service方法中
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 解决浏览器乱码问题
response.setContentType("text/html;charset=utf-8");
// 向浏览器输出数据
response.getWriter().write("Servlet快速入门");
System.out.println("这是我的一个servlet程序!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>web_day34</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.itheima.servlet.AServlet</servlet-class>
<!-- 服务器启动的时候初始化 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
</web-app>
访问路径的配置
url-pattern
完全匹配
<url-pattern>/DServlet</url-pattern>
目录匹配
<url-pattern>/a/b/*</url-pattern>
只要是a目录下面的b目录下的任何内容
扩展名匹配
<url-pattern>*.do</url-pattern>
只要后缀名是.do都可以匹配到
匹配所有
<url-pattern>/*</url-pattern>
只要是这个项目下面的内容都可以匹配到这个servlet中去
缺省的
<url-pattern>/</url-pattern>
访问的内容与配置的越接近,优先级越高
ServletConfig对象
方法
public java.util.Enumeration<E>getInitParameterNames() ---得到所有初始化参数的值
public String getInitParameter(String name) ---得到指定初始化参数的值
public ServletContext getServletContext()---得到ServletContext对象
public String getServletName() ----------返回一个servlet实例的名称
案例
package com.itheima.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AServlet implements Servlet {
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("AServlet被初始化了……");
// 获得ServletContext对象
ServletContext servletContext = config.getServletContext();
System.out.println(servletContext);
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);///web_day34
// 获得初始化参数值
String username = config.getInitParameter("username");
System.out.println(username);
// 获得Servlet名称
String servletName = config.getServletName();
System.out.println(servletName);
// 获得所有的初始化参数的名称
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
String key = (String) initParameterNames.nextElement();
String value = config.getInitParameter(key);
System.out.println(key+"\t"+value);
}
}
/**
* 所有用户请求的代码写在service方法中
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 解决浏览器乱码问题
response.setContentType("text/html;charset=utf-8");
// 向浏览器输出数据
response.getWriter().write("Servlet快速入门");
System.out.println("这是我的一个servlet程序!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>web_day34</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.itheima.servlet.AServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>baoqiang</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>rongrong</param-value>
</init-param>
<!-- 服务器启动的时候初始化 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
</web-app>
案例——完成登录案例
需求
在页面上输入用户名和密码,提交到服务器上,服务器拿着用户名和密码去数据库中查找有无此用户
若有用户,则提示登录成功
若无此用户,则提示用户名密码不匹配
技术分析
- 表单
- 收集用户数据
- 所有的字段要想提交到服务器必须有name属性
- 提交的地址 action
- 请求的方式post
- servlet
- 请求(request)
- request.getParameter("key");
- 响应(response)
上一篇: mysql优化一之查询优化
下一篇: NuttX的学习笔记 13