Servlet简介
servlet是运行在服务端的java小程序,是sun公司提供的一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。实际上,servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
servlet规范:1.servlet技术、filter技术(过滤器)、listener(监听器)
servlet的一般步骤:
1.创建类实现servlet接口
2.覆盖尚未实现的方法
3.在web.xml进行servlet的配置
在实际开发中,我们不会去实现servlet接口,一般直接创建HttpServlet,实际上直接在项目下的src下直接创建servlet类,然后再进行web.xml的配置。
Servlet接口中的方法
1.init(ServletConfig config)
何时执行:servlet对象创建的时候执行
ServletConfig : 代表的是该servlet对象的配置信息
2.service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息
ServletResponse :代表响应 认为要封装的是响应的信息
3.destroy()
何时执行:servlet销毁的时候执行
HttpServlet类的方法
- init()
- doGet(HttpServletRequest request,HttpServletResponse response)
- doPost(HttpServletRequest request,HttpServletResponse response)
- destroy()
Servlrt的几个问题点
1.Servlet何时创建
默认第一次访问servlet时创建该对象
2.Servlet何时销毁
服务器关闭servlet就销毁了
3.每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
Servlet的配置
<?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>webtest</display-name>
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.ljw.myservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>1.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 的配置项,主要分为servlet和servlet-mapping的配置,其中url-pattern的配置方式需要注意:
1)完全匹配 访问的资源与配置的资源完全相同才能访问到
2)目录匹配 格式:/虚拟的目录../* *代表任意
3)扩展名匹配 格式:*.扩展名
注意第二种与第三种不要混用 /aaa/bbb/*.abcd(错误的)
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-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
通过context对象获得参数
//获得ServletContext对象
ServletContext context = getServletContext();
//获得初始化参数
String initParameter = context.getInitParameter("driver");
System.out.println(initParameter);
(2)获得web应用中任何资源的绝对路径
方法:String path = context.getRealPath(相对于该web应用的相对地址);
(3)ServletContext可以作为一个域对象,从而使得所有的web资源都可以随意向servletContext域中存取数据,数据实现共享。
域对象的通用的方法:
serAttribute(String name,Object obj);//存数据
getAttribute(String name);//取数据
removeAttribute(String name);//移除数据
用户登陆功能
首先要建立一个servlet对象来完成登录
该servlet对象相关代码如下,如果是在src下直接右键建立servlet那么web.xml则会自动生成相关的配置文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
//获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//从数据库中验证该用户名和密码
QueryRunner qr = new QueryRunner(JDBCutils.getdatasource());
String sql = "select * from user where username=? and password=?";
user us = null;
try {
us = qr.query(sql, new BeanHandler<user>(user.class),username,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//根据返回的结果给用户显示不同的信息
if(us!=null) {
response.getWriter().println(us.toString());
}else {
response.getWriter().println("can not found the user!");
}
}
用户登录计数功能
首先初始化一个变量count的值为0,随后将这个值存入到servletContext中
public void init() throws ServletException{
int count = 0;
this.getServletContext().setAttribute("count",count);
}
随后在登录成功的代码后添加如下代码:(此处应是登录的servlet对象中)值得一提的是在这个servlet对象中有一个跳转页面的操作:response.setHeader("Refresh","5;url=下一个跳转的页面的路径")
int count = (int)this.getServletContext().getAttribute("count");
count++;
this.getServletContext().setAttribute("count",count);
最后在新建立的计数servlet对象下获得count的值,然后输出count登录的人数值
response.setContentType("text/html;charset=utf-8");
int count =(int)this.getServletContext().getAttribute("count");
response.getWriter().println("<h1>您是第"+count+“位登录成功的用户!</h1>”);
另外附上单个页面显示的写法
public class LoginServlet extends HttpServlet {
@Override
public void init() throws ServletException {
//在Seveltcontext域中存一个数据count
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) {
e.printStackTrace();
}
//3、根据返回的结果给用户不同显示信息
if(user!=null){
//从servletcontext中取出count进行++运算
ServletContext context = this.getServletContext();
Integer count = (Integer) context.getAttribute("count");
count++;
//用户登录成功
response.getWriter().write(user.toString()+"---you are success login person :"+count);
context.setAttribute("count", count);
}else{
//用户登录失败
response.getWriter().write("sorry your username or password is wrong");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}