一、Servlet 是运行在服务端的Java小程序
二、Servlet规范:包含三个技术点
1)servlet技术
2)filter技术---过滤器
3)listener技术---监听器
三、一般不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,我们一般创建类继承HttpServlet
实现步骤:
1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置
1)Servlet何时创建
默认第一次访问servlet时创建该对象
调用init方法 参数 ServletConfig:代表的是该servlet对象的配置信息
2)Servlet何时销毁
服务器关闭servlet就销毁了
调用destroy方法
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
参数分别代表请求和响应的信息
问题:对XXXServlet进行了10次访问,init() 1,destory()0 还没执行,service() 10 ,doGet(),doPost() 一共执行力多少次?request对象创建10个?response创建10个?
五、Servlet的配置和三种url配置方式六、用servlet完成登陆案例
编写Html页面如下 点击按钮 寻找XML文件中 url 为 /Login 的servlet 即LoginServlet对象
Insert title here
XML配置如下
LoginServlet
login.LoginServlet
LoginServlet
/Login
创建LoginServlet对象 编写的代码如下(需要导入数据库jar包以及编写JavaBean,运用DButil和C3P0等知识)
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//从数据库中验证
QueryRunner runner = new QueryRunner(C3P0Utils.getDataSource()); //DBUtils和C3P0连接池
String sql = "select * from user where username = ? and password = ?";
Object[] params = {username,password};
try {
User user = runner.query(sql, new BeanHandler(User.class),params); //返回编写的JavaBean类对象
//根据返回的结果显示信息
if(user!=null){
System.out.println(user);
response.getWriter().write(user.toString());
}
else
response.getWriter().write("false");
}
catch (SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
七、ServletContext对象
①ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象 内部封装是该web应用的信息,ServletContext对象一个web应用只有一个。一个web应用有多个servlet对象
②ServletContext对象的生命周期?
创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态))
销毁:web应用被卸载(服务器关闭,移除该web应用)
获取方法 在servlet中获取: ServletContext servletContext = this.getServletContext();
③ServletContext的作用
1)获得web应用全局的配置参数
web.XML文件中做如下配置
driver
com.mysql.jdbc.Driver
2)获得web应用中任何资源的绝对路径
现在WebContent文件夹有a文件 WEB-INF文件夹中有b文件 src文件夹中有c文件 web13项目文件中有d文件
3)ServletContext是一个域对象,可以任意servlet往其中存取和获取数据
域对象的通用的方法:
setAtrribute(String name,Object obj); 该servlet往servletcontext中添加数据 name, 值
getAttribute(String name); 获取为name的数据
removeAttribute(String name); 移除
编写测试代码如下
public class ContextServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
//1获取全局配置
String initParameter = context.getInitParameter("driver");
System.out.println(initParameter);
//2获取绝对路径
String realPathA = context.getRealPath("/a.txt");
System.out.println(realPathA);
String realPathB = context.getRealPath("/WEB-INF/b.txt");
System.out.println(realPathB);
String realPathC = context.getRealPath("/WEB-INF/classes/c.txt");//c于src 会被发布到webinf classes
System.out.println(realPathC);
//d不能获取到
//3域对象--向servletcontext存数据,于另一个servlet中取出
context.setAttribute("zhangsan",440);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果
八、例子,做一个注册系统,显示第几个注册
同理,编写一个servlet名字叫resiter 往数据库添加数据,为XML文件填下如下配置,html如下
Insert title here
register
register.Register
register
/Register
点击注册的时候找寻XML文件中/Register的对象类,即register.Register 于此位置创建servlet 代码如下
public class Register extends HttpServlet {
@Override
public void init() throws ServletException { //覆写init方法 ,在创建servlet的时候记录第一次的court
ServletContext context = this.getServletContext();
context.setAttribute("court",0);
super.init();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
QueryRunner runner = new QueryRunner (C3P0Utils.getDataSource()); //DBUtils和C3P0连接池
String sql = "insert into user values(null,?,?,?)";
String username = request.getParameter("username");
String password = request.getParameter("password");
int row = runner.update(sql,username,password,"meessa"); //添加数据到数据库
if(row==1) //插入成功 输入ok以及用户信息 用Servletcontext域对象记录次数
{
response.getWriter().write("OK");
sql = "select * from user where username=?";
User u = runner.query(sql, new BeanHandler(User.class),username);
//用servletcontext记录次数
ServletContext context = this.getServletContext();
int court = (int) context.getAttribute("court");
response.getWriter().write(u.toString()+" court:"+(++court));
context.setAttribute("court",court);
}
else //失败输出false
{
response.getWriter().write("false");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}