二、编程题4个题,共60分
1.题目给出了数据库、表等信息,要求使用JDBC完成增删改查这些操作,可能需要事务
使用 JDBC 完成增删改查操作通常需要以下步骤:
加载数据库驱动。
建立数据库连接。
创建 Statement 或 PreparedStatement 对象。
执行 SQL 语句。
处理查询结果。
释放资源。
以下是一个使用 JDBC 实现增删改查操作的示例:
public class UserDao { private Connection conn; public UserDao(Connection conn) { this.conn = conn; } public void createUser(User user) throws SQLException { String sql = "INSERT INTO users(name, email, password) VALUES (?, ?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setString(2, user.getEmail()); stmt.setString(3, user.getPassword()); stmt.executeUpdate(); stmt.close(); } public void updateUser(User user) throws SQLException { String sql = "UPDATE users SET name=?, email=?, password=? WHERE id=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, user.getName()); stmt.setString(2, user.getEmail()); stmt.setString(3, user.getPassword()); stmt.setLong(4, user.getId()); stmt.executeUpdate(); stmt.close(); } public void deleteUser(long id) throws SQLException { String sql = "DELETE FROM users WHERE id=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setLong(1, id); stmt.executeUpdate(); stmt.close(); } public User getUserById(long id) throws SQLException { String sql = "SELECT id, name, email, password FROM users WHERE id=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setLong(1, id); ResultSet rs = stmt.executeQuery(); User user = null; if (rs.next()) { user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); user.setPassword(rs.getString("password")); } rs.close(); stmt.close(); return user; } }
上述代码中,我们定义了一个 UserDao 类,用于操作名为 users 的数据库表。其中的四个方法分别实现了创建用户、更新用户、删除用户和根据用户 ID 查询用户的功能。在这些方法中,我们使用了 PreparedStatement 对象来执行 SQL 语句,并通过设置占位符的方式传递参数。通过这种方式,可以有效避免 SQL 注入等安全问题。
如果需要使用事务,可以将上述方法放到一个事务中执行。以下是一个示例:
public void createUserWithTransaction(User user) throws SQLException { conn.setAutoCommit(false); try { createUser(user); conn.commit(); } catch (SQLException e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); } }
在这个方法中,我们通过将 autoCommit 属性设置为 false,来启用手动事务。在执行完所有操作后,我们可以选择提交或回滚事务。同时,为了保证代码的健壮性,需要在 finally 块中将 autoCommit 属性设置回 true。
2.编写Servlet接收请求参数,并保存到某个作用域
@WebServlet("/example") public class ExampleServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); String email = request.getParameter("email"); String password = request.getParameter("password"); // 将参数保存到 session 作用域 HttpSession session = request.getSession(); session.setAttribute("name", name); session.setAttribute("email", email); session.setAttribute("password", password); // 将参数保存到 request 作用域 request.setAttribute("name", name); request.setAttribute("email", email); request.setAttribute("password", password); // 将参数保存到 application 作用域 ServletContext context = getServletContext(); context.setAttribute("name", name); context.setAttribute("email", email); context.setAttribute("password", password); // 重定向到结果页面 response.sendRedirect(request.getContextPath() + "/result.jsp"); } }
在上述代码中,我们在 doPost 方法中,分别将参数保存到 session、request 或 application 作用域中。在 session 中保存参数的方式与之前的示例类似,使用 request.getSession() 方法获取 HttpSession 对象,并调用其 setAttribute 方法将参数保存到 session 作用域中。
在 request 作用域中保存参数的方式也很类似,只需要使用 request.setAttribute 方法将参数保存到 request 作用域中即可。
在 application 作用域中保存参数也非常简单,只需要使用 getServletContext() 方法获取 ServletContext 对象,并调用其 setAttribute 方法将参数保存到 application 作用域中即可。
需要注意的是,在将参数保存到不同作用域中时,需要使用不同的对象来调用 setAttribute 方法。除此之外,其他代码与之前的示例相同,最终通过 response.sendRedirect 方法重定向到结果页面。
3.JPA的编程题,题目给出数据库和表,让大家使用JPA完成实体类及使用EntityManager完成增删改查操作
假设有一个表名为 user,包含以下字段:
Field |
Type |
id |
INT |
name |
VARCHAR(100) |
age |
INT |
VARCHAR(100) |
|
password |
VARCHAR(100) |
接下来,我们需要使用 JPA 完成实体类及使用 EntityManager 完成增删改查操作。
首先,我们需要定义一个实体类 User,对应 user 表中的一条记录:
@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private Integer age; private String email; private String password; // getters and setters }
在上述代码中,我们使用 @Entity 注解表示这是一个实体类,使用 @Table 注解指定了实体对应的表名为 user。同时,我们在类中定义了实体对应的属性,并使用 @Id 和 @GeneratedValue 注解表示该属性为实体的唯一标识,并指定了该属性的生成策略为自增长。
接下来,我们可以使用 EntityManager 对实体进行增删改查操作。以下是一个示例:
public class UserDao { @PersistenceContext private EntityManager entityManager; // 添加用户 public void addUser(User user) { entityManager.persist(user); } // 根据 id 查询用户 public User getUserById(Integer id) { return entityManager.find(User.class, id); } // 更新用户信息 public void updateUser(User user) { entityManager.merge(user); } // 根据 id 删除用户 public void deleteUserById(Integer id) { User user = entityManager.find(User.class, id); entityManager.remove(user); } }
在上述代码中,我们使用 @PersistenceContext 注解将 EntityManager 注入到 UserDao 类中。接着,我们定义了几个方法,分别用于添加、查询、更新和删除用户。
在 addUser 方法中,我们使用 EntityManager 的 persist 方法将用户对象保存到数据库中。
在 getUserById 方法中,我们使用 EntityManager 的 find 方法根据用户的唯一标识 id 查询用户信息,并将查询结果返回。
在 updateUser 方法中,我们使用 EntityManager 的 merge 方法将修改后的用户对象保存到数据库中。
在 deleteUserById 方法中,我们使用 EntityManager 的 remove 方法将根据用户的唯一标识 id 查询到的用户对象从数据库中删除。
需要注意的是,为了使用 EntityManager,我们需要将 JPA 的实现框架(如 Hibernate)配置到项目中,并在 persistence.xml 配置文件中配置数据源等信息。
4.JSP+Servet+JavaBean开发模式完成系统功能
JSP + Servlet + JavaBean 开发模式是一种经典的 Web 开发模式,它的核心是将前端页面(JSP)与后端业务逻辑(JavaBean)分离开来,通过 Servlet 充当中间层,完成两者之间的交互和协作。
以下是一个简单的示例:
1.首先,创建一个JavaBean来表示系统中的一个实体。例如,我们创建一个名为User的JavaBean来表示系统中的用户:
public class User { private String username; private String password; // getter and setter methods }
2.接下来,创建一个Servlet来处理用户提交的数据。例如,我们创建一个名为LoginServlet的Servlet来处理用户登录请求:
@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = new User(); user.setUsername(username); user.setPassword(password); // 将User对象保存到Session作用域中 request.getSession().setAttribute("user", user); // 转发到登录成功页面 request.getRequestDispatcher("/success.jsp").forward(request, response); } }
在Servlet中,我们首先获取用户提交的用户名和密码,然后创建一个User对象,并将其保存到Session作用域中。最后,我们使用请求转发将用户重定向到登录成功页面。
3.在Servlet中,我们首先获取用户提交的用户名和密码,然后创建一个User对象,并将其保存到
Session作用域中。最后,我们使用请求转发将用户重定向到登录成功页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录成功</title> </head> <body> <h1>欢迎您,${user.username}!</h1> </body> </html>
在JSP页面中,我们使用EL表达式来显示用户登录成功后的信息,例如用户的用户名。
4.最后,我们可以在Web应用程序中部署和运行这个示例,访问/login路径,提交用户名和密码,然后会被重定向到success.jsp页面,页面中显示登录成功后的信息。
这就是使用JSP+Servlet+JavaBean开发模式完成系统功能的基本流程。开发人员可以根据具体的业务需求进行修改和扩展。