servlet学习

一、Servlet 是运行在服务端的Java小程序

二、Servlet规范:包含三个技术点

1)servlet技术

2)filter技术---过滤器

3)listener技术---监听器

三、一般不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,我们一般创建类继承HttpServlet

实现步骤:

1)创建类继承HttpServlet类

2)覆盖doGet和doPost

3)在web.xml中进行servlet的配置

四、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-mapping中的name对应servlet中的namt和包全名,创建对象
servlet学习_第1张图片

servlet学习_第2张图片

六、用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);
	}
}

你可能感兴趣的:(进阶)