Servlet基本介绍
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
- 性能明显更好。
- Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
- Servlet 是独立于平台的,因为它们是用 Java 编写的。
- 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
- Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
Servlet本身不做任何业务处理,只是接收请求并决定调用哪个JavaBean去处理请求,并确定用哪个页面来显示处理返回的数据。
Servlet API
主要Servlet API介绍:
javax.servlet.Servlet接口
- 所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
javax.servlet.GenericServlet类
- 是Servlet的通用版本,是一种与协议无关的Servlet
javax.servlet.http.HttpServlet类
- 在GenericServlet基础上扩展的基于Http协议的Servlet
如何创建Servlet:
- 实现Servlet接口
- 继承GenericServlet类
- 继承HttpServlet类
第一个Servlet
Servlet中主要方法:
- init():Servlet的初始化方法,仅仅会执行一次
- service():处理请求和生成响应
- destroy():在服务器停止并且程序中的Servlet对象不再使用的时候调用,只执行一次
ServletRequest:
- 封装客户的请求信息
- 作用相当于JSP内置对象request:HttpServletRequest
ServletResponse:
- 创建响应信息,将处理结果返回给客户端
- 作用相当于JSP内置对象response
ServletConfig
- 包含了Servlet的初始化参数信息
Servlet生命周期
生命周期 | 谁来做 | 何时做 |
实例化 | Servlet 容器 | 当Servlet容器启动或者容器检测到客户端请求时 |
初始化 | Servlet 容器 | 实例化后,容器调用Servlet的init()初始化对象 |
处理请求 | Servlet 容器 | 得到客户端请求并做出处理时 |
销毁 | Servlet 容器 | 当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候 |
Servlet演示案例
1.实体类User
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
2.完成登录功能的Dao接口
public interface LoginDao {
User queryUserByNameAndPwd(String username,String password) throws Exception;
String queryPasswordByName(String username);
}
3.实现上面Dao接口的类
public class LoginDaoImpl extends UserDao implements LoginDao {
@Override
public User queryUserByNameAndPwd
(String username, String password) throws Exception {
User u = null;
ResultSet rs = null;
try {
getConn();
String sql = "select * from tb_user_info where username=?" +
" and password=?";
rs = query(sql, username, password);
if (rs.next()) {
u = new User();
Class<? extends User> uc=u.getClass();
Field[] fields=uc.getDeclaredFields();
// u.setId(rs.getInt("id"));
// u.setUsername(rs.getString("username"));
// u.setPassword(rs.getString("password"));
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
fields[i].set(u,rs.getObject(fields[i].getName()));
}
}
} finally {
rs.close();
close();
}
return u;
}
@Override
public String queryPasswordByName(String username) {
return null;
}
}
4.业务层的接口
public interface LoginService {
User login(String username,String password);
}
5.实现业务层接口的Service类
public class LoginServiceImpl implements LoginService {
@Override
public User login(String username, String password){
//1、参数判空
if (StringUtils.isNullOrEmpty(username)||
StringUtils.isNullOrEmpty(password)){
return null;
}
//2、是否符合规范
//3、有哪些特殊要求
//4、接受返回值,判断返回的值范围是否正确
LoginDao dao=new LoginDaoImpl();
User user= null;
try {
user = dao.queryUserByNameAndPwd(username,password);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
}
6.controller层的类
public class LoginController extends HttpServlet {
private LoginService loginService=new LoginServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");
User user=loginService.login(name,pwd);
HttpSession session = req.getSession();
if(user==null){
session.setAttribute("msg","输入不正确,登陆失败!");
resp.sendRedirect("/hello.jsp");
}else{
session.setAttribute("msg","登陆成功");
resp.sendRedirect("/hello.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
@Override
public void destroy() {
System.out.println("servlet即将销毁!");
super.destroy();
System.out.println(super.toString());
}
@Override
public void init() throws ServletException {
System.out.println("servlet开始初始化!");
super.init();
System.out.println(super.toString());
}
}
7.Web.xml的配置
<welcome-file-list>
<welcome-file>/regex.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>cn.kgc.jdbc.controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/doLogin</url-pattern>
</servlet-mapping>
8.regex.html登录页面设置
<body>
<form action="/doRegex">
<p> 用 户 名:<input type="text" name="username"></p>
<p>输入密码:<input type="password" name="pwd"></p>
<p>确认密码:<input type="password" name="cfmPwd"></p>
<p><input type="submit" value="注册"></p>
</p>
</form>
</body>
9.登录成功时的跳转页面hello.jsp
<body>
<h1>${msg}</h1>
<form action="/doLogin">
<p>用户名:<input type="text" name="username" value="${username}"></p>
<p>密 码:<input type="password" name="pwd" placeholder="请输入密码"></p>
<p><input type="submit"></p>
<p><input type="image" name="1" src="Mbappe.jpg" onclick="javascript:alert('姆巴佩')"></p>
</form>
</body>