Servlet
JavaWeb核心之Servlet 教学导航 教学目标 案例一、完成用户登录功能 案例二、记录成功登录系统的人次 教学方法 一、Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容 servlet规范:包含三个技术点 1)servlet技术 2)filter技术---过滤器 3)listener技术---监听器 2.Servlet快速入门 实现步骤: 1)创建类实现Servlet接口 2)覆盖尚未实现的方法---service方法 3)在web.xml进行servlet的配置 但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet 实现步骤: 1)创建类继承HttpServlet类 2)覆盖doGet和doPost 3)在web.xml中进行servlet的配置 画图描述整个访问过程: 二、Servlet的API(生命周期) (1)Servlet接口中的方法 1)init(ServletConfig config) 何时执行:servlet对象创建的时候执行 ServletConfig : 代表的是该servlet对象的配置信息 2)service(ServletRequest request,ServletResponse response) 何时执行:每次请求都会执行 ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息 ServletResponse :代表响应 认为要封装的是响应的信息 3)destroy() 何时执行:servlet销毁的时候执行 (2)HttpServlet类的方法 1)init() 2)doGet(HttpServletRequest request,HttpServletResponse response) 3)doPost(HttpServletRequest request,HttpServletResponse response) 4)destroy() (3)Servlet的生命周期(面试题) 1)Servlet何时创建 默认第一次访问servlet时创建该对象 2)Servlet何时销毁 服务器关闭servlet就销毁了 3)每次访问必然执行的方法 service(ServletRequest req, ServletResponse res)方法 问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost() 一共执行力多少次?request对象创建几个?response创建几个? 三、Servlet的配置 1.基本配置 其中url-pattern的配置方式: 1)完全匹配 访问的资源与配置的资源完全相同才能访问到 2)目录匹配 格式:/虚拟的目录../* *代表任意 3)扩展名匹配 格式:*.扩展名 注意:第二种与第三种不要混用 /aaa/bbb/*.abcd(错误的) 2.服务器启动实例化Servlet配置 Servlet的何时创建:默认第一次访问时创建 为什么是默认? 当在servlet的配置时 加上一个配置 <load-on-startup> servlet对象在服务器启动 时就创建 3.缺省Servlet 可以将url-pattern配置一个/,代表该servlet是缺省的servlet 什么是缺省的servlet? 当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理 其实,web应用中所有的资源的响应都是servlet负责,包括静态资源 4.欢迎页面 四、ServletContext对象 1.什么是ServletContext对象 ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该web应用的信息,ServletContext对象一个web应用只有一个 问题:一个web应用有几个servlet对象?----多个 ServletContext对象的生命周期? 创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状 态)) 销毁:web应用被卸载(服务器关闭,移除该web应用) 2.怎样获得ServletContext对象 1)ServletContext servletContext = config.getServletContext(); 2)ServletContext servletContext = this.getServletContext(); 3.ServletContext的作用 (1)获得web应用全局的初始化参数 web.xml中配置初始化参数 通过context对象获得参数 (2)获得web应用中任何资源的绝对路径(重要 重要 重要) 方法:String path = context.getRealPath(相对于该web应用的相对地址); (3)ServletContext是一个域对象(重要 重要 重要) 什么是域对象?什么是域? 存储数据的区域就是域对象 ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享) 域对象的通用的方法: setAtrribute(String name,Object obj); getAttribute(String name); removeAttribute(String name);
个人总结:new--servlet---设置urlpattern(web.xml不用操作),servletcontext 3个功能
servlet简介
Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容
包含三个技术点:1.servlet 2filter技术--过滤器 3listener技术--监听器
快速入门:
1)创建类实现Servlet接口
2)覆盖尚未实现的方法---service方法
3)在web.xml进行servlet的配置
package com.heima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; public class QuickStartServlet implements Servlet { @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig arg0) throws ServletException { } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("qucikstartservlet running.."); HttpServletResponse response=(HttpServletResponse) arg1; response.getWriter().write("heihei"); } }
<?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>web13</display-name> <servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abc</servlet-name> <url-pattern>/qqqq</url-pattern> </servlet-mapping> <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> </web-app>
servlet的api
(1)Servlet接口中的方法
1)init(ServletConfig config)
何时执行:servlet对象创建的时候执行(tomcat创建该对象)
ServletConfig : 代表的是该servlet对象的配置信息
<servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql///abc</param-value> </init-param> </servlet>
@Override public void init(ServletConfig config) throws ServletException { System.out.println("initing..."); //1.得到servlet的name String servletName=config.getServletName(); System.out.println(servletName);//abc //2.获得该servlet的初始化参数 String initParameter=config.getInitParameter("url"); System.out.println(initParameter); //3.获得ServletContext对象 ServletContext servletContext=config.getServletContext(); }
2)service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息
3)destroy()
何时执行:servlet销毁的时候执行
(1)Servlet的生命周期(面试题)
1)Servlet何时创建
默认第一次访问servlet时创建该对象
2)Servlet何时销毁
服务器关闭servlet就销毁了
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
servletrequest内部封装的是http请求的信息
servletresponse代表响应认为要封装的是响应的信息
servlet的执行过程
servlet配置
1.基本配置
2.服务器启动实例化Servlet配置
Servlet的何时创建:默认第一次访问时创建
为什么是默认?
当在servlet的配置时 加上一个配置 <load-on-startup> servlet对象在服务器启动 时就创建
<servlet> <servlet-name>abc</servlet-name> <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql:///abc1</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
数字代表优先级,越小优先级越高
3.缺省servlet
可以将url-pattern配置一个/,代表该servlet是缺省的servlet
什么是缺省的servlet?
当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理。 其实,web应用中所有的资源的响应都是servlet负责,包括静态资源
自定义web.xml查找动态的url,动态查找不到, tomcat conf下的apache-tomcat-7.0.52\conf下的web.xml全局配置,查找静态webapp下的静态资源
<servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
DefaultServlet查找静态资源,找出到输出404
4.欢迎页面
<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>
输入http://localhost:8080/web13/,个人配置里没有动态默认配置,查找webap下的 index.html等文件。个人配置里没有欢迎页面配置,则查找全局配置下的web。xml配置
HttpServlet
eclipse新建servlet对象,继承HttpServlet,没有service方法,查看源码,查看继承对象。doGet里会调用service方法
用户登录功能实现
1.数据库操作支持: mysql驱动,DBUtils,连接池(lib和xml)2 web.xml(url对应servlet对象) 3.servlet对象
package com.heima.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import com.heima.domain.User; import com.heima.utils.DataSourceUtils; public class loginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获得用户名和密码 String username =request.getParameter("username"); String password=request.getParameter("password"); //2.验证 QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource()); String sql="select * from user where username=? and password=?"; User user=null; try { user=runner.query(sql, new BeanHandler<User>(User.class),username,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.根据返回结果 if(user!=null){ //成功 response.getWriter().write(user.toString()); }else{ //失败 response.getWriter().write("wrong username or password"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
servletContex对象
什么是servletContext:ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该web应用的信息,ServletContext对象一个web应用只有一个
问题:一个web应用有几个servlet对象?----多个
ServletContext对象的生命周期?
创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状 态))
销毁:web应用被卸载(服务器关闭,移除该web应用)
如何获得servletContext
1)ServletContext servletContext = config.getServletContext();(一般不用)
2)ServletContext servletContext = this.getServletContext();
ServletContext的作用
1.获得web应用全局的初始化参数
web.xml中配置初始化参数
通过context对象获得参数值
2获得web应用中任何资源的绝对路径(重要 重要 重要)
方法:String path = context.getRealPath(相对于该web应用的相对地址);
3ServletContext是一个域对象(重要 重要 重要)
什么是域对象?什么是域?
存储数据的区域就是域对象
ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name)
package com.heima.servlet; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ContextServert extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().write("doGet runing..."); //1.获得context对象 ServletContext context=this.getServletContext(); //1。初始化参数 String initParameter = context.getInitParameter("name"); System.out.println(initParameter); //2.获得 绝对路径 String realPath_A = context.getRealPath("/a.txt"); // /目录为WebContent System.out.println(realPath_A); //3.域对象 存数据 context.setAttribute("name", "heiheihei"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
实现记录用户登录次数功能
package com.heima.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import com.heima.domain.User; import com.heima.utils.DataSourceUtils; public class loginServlet extends HttpServlet { @Override public void init() throws ServletException { //zai context中存数据 int count=0; this.getServletContext().setAttribute("count", count); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获得用户名和密码 String username =request.getParameter("username"); String password=request.getParameter("password"); //2.验证 QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource()); String sql="select * from user where username=? and password=?"; User user=null; try { user=runner.query(sql, new BeanHandler<User>(User.class),username,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.根据返回结果 if(user!=null){ //从context中取出count进行加运算 Integer count = (Integer)this.getServletContext().getAttribute("count"); count++; this.getServletContext().setAttribute("count", count); //用户登录成功 response.getWriter().write(user.toString()+"you are success login "+count); }else{ //失败 response.getWriter().write("wrong username or password"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }