Servlet
Servlet
什么是Servlet
- Servlet是一组规范,包含了与服务端小程序相关的API
- Servlet是运行在服务器(Tomcat)的小程序
- 作用/功能
- 用来接收客户端的请求,并对客户端进行响应
- 通常使用的是HTTP协议
如何开发/使用一个Servlet
- Servlet
- 接口
- 规范了客户端浏览器与服务端如何进行交互
- 提供了相应的API
- Servlet对象不是由程序员创建,而是由Tomcat创建的,包括回收Servlet对象,也是由Tomcat来做的
- init() -- 对Servlet进行初始化
- 当Tomcat创建完Servlet对象后,将会调用init方法对Servlet对象进行初始化
- service() -- 提供服务,处理/响应当前请求
- ServletRequest:请求对象
- ServletResponse:响应对象
- getServletConfig() -- 获取配制信息,返回Serclet的配制信息
- ServletConfig不能自己创建
- getServletInfo() -- 获取描述信息,返回Servlet说明
- destroy() -- 当处理完请求/响应后,Tomcat会销毁当前的Servlet对象
- web.xml添加声明
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>ServletTest</servlet-name> <servlet-class>ServletTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletTest</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> </web-app>
- GenericServlet
- 它是Servlet接口的实现类
- 此实现类可以实现HTTP协议的请求,也可以实现非HTTP协议的请求
- HttpServlet(常用)
- 它是Servlet接口的实现类
- 此实现类可以实现HTTP协议的请求
Servlet处理请求(ServletRequest)
- 此接口封装了所有客户端的请求参数
- 此接口对象是由Servlet容器(Tomcat)创建
- 此接口中提供了相应的函数/方法来获取请求的参数
- HttpServletRequest是继承ServletRequest接口
- HttpServletRequest主要针对HTTP协议,方法是针对HTTP请求的
- ServletRequest常用的方法
- getParameter(String) -- 根据请求的参数名称获取请求的参数值
- getParameterValues(String) -- 根据请求的参数名称获取请求的参数值(返回一个数组)
- getParameterNames() -- 获取请求参数中所有的name属性值(返回值 Enumeration)枚举
- getParameterMap() -- 获取请求参数,以Map(String,String[])集合形式返回
- HttpServletRequest常用方法
- String getHeader(String) -- 根据指定的请求头key,获得对应的value值
- Enumeration getHeaderNames() -- 获取所有消息头的信息
- int getIntHeader() -- 获得消息头指定的key的value值,并转换成int类型
- String getMethod() -- 获得请求方法的类型
- String getProtocol() -- 获取HTTP协议版本
- String getRequestURI() -- 获取当前请求地址
- StringBuffer getRequestURL() -- 获取完整的访问请求路径
- String getServletPath() -- 获得服务端的请求路径(不包含应用名)
- String getContextPath() -- 获得部署后的应用名称
- String getQueryString() -- url中查询字符串
Servlet处理响应(ServletResponse)
- 当服务端向客户端响应结果时,需要使用ServletResponse
- ServletResponse是Servlet容器创建的
- 向客户端浏览器发送一些响应的结果信息
- 常用方法
- setContentType() -- 设置向客户端返回数据的类型
- PrintWrite getWrite() -- 返回打印流,可以使用此打印流向客户端响应数据
- HttpServletResponse常用方法
- 继承自ServletResponse
- void sendRedirect(String) -- 重定向
案例代码--登录
- dao
package com.oracle.dao; import com.oracle.util.JdbcUtil; import com.oracle.vo.User_web; import java.util.List; public class UserWebDao { public List<User_web> Login (String username,String password){ String sql = "select * from user_web where username=? and pwd =?"; List<User_web> list = JdbcUtil.executeQuery(User_web.class,sql,username,password); System.out.println(list); return list; } }
- service
package com.oracle.service; import com.oracle.dao.UserWebDao; import java.util.List; public class LoginService { private UserWebDao userWebDao; public LoginService(){ userWebDao = new UserWebDao(); } public boolean Login(String username,String password){ List list = userWebDao.Login(username,password); if(list.isEmpty()){ return false; }else{ return true; } } }
- servlet
package com.oracle.servlet; import com.oracle.service.LoginService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "LoginServlet",urlPatterns = "/login.do") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取账号密码 String username = request.getParameter("username"); String password = request.getParameter("password"); LoginService loginService = new LoginService(); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); if(loginService.Login(username,password)){ response.sendRedirect("yes.html"); }else{ response.sendRedirect("no.html"); } } }
- JDBC
package com.oracle.util; import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; public class JdbcUtil { static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection(){ Connection conn = null; try { conn = DriverManager.getConnection("jdbc:mysql://IP地址:3306/java2006?characterEncoding=utf8","账号","密码"); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static int executeUpdate(String sql,Object...args){ int count = 0; try(Connection conn= JdbcUtil.getConnection(); PreparedStatement ps=conn.prepareStatement(sql)){ for(int i=0;i<args.length;i++){ ps.setObject(i+1,args[i]); } count = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } return count; } public static <T> List<T> executeQuery(Class<T> clazz, String sql, Object...args){ List<T> list = new ArrayList<T>(); try(PreparedStatement ps = getConnection().prepareStatement(sql);) { for(int i=0;i<args.length;i++){ ps.setObject(i+1,args[i]); } ResultSet rs = ps.executeQuery(); Field[] fields = clazz.getDeclaredFields(); //获取传递类实例中所有的属性 while(rs.next()) { T t = clazz.newInstance(); for(Field field : fields){ field.setAccessible(true); field.set(t,rs.getObject(field.getName())); } list.add(t); } } catch (SQLException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return list; } }
- vo
package com.oracle.vo; public class User_web { private Integer id; private String username; private String pwd; private String chinese_name; public User_web() { } public User_web(Integer id, String username, String pwd, String chinese_name) { this.id = id; this.username = username; this.pwd = pwd; this.chinese_name = chinese_name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getChinese_name() { return chinese_name; } public void setChinese_name(String chinese_name) { this.chinese_name = chinese_name; } @Override public String toString() { return "User_web{" + "id=" + id + ", username='" + username + '\'' + ", pwd='" + pwd + '\'' + ", chinese_name='" + chinese_name + '\'' + '}'; } }
- login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="login.do" method="get"> 账户:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登录"> </form> </body> </html>
- yes,html
<html> <head> <tittle></tittle> </head> <body> <h1>登录成功</h1> <h1>啦啦啦,热部署测试</h1> </body> </html>
- no.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录失败</title> </head> <body> <h1>登录失败</h1> </body> </html>
会话
- 会话称为Session
- 当客户端浏览器第一次访问服务端时,服务端会创建一个"标识",然后将标识响应客户端浏览器,客户端浏览器在第二次发送请求时,将携带这个标识发送给服务器。这个时候服务端就知道当前客户端的身份了
- HTTP协议是无状态无连接的,本身不具备识别客户端浏览器身份的,需要借助于提供的会话来实现状态识别的效果
- 特点:
- 在客户端浏览器不关闭的情况下,服务器会识别出客户端浏览器的身份
- 在客户端浏览器关闭的情况下,标识将会被清空,再次打开客户端浏览器时,标识就没有了,再次请求时,服务器识别不到客户单浏览器的身份,服务器就会创建一个新的标识,响应给客户端浏览器
- 在一个会话中,可以实现多个请求,并且可以通过会话来实现数据共享
Servlet实现会话
- 实现会话跟踪
- HttpSession接口
- 如何获得一个会话
- HttpSession session = request.getSession()
- 常用的方法
- session本身方法
- getId()
- 获得会话id
- 此id是由Servlet容器创建的
- 它是当前会话的位移标识符
- getCreationTime -- 获取会话创建时间
- getLestAccessedTime() -- 最后一次访问会话的时间
- getMaxInactiveInterval() -- 获得最大的间隔时间(seconds,单位:秒)
- setMaxInactiveTime() -- 设置最大的间隔时间
- isNew() -- 是否是新创建的会话
- invalidate() -- 让session解除绑定/失效
- session对数据操作方法
- setAttribute(String name,Object object) -- 将数据存储到session会话对象中,以键值对形式体现
- Object getAttribute(String name) -- 通过指定的属性名称获取相应的值
- removeAttribute(String name) -- 移除session中指定的key/value
- Enumeration getAttributeNames()获取所有的key值
- 设置Session最大间隔时间
- 方法一:setMaxInactiveTime(时间,秒)
- 方法二:在web.xml中修改(单位:分钟)
- 通过web.xml配制session的最大间隔时间,所有的session对象都生效
<session-config> <session-timeout>时间(单位:分钟)</session-timeout> </session-config>
Cookie
- Cookie
- 由于session会话对象不能长期保存一些信息,所以,可以使用浏览器中的Cookie文件来存储信息
- Cookie中可以存储少量的文本信息
- Cookie是由服务端向客户端浏览器发送的信息
- 客户端浏览器得到信息后,将信息回传到服务端
- 应用场景与Session类似,区别是Session不能长期保存,浏览器关闭后Session会被销毁,Cookie数据不会消失,下一次启动浏览器时,可以从Cookie中读取数据,同时,Cookie文件中的数据可以设置有效市场,超过时长范围会自动清空
- Cookie从使用角度
- 购物车
- 自动登录
操作Cookie
- 创建Cookie
- 服务端向客户端发送信息
- 客户端接收服务端发送的信息
ServletContext
- Servlet上下文对象
- 此接口对象是由Servlet容器创建的(Tomcat)
- 通过此上下文对象对Web容器进行访问
- 当Tomcat启动后,会为每一个应用创建一个唯一的上下文对象(ServletContext)
- 获取
- HttpSession
- request.getSession().getServletContext()
- HttpServletRquest
- request.getServletContext()
- 常用方法
- 数据操作
- void setAttribute(String name,Object object)
- Object getAttribute(String name)
- void removeAttribute()
- Enumeration getAttributeNames()
- 容器操作
- String getRealPath(String path)
- String getContextPath()
ServletConfig
- ServletConfig接口是由Servlet创建的
- ServletConfig对象主要是用于配制Servlet的信息的
- 作用:当Servlet启动时,可以读取外部的配制信息,对Servlet进行初始化
- 使用方式
- XML
<init-param> <param-name>:参数名 <param-value>:参数值 </init-param> <load-on-startup>优先级 -- 在Tomcat启动时便启动 </load-on-startup>
- Annotation
@WebServlet(name = "MyInitServlet",urlPatterns = "/init.do",loadOnStartup = 1,
initParams = {
@WebInitParam(name = "driver",value = "com.mysql.jdbc.Driver"),
@WebInitParam(name = "url",value = "jdbc:mysql://localhost:3306/java")
//等等等等
}
)
- 常用方法
- String getInitParameter(String name) -- 根据指定的参数名获得参数值
- Enumeration getInitParameterNames() -- 获得所有参数的名称
- ServletContext getServletContext() -- 获取ServletContext上下文对象
如有问题,请发送邮件至buxiaqingcheng@163.com或者buxiaqingcheng@dingtalk.com