Servlet(1)----------简介及Servlet+JDBC整合

1、Servlet是JAVAEE规范下的一个子规范,是运行于服务器端的一段JAVA程序,主要用于编写动态JAVAWEB网页。

2、servlet技术特点:

    1)功能强大:采用java语言编写,可以调用API中的对象及方法,servlet对象对web应用进行了封装,提供servlet对web应用的编程接口,还对Http请求进行相应的处理。

    2)可移植:java语言是跨平台的,servlet继承了java语言的优点,一次编码,多平台运行。

    3)性能高:servlet只需Web服务器加载一次,而且可以在不同请求之间保持服务;servlet对象在servlet容器启动时被初始化,第一次被请求时,servlet容器将其实例化,此时它将驻存于内存中。如果存在多个请求,servlet不会再被实例化,仍然由此servlet对其进行处理。每个请求是一个线程,而不是一个进程。

    4)安全性高:servlet使用了java安全框架,同时servlet容器还为servlet提供额外的功能,从外界调用一个servlet的惟一方法就是通过Web服务器。

    5)可扩展:由于servlet是用Java编写的,它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言,它很容易扩展以适应你的需求。servlet自然也具备了这些特征。

3、如何实现一个Servlet程序:

    1)在javax.servlet包下有一个Servlet接口,所有的servlet直接或间接的实现servlet方法。

    2)核心实现service方法来处理请求:参数:servletRequest 对象  专门处理请求方向相关事宜。

                                                                        servletReponse对象  专门处理响应方向的事宜。

4、使用Servlet手动开发一个动态的web应用,步骤如下:

            1)编写Servlet程序:定义一个类实现Servlet接口,并是实现service方法:   

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstServlet implements Servlet {

	@Override
	public void destroy() {
	

	}

	@Override
	public ServletConfig getServletConfig() {
		
		return null;
	}

	@Override
	public String getServletInfo() {
		
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		

	}

	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		//1、设置编码格式 和 响应类型
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		
		//2、获取输出流
		PrintWriter out = response.getWriter();
		//3、响应的结果
		out.append("<html>");
		out.append("<body>");
		for(int i=0;i<5;i++)
			out.append("<p style='color:red;font-size:60px;'>"+"hello world!"+"<p>");
		out.append("</body>");
		out.append("</html>");
		//清空缓存区
		out.flush();

	}

}

                2)编译:在  项目-->WebRoot-->WEB-INF-lib  中加入servlet-api.jar(D:\apache-tomcat-8.0.50\lib目录下)

                3)在服务器中部署项目:将编译好的.class文件放到tomcat--webapps下项目中的WEB-INF-classes中(带包名)

                4)编写web.xml(部署描述符)

 <servlet>
        <!--  为servlet起个别名(唯一)  -->
  	<servlet-name>firstServlet</servlet-name>
  	<!--  全限定名(包名+类名)   -->
  	<servlet-class>com.baizhi.first.servlet.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<!-- 为servlet起个别名(唯一),与上文保持一致 -->
	<servlet-name>firstServlet</servlet-name>
	<!-- 指定访问时的路径 -->
	<url-pattern>/showData</url-pattern>  
  </servlet-mapping>

                5)启动服务器测试:

            注意:注意启动服务器时,服务器会主动读取项目中的web.xml文件。

5、servlet简单执行流程

            

6、Servlet生命周期

        1)初始化:1.1)当用户第一次请求某个Servlet的时候

                           1.2)在启动服务器的时候初始化:需要在web.xml中指定:<load-on-startup>1</load-on-startup>

        2)服务:处理请求

        3)销毁:关闭服务器时销毁

注意:Servlet是单例的:

         每一次请求到达服务器时,服务器会检查有没有下一个目标的请求,如果没有则创建,如果有,则拿来直接使用。

        由于servlet是单例的,所有的用户共享的是一个对象,所以在servlet实现类中不建议定义成员变量,在高并发情况下Servlet是线程不安全的。


7、使用Eclipse集成环境开发,先配置服务器;

        1)继承javax.servlet.http.HttpServlet

                类关系:javax.servlet.http.HttpServlet extends GenericServlet

                              GenericServlet  implements Servlet

8、路径概念:

        1)URL:统一资源定位符。

                作用:唯一在网络上标识一个资源。比如:http://localhost:8888/ServletDay_1/showDate

        2)URI:统一资源描述符。

                作用:用于在web服务器唯一标识一个资源。比如:/ServletDay_1/showDate

        3)url-pattern:用于唯一在一个项目中标识一个资源 。比如:配置web.xml

9、请求一个servlet的几种方式:

        1)地址栏请求:比如:localhost:8888:/servlet_day1/showDate

        2)HTML页面超链接请求:比如<a href=”/servlet_day1/showDate“>点我啊!</a>

        3)HTML页面的表单请求:比如<form action='/servlet_day1/showDate' method='get/post'> </form>

        4)请求转发的方式  : 比如request.getRequestDispatcher('/showDate');

        5)请求重定向:比如response.sendRedirect('/servlet_day1/showDate');

10、JDBC+Servlet整合实现登陆功能

entity包:实体类

package entity;

public class Person {
	private String username;
	private String password;
	public Person(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	public Person() {
		super();
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "PersonBean [username=" + username + ", password=" + password
				+ "]";
	}
	
	
}

dao包:操作数据口(接口)

package dao;

import entity.Person;

public interface PersonDao {
	Person seletPerson(String username,String password);
}

daoImpl包:实现dao包中的接口

package daoImpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import util.JDBCUtil;
import dao.PersonDao;
import entity.Person;

public class PersonDaoImpl implements PersonDao {

	
	@Test
	public Person seletPerson(String username,String password) {
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		Person p=null;
		String sql = "select * from test_user where username=? and password=?";
		
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, username);
			ps.setString(2, password);
			rs = ps.executeQuery();
			if(rs.next()){
				p = new Person(rs.getString(1),rs.getString(2));
			}
			return p;
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new  RuntimeException("出现错误!");
		}finally{
			JDBCUtil.closeAll(ps, null, rs);
		}
	}

}

service包:业务层(接口)

package service;

import entity.Person;

public interface PersonService {
	Person login(String username,String password);
}

serviceImpl:实现业务层接口

package serviceImpl;

import java.sql.Connection;
import java.sql.SQLException;

import service.PersonService;
import util.JDBCUtil;
import dao.PersonDao;
import daoImpl.PersonDaoImpl;
import entity.Person;

public class PersonServiceImpl implements PersonService {

	private PersonDao pd = new PersonDaoImpl();
	@Override
	public Person login(String username, String password) {
		
		
		Connection conn = JDBCUtil.getConnection();
		try{
			conn.setAutoCommit(false);
			Person person = pd.seletPerson(username, password);
			conn.commit();
			return person;
		}catch(Exception e){
			e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			throw new RuntimeException("出问题了-----");
		}
	}

}

servlet:处理请求并响应

package servlet;

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import service.PersonService;
import serviceImpl.PersonServiceImpl;
import entity.Person;

public class LoginServlet extends HttpServlet {
	public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		PersonService ps = new PersonServiceImpl();
		Person person = ps.login(username,password);
		
                if(person!=null)
                    out.println("<html><body><h1>登陆成功!</h1></body></html>");
                  else                     out.println("<html><body><h1>登陆失败!</h1></body></html>");}}

仅为个人笔记!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值