0 前言
servlet是指Java Servlet,它是一种用于生成动态网页的技术,它是运行在Web服务器或应用服务器上的Java类,可以接收和响应客户端的请求。servlet可以实现网页的逻辑和处理,例如验证用户、查询数据库、生成HTML等。
servlet是javaweb中的核心技术,它具有高效、可扩展、跨平台等特点。servlet遵循了一套标准的接口和规范,可以与各种Web服务器和应用服务器进行交互。servlet可以与jsp、JavaBean等组件进行协作,实现数据的传递和展示。
本文将介绍javaweb中servlet的介绍,包括了servlet的概念、特点、生命周期和示例,希望能够对读者有所帮助。
1 servlet实战
1.1 准备工作
①创建maven工程
②创建工程包entity,dao,service,servlet,util
③pom.xml引入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
④引入BaseDao工具类
package com.zlt.util;
import java.sql.*;
public class BaseDao {
//创建三大对象
protected static Connection conn;
protected static PreparedStatement ps;
protected static ResultSet rs;
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/db_servlet";
public static final String USERNAME = "root";
public static final String PASSWORD = "123456";
//创建连接数据库的方法
public static void getConnection(){
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
System.out.println("连接:"+conn);
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
}
}
//创建关闭数据库的方法
public static void closeCount(){
try {
if(rs!=null){
rs.close();
}if(ps!=null){
ps.close();
}if(conn!=null){
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//通用的增删改的方法
public int executeUpdate(String sql,Object[] params){
int flag = 0;
getConnection();
try {
ps = conn.prepareStatement(sql);
if(params!=null){
for(int i = 0;i< params.length;i++){
ps.setObject(i+1, params[i]);
}
}
flag = ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
closeCount();
}
return flag;
}
//通用的查询方法
public ResultSet executeQuery(String sql,Object[] params){
getConnection();
try {
ps = conn.prepareStatement(sql);
if(params!=null){
for(int i = 0;i< params.length;i++){
ps.setObject(i+1, params[i]);
}
}
rs = ps.executeQuery();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return rs;
}
}
1.2 正式代码
①创建数据库/表
CREATE TABLE `t_student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`nickname` varchar(255) DEFAULT NULL,
`height` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
②创建entity实体类,dao、service中的接口和实现类
③创建servlet文件,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>StudentServlet</servlet-name>
<servlet-class>com.zlt.servlet.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentServlet</servlet-name>
<url-pattern>/StudentServlet</url-pattern>
</servlet-mapping>
</web-app>
④编写servlet文件内容
package com.zlt.servlet;
import com.zlt.entity.Student;
import com.zlt.service.StudentService;
import com.zlt.service.impl.StudentServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.List;
public class StudentServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StudentService service = new StudentServiceImpl();
List<Student> list = service.findAll();
request.setAttribute("list",list);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
⑤创建jsp文件并编写
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="1px solid">
<tr>
<th>编号</th>
<th>姓名</th>
<th>昵称</th>
<th>身高</th>
</tr>
<c:forEach items="${list}" var="list">
<tr>
<td>${list.id}</td>
<td>${list.name}</td>
<td>${list.nickname}</td>
<td>${list.height}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
⑥运行并测试
启动tomcat,浏览器输入http://localhost:8080/pro_jsp_war_exploded/StudentServlet
2 实现增删改查
2.1 准备工作
同上
2.2 正式代码
①创建数据库/表
CREATE TABLE `t_house` (
`no` int NOT NULL AUTO_INCREMENT,
`housename` varchar(255) DEFAULT NULL,
`height` double DEFAULT NULL,
PRIMARY KEY (`no`)
) ENGINE=InnoDB AUTO_INCREMENT=54 DEFAULT CHARSET=utf8;
②创建entity实体类,dao、service中的接口和实现类
略
③创建servlet文件,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>HouseServlet</servlet-name>
<servlet-class>com.zlt.servlet.HouseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HouseServlet</servlet-name>
<url-pattern>/HouseServlet</url-pattern>
</servlet-mapping>
</web-app>
④编写servlet文件内容
package com.zlt.servlet;
import com.zlt.entity.House;
import com.zlt.service.HouseService;
import com.zlt.service.impl.HouseServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HouseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HouseService service = new HouseServiceImpl();
String action = request.getParameter("action");
switch (action){
case "list":
List<House> list = service.findALL();
request.setAttribute("list", list);
request.getRequestDispatcher("list.jsp").forward(request, response);
break;
case "toAdd":
request.getRequestDispatcher("add.jsp").forward(request, response);
break;
case "add": {
String housename = request.getParameter("housename");
String height = request.getParameter("height");
House house = new House(housename, Double.parseDouble(height));
Integer flag = service.addHouse(house);
if (flag > 0) {
request.getRequestDispatcher("HouseServlet?action=list").forward(request, response);
}
break;
}
case "toUpdate": {
String no = request.getParameter("no");
House house= service.findOne(Integer.parseInt(no));
request.setAttribute("house", house);
request.getRequestDispatcher("update.jsp").forward(request, response);
break;
}
case "update":{
String no = request.getParameter("no");
String housename = request.getParameter("housename");
String height = request.getParameter("height");
House house = new House(Integer.parseInt(no),housename, Double.parseDouble(height));
Integer flag = service.updateHouse(house);
if (flag > 0) {
request.getRequestDispatcher("HouseServlet?action=list").forward(request, response);
}
break;
}
case "delete":{
String no = request.getParameter("no");
Integer flag = service.delHouse(Integer.parseInt(no));
if (flag > 0) {
request.getRequestDispatcher("HouseServlet?action=list").forward(request, response);
}
break;
}
case "select":{
request.getRequestDispatcher("selectOne.jsp").forward(request, response);
break;
}
}
}
}
⑤创建jsp文件并编写
略
⑥运行并测试
启动tomcat,浏览器输入http://localhost:8080/pro_jsp2_war_exploded/HouseServlet?action=list
⑦拓展(中文乱码问题,通过添加过滤器)
package com.zlt.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class SetCharacterEncodingFilter implements Filter {
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
public String toUTF8(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "utf-8");
} catch (Exception ex) {
}
return null;
}
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest) super.getRequest();
}
public String getParameter(String name)
{
return
toUTF8(getHttpServletRequest().getParameter(name));
}
public String[] getParameterValues(String name)
{
String values[] =getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toUTF8(values[i]);
}
}
return values;
}
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse
response,FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest) request;
if (httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("utf-8");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws
ServletException {
}
}
配置web.xml
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>com.zlt.util.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文详细源码见servlet测试+实战代码