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("");
out.append("");
for(int i=0;i<5;i++)
out.append(""+"hello world!"+"
");
out.append("");
out.append("");
//清空缓存区
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(部署描述符)
firstServlet
com.baizhi.first.servlet.FirstServlet
firstServlet
/showData
5)启动服务器测试:
注意:注意启动服务器时,服务器会主动读取项目中的web.xml文件。
5、servlet简单执行流程
6、Servlet生命周期
1)初始化:1.1)当用户第一次请求某个Servlet的时候
1.2)在启动服务器的时候初始化:需要在web.xml中指定:
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页面超链接请求:比如/servlet_day1/showDate“>点我啊!
3)HTML页面的表单请求:比如
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("登陆成功!
");
else out.println("仅为个人笔记!