Servlet类:
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容。
负责处理响应与请求,相当于Controller层。
实现步骤:
1)创建类实现Servlet接口
2)覆盖尚未实现的方法---重点实现service方法
3)在web.xml进行servlet的配置
在Java Resuorces 的src包上,创建类继承servlet类。
当修改源代码时,必须重启服务器。让服务器在复制一份项目。
localhost:8080/WEB01/MyServlet(WEB01后面就可以跟虚拟路径了)
init()方法只会执行一次,service()访问一次执行一次。
当关闭服务器时,destroy被执行,但是只有servers上的红灯关闭(stop()),才会被执行,当控制台上的强制关闭时,不会被执行。
访问过程:
解析请求地址:服务器操作的:
当访问虚拟路径时,WEB01/MyServlet寻找web.xml文件,在找<servlet-mapping>,再找<url-pattern>/MyServlet</url-pattern>,<servlet-name>MyServlet</servlet-name>,再找<servlet-name>MyServlet</servlet-name>,<servlet-class>com.oracle.demo01.MyServlet</servlet-class>。
将客户端的请求,按照http协议的格式,封装成http请求(请求行,请求头,请求体),发送给服务器,Tormat引擎第一步会解析请求地址,第二部创建Servlet对象(利用反射),第三步创建代表请求的request对象和代表代表响应的response对象,将请求信息封装到request对象,同时创建了一个response对象,第四步(因为要访问MyServlet),必然会执行service方法,service()方法有2个参数,request对象和response(是空的)对象,第三步到第四步,Tormat引擎会将这2个形参传过去,并且request封装的是请求信息,也就是说可以用arg0访问http请求的参数(请求行,请求头,请求体)。只有服务器响应客户端时,response(响应请求)才会被填充,也就说request时get方法(里面是满的,能通过get()方法得到),response是set方法(是空的,等着用set()方法赋值)。
总结:没访问一次,创建一个request对象和response对象,两者相对。
public class MyServlet implements Servlet{ public void init(ServletConfig arg0) throws ServletException { System.out.println("MyServlet被创建了"); //1:获取servlet初始化参数 String value=arg0.getInitParameter("url"); System.out.println(value); //2:获取Servlet名 String name=arg0.getServletName(); System.out.println(name); //3:获取ServletContext对象 ServletContext context=arg0.getServletContext(); } public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("MyServlet被访问了"); } public void destroy() { System.out.println("MyServlet被销毁了"); } public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } public String getServletInfo() { // TODO Auto-generated method stub return null; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="#" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="提交"> </form> </body> </html>
<?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>WEB01</display-name> <servlet> <servlet-name>MyServlet</servlet-name> //实际上这里的名字可以随便起,但必须和下面的map映射的名字一致 <servlet-class>com.oracle.demo01.MyServlet</servlet-class> //实际路径 <init-param> //初始化参数 <param-name>url</param-name> <param-value>mysql:localhost:3306</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</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> <servlet> <description></description> <display-name>Servlet01</display-name> <servlet-name>Servlet01</servlet-name> <servlet-class>com.oracle.demo01.Servlet01</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet01</servlet-name> <!-- 完全匹配 --> <!-- 目录匹配 --> <!-- <servlet-name>/Servlet01</servlet-name> --> <url-pattern>/admin/*</url-pattern> <!-- 扩展名匹配 --> <!-- <url-pattern>*.abc</url-pattern> --> </servlet-mapping> </web-app>
Servlet的生命周期:
1)init(ServletConfig config)
何时执行:servlet对象创建的时候执行
ServletConfig : 代表的是该servlet对象的配置信息 <servlet-name>MyServlet</servlet-name> <servlet-class>com.oracle.demo01.MyServlet</servlet-class> 封装的信息
2)service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息
3)destroy()
何时执行:servlet销毁的时候执行
面试题
1)Servlet何时创建
默认(服务器启动时)第一次访问servlet时创建该对象
2)Servlet何时销毁
服务器关闭servlet就销毁了
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
问题:对XXXServlet进行了10次访问,init()一次,destory()一次,service()10次,doGet()10次,doPost()10次 一共执行力多少次?request对象创建几个?10个response创建几个?10个
Servlet的配置:
<!-- 完全匹配 -->
<servlet-name>Servlet01</servlet-name>
<url-pattern>/Servlet01</url-pattern>
<!-- 目录匹配 -->
<!-- <url-pattern>/admin/*</url-pattern> -->
<!-- 扩展名匹配 -->
<!-- <url-pattern>*.abc</url-pattern> -->
完全匹配可以与目录匹配可以。
欢迎页面:
<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接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet
实现步骤:
1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置
在包上右键Servlet,
配置模板过程:
windows preferences template(模板) Java Templates New servlet
package com.oracle.demo01; 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 Servlet01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("hello dandan...");//写入客户端 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
重命名时,需将xml中的手动改地址。
doGet()方法实际上就是service方法,如果是get请求走get()方法,如果是post请求调用post()方法
如果不行将服务器的WEB项目删掉(先将服务器关掉)
登录功能:
Dynasmic WEB Project Target runtime 7.0 版本2.5 Java Resources 建包 WebContent新建JSP File
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="/WEB02/LoginServlet" method="post"> //action指的是要访问的虚拟路径 用户名:<input type="text" name="username"><br> 密码:<input type="text" name="password"><br> <input type="submit" value="登录"> </form> </body> </html> //叫login.jsp
package com.oracle.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.oracle.tools.JDBCUtils; public class UserDao { public int login(String uname,String pwd) throws SQLException{ Connection conn=JDBCUtils.getConn(); String sql="select count(*) from user where uname=? and pwd=?"; PreparedStatement pst=conn.prepareStatement(sql); pst.setString(1, uname); pst.setString(2, pwd); ResultSet rs=pst.executeQuery(); int count=0; while(rs.next()){ count=rs.getInt(1); } JDBCUtils.close(conn, pst, rs); return count; } }
package com.oracle.service; import java.sql.SQLException; import com.oracle.dao.UserDao; public class UserService { private UserDao userDao=new UserDao(); public int login(String uname,String pwd){ int count=0; try { count=userDao.login(uname, pwd); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return count; } }
package com.oracle.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.oracle.service.UserService; public class LoginServlet extends HttpServlet { private UserService userService=new UserService(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取用户名密码 String uname=request.getParameter("username"); String pwd=request.getParameter("password"); int count=userService.login(uname, pwd); if(count>0){ //响应客户端 response.getWriter().write("ok"); }else{ response.getWriter().write("false"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package com.oracle.tools; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCUtils { // 获取连接对象 public static Connection getConn() { // 1.注册驱动 Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接对象 String url = "jdbc:mysql://localhost:3306/demo0803?characterEncoding=utf8"; String user = "root"; String pwd = "123456"; conn= DriverManager.getConnection(url, user, pwd); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } //增删改释放资源 public static void close(Connection conn, PreparedStatement pst){ if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //查询释放资源 public static void close(Connection conn, PreparedStatement pst,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }