用一晚上的时间入门javaweb 您所在的位置:网站首页 servlet在web中的作用 用一晚上的时间入门javaweb

用一晚上的时间入门javaweb

2023-03-01 18:27| 来源: 网络整理| 查看: 265

实验六 学生选课系统 课程设计 核酸登记系统 JSP中response.setHeader中refresh用法

编程题 jdbc实验

1、创建数据库和表 使用MySQL 5创建一个数据库testDB后,再创建表user。 2、创建Eclipse Java项目。 3、配置项目构建路径添加JDBC驱动程序。 4、创建Java类CRUDTest类。 该类具有main()方法和使用PreparedStatement实现增加记录的方法add()、实现查询全部记录的方法listAll()、实现更新id=1的记录的方法update()、实现删除id=1的记录的方法delete()。 5、在main()方法中分别调用add()、listAll()、update()、delete()方法进行测试。 6、在MySQL 5中的数据库testDB下,创建存储过程getUserAndAgeById_2。 7、在Eclipse Java项目中创建CallableStatementTest类调用存储过程。 8、在Eclipse Java项目中创建TransactionTest类,使用JDBC事务管理实现用户转账功能。(注意,user表需要有float类型的字段money,并存在用于测试的2条用户记录)

数据库辅助类 public class DBConnection { private static final String driverName="com.mysql.jdbc.Driver"; private static final String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&characterEncoding=utf-8"; private static final String userName = "root"; private static final String password = "123456"; private DBConnection(){} static{ try{ Class.forName(driverName); }catch(ClassNotFoundException e){ e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection(url,userName,password); } // 用于PreparedStatement释放资源 public static void close(ResultSet rs,PreparedStatement ps,Connection conn){ try{ if(rs!=null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally { try{ if(ps!=null){ ps.close(); } }catch(SQLException e){ e.printStackTrace(); }finally { if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } } } // 用于存储过程释放资源 public static void close(ResultSet rs,CallableStatement cs,Connection conn){ try{ if(rs!=null){ rs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally { try{ if(cs!=null){ cs.close(); } }catch(SQLException e){ e.printStackTrace(); }finally { if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } } } } CRUD_test /* * 该类具有main()方法和使用PreparedStatement实现增加记录的方法add()、 实现查询全部记录的方法listAll()、实现更新id=1的记录的方法update()、 实现删除id=1的记录的方法delete()。 */ package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import jdbc.User; public class CRUDTest { public static int add(User user) throws ClassNotFoundException { Connection connection = null; PreparedStatement preparedStatement = null; String sql = "INSERT INTO user(name,password,sex,birthday) VALUES(?,?,?,?)"; try { connection = DBConnection.getConnection(); // 注意此处需要传sql preparedStatement = connection.prepareStatement(sql); // preparedStatement.setInt(1, student.getId()); preparedStatement.setString(1, user.getUserName()); preparedStatement.setString(2, user.getPassword()); preparedStatement.setString(3, user.getSex()); preparedStatement.setDate(4, new java.sql.Date(user.getBirthday().getTime())); // 执行SQL,得到添加成功的行数 int resultNum = preparedStatement.executeUpdate(); if (resultNum > 0) { System.out.println("新增记录成功!"); // resultNum++; System.out.println("新增记录"+resultNum+"条"); } return resultNum; } catch (SQLException e) { System.out.println("数据库访问异常"); throw new RuntimeException(e); } finally { try { if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } public static void delete(int id) throws ClassNotFoundException,SQLException{ Connection connection =null; PreparedStatement preparedStatement=null; ResultSet resultSet = null; connection = DBUtil.getConnection(); String sql="delete from user where id="+id; preparedStatement = connection.prepareStatement(sql); // 执行并得到受影响的行数 int result=preparedStatement.executeUpdate(); // 如果受影响的行数大于1则证明删除成功 if(result>0){ System.out.println("删除成功"); } } /* * 分页查询 */ public static void list(int start, int size) throws ClassNotFoundException { Connection connection = null; PreparedStatement preparedStatement = null; String sql = "SELECT user.id, user.name, user.password, user.sex,user.birthday FROM user user LIMIT ?,?"; try { connection = DBUtil.getConnection(); preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, start); preparedStatement.setInt(2, size); ResultSet result = preparedStatement.executeQuery(); while (result.next()) { User user = new User(result.getInt("id"), result.getString("name"),result.getString("password"), result.getString("sex"),result.getDate("birthday")); System.out.println(user); } } catch (SQLException e) { System.out.println("数据库访问异常"); throw new RuntimeException(e); } finally { try { if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } /* * 查询全部记录 */ public static void listAll() throws SQLException,ClassNotFoundException{ Connection connection = null; PreparedStatement preparedStatement = null; String sql = "SELECT * FROM user"; try{ connection = DBUtil.getConnection(); preparedStatement = connection.prepareStatement(sql); ResultSet result = preparedStatement.executeQuery(); while (result.next()) { User user = new User(result.getInt("id"), result.getString("name"),result.getString("password"), result.getString("sex"),result.getDate("birthday")); System.out.println(user); } }catch (SQLException e) { System.out.println("数据库访问异常"); throw new RuntimeException(e); } finally { try { if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } /* * 更新指定id的记录 * 输入参数:指定的id;该id对应的新的记录user对象 * */ public static void update(int id,User user)throws SQLException,ClassNotFoundException{ Connection conn=null; PreparedStatement ps=null; String sql="update user set name=?,password=?,sex=?,birthday=? where id=?"; try{ conn=JDBCUtil.getConnection(); /*java.lang.NullPointerException具体意思是空指针异常,最常见的问题就是没有初始化。 字符串等数据类型没有初始化 类实例(对象)有用具体的类初始化 没有判断是否为空*/ ps = conn.prepareStatement(sql);//要先执行这一句,否则会报java.lang.NullPointerException // 构件SQL,使用参数使用占位符代替;手动拼接SQL ps.setString(1, user.getUserName()); ps.setString(2, user.getPassword()); ps.setString(3, user.getSex()); ps.setDate(4, new java.sql.Date(user.getBirthday().getTime())); ps.setInt(5, id); // 执行SQL int result = ps.executeUpdate(); if(result>0){ System.out.println("更新成功"); } }catch (ClassNotFoundException e) { e.printStackTrace(); throw e; } catch (SQLException e) { e.printStackTrace(); throw e; }finally{ try { if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { System.out.println("释放资源发生异常"); } } } public static void main(String[] args) throws Exception{ // 测试add()方法 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("2020-11-02"); User user1=new User("wangwu123","2221","man",new java.sql.Date(date.getTime())); add(user1); // 测试delete()方法 // delete(1); // 测试update方法 User user2=new User("updateTest","1111","man",new java.sql.Date(date.getTime())); update(1,user2); // 查询指定条数的 list(1,5); // 查询全部user System.out.println("查询全部的user:"); listAll(); 增的SQL语句定义 // String sql="insert into user(name,password,sex,birthday) values(?,?,?,?)"; 3.创建PreparedStatement的对象 PS(需要SQL语句) // PreparedStatement ps=conn.prepareStatement(sql); 需要调用set.Xxx()方法设置参数 // ps.setString(1,"zhangsan"); // ps.setString(2, "123"); // ps.setString(3, "man"); // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // Date date = sdf.parse("2020-11-02"); // ps.setDate(4, new java.sql.Date(date.getTime())); 执行SQL语句时不带参数 // ps.executeUpdate(); 4.遍历结果集(此处不需要) 5.关闭资源对象 // ps.close(); // conn.close(); } } JDBC事务管理 /*使用JDBC事务管理实现用户转账功能。 (注意,user表需要有float类型的字段money,并存在用于测试的2条用户记录)*/ package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; import jdbc.DBConnection; public class TransactionTest { public static void main(String[] args) throws SQLException, ClassNotFoundException { // 1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接 String url="jdbc:mysql://127.0.0.1:3306/testdb"; String username="root"; String pas!sword="123456"; DriverManager.getConnection(url,username,password); Connection conn=DriverManager.getConnection(url,username,password); // 把id=1的100块钱转给id=2 change(1,100,2); } public static void add() throws SQLException{ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try{ conn=DBConnection.getConnection(); // 事务开始,默认自动提交事务 // 相当于使用了conn.setAutoCommit(true) String sql="insert into user"+"(id,name,password,sex,age,birthday)"+"values(?,?,?,?,?,?)"; ps=(PreparedStatement) conn.prepareStatement(sql); ps.setString(2, "zhangsan"); int lines=ps.executeUpdate(); // 每执行一条SQL语句事务自动提交 // 相当于使用了conn.commit(); }finally{ DBConnection.close(rs,ps,conn); } } /*手动提交事务。如下代码模拟银行转账业务实现手动提交事务 */ public static void change(int id1,float m1,int id2) throws SQLException{ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try{ conn=DBConnection.getConnection(); conn.setAutoCommit(false);//事务开始,设置手工提交事务 // id1的钱转出去 String sql="update user set money=money-?where id=?"; ps=(PreparedStatement) conn.prepareStatement(sql); ps.setFloat(1, m1); ps.setInt(2, id1); ps.executeUpdate(); // id2的钱转进来 String sql2="update user set money=money+?where id=?"; ps=(PreparedStatement) conn.prepareStatement(sql2); ps.setFloat(1, m1); ps.setInt(2, id2); ps.executeUpdate(); }catch(SQLException e){ // e.printStackTrace(); // 事务中某项操作不成功事务回滚 conn.rollback(); }finally{ DBConnection.close(rs,ps,conn); } System.out.println("转账成功"); } } JDBC存储过程 /*6、在MySQL 5中的数据库testDB下,创建存储过程getUserAndAgeById_2。 7、在Eclipse Java项目中创建CallableStatementTest类调用存储过程。*/ package jdbc; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; public class CallableStatementTest { public static void main(String[] args) throws ClassNotFoundException, SQLException { /* * JDBC调用存储过程的一般步骤*/ 1.定义调用存储过程的SQL语句 // String sql="{call(?,?,...)}"; 2.获取CallableStatement对象 // CallableStatement cs=conn.prepareCall(sql); 3.设置参数(可选) // cs.setInt(1,1); // cs.registerOutParameter(2,Types.VARCHAR); // cs.registerOutParameter(3, Types.INTEGER); 4.执行存储过程 // cs.execute(); 5.获取输出参数值 // String userName=cs.getString(2);//获取用户名 // int userAge=cs.getInt("userAge");//获取用户年龄 // System.out.println(userName+"-"+userAge); /* * 调用存储过程getUserNameAndAgeById_2() */ getUserNameAndAgeById_2(); } public static void getUserNameAndAgeById_2(){ Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try{ // 存储过程函数格式{call getUserNameAndAgeById_2(?,?,?)} conn=DBConnection.getConnection(); // ①定义调用存储过程的SQL语句 String sql="{call getUserNameAndAgeById_2(?,?,?)}"; // ②获取CallableStatement对象 cs=conn.prepareCall(sql); // ③设置参数(可选) cs.setInt(1, 1); cs.registerOutParameter(2,Types.VARCHAR); cs.registerOutParameter(3, Types.INTEGER); // ④执行存储过程 cs.execute(); // ⑤获取输出参数值(可选) String userName=cs.getString(2); int userAge=cs.getInt("userAge"); System.out.println("姓名:"+userName+"年龄"+userAge); }catch(SQLException e){ e.printStackTrace(); }finally { DBConnection.close(rs,cs,conn); } } } Servlet实验

路径访问问题:https://blog.csdn.net/qq_44809887/article/details/116057136

3、请写出使用注解配置HelloServlet类的完整代码。

package servlet;

@WebServlet( urlPatterns={“/hello/helloServlet”}, name=“helloServlet” ) public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(“text/html”); PrintWriter out=response.getWriter(); out.println(“

A Servlet”); out.print(“helloWorld111!”); out.println(“”); out.flush(); out.close(); } } 4、请写出用户注册页面register.html的关键代码和RegisterServlet的完整代码。

Register.html

//将Register映射到路径/register/Register //@WebServlet( // “/register/Register” // ) public class RegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置接收请求信息的编码格式 request.setCharacterEncoding(“UTF-8”); // 接收register.html的注册信息 String name=request.getParameter(“name”); String password=request.getParameter(“age”); String sage=request.getParameter(“age”); // 在控制台打印输出注册信息] System.out.println(“name=”+name+“;password=”+password+“;sage=”+sage); } }

5、请写出实验步骤4的RequestScopeServlet和ReceiveServlet的完整代码。

使用创建的第二个项目,创建RequestScopeServlet并使用注解配置RequestScopeServlet;在RequestScopeServlet中,创建User对象,将User对象保存到request作用域中;使用请求转发跳转到另一个Servlet ReceiveServlet,在ReceiveServlet中获取RequestScopeServlet中保存到Request作用域的User对象;部署Java Web项目到Tomcat,测试访问RequestScopeServlet。

RequestScopeServlet.java package servlet; @WebServlet(“/ScopeServlet”) public class RequestScopeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建user对象 User user =new User(); user.setUserName(“Mike”); user.setPassword(“123”); user.setAge(22); // 将User对象保存到request作用域中 request.setAttribute(“user”, user); User u=(User)request.getAttribute(“user”); // 请求转发。服务器端跳转,是post方法,地址栏显示原来的网址但是内容变了 request.getRequestDispatcher(“/ReceiveServlet”).forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } } ReceiveServlet.java package servlet; @WebServlet(“/RecevieServlet”) public class RecevieServlet extends HttpServlet { public void doGest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //设置接收请求信息的编码格式 /*

response.setCharacterEncoding(“UTF-8”); // 接收register.html的注册信息 User u=(User)request.getAttribute(“user”); // 在控制台打印输出注册信息 System.out.println(u.toString());*/

response.setContentType(“text/html;charset=utf-8”); // 获取PrintWriter对象用于输出信息 PrintWriter out = response.getWriter(); // 获取request请求对象中保存的数据 User u=(User)request.getAttribute(“user”); String name=u.getUserName(); if (u != null) { out.println( name); } } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } }

6、请写出实验步骤5的RequestScopeServlet和ReceiveServlet的完整代码。

修改4中的RequestScopeServlet,使用Servlet重定向跳转到另一个Servlet ReceiveServlet,在ReceiveServlet中尝试获取RequestScopeServlet中保存到Request作用域的User对象;部署Java Web项目到Tomcat,测试访问RequestScopeServlet。 RequestScopeServlet.java package servlet;

@WebServlet(“/ScopeServlet”) public class RequestScopeServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建user对象 User user =new User(); user.setUserName(“Mike”); user.setPassword(“123”); user.setAge(22); // 将User对象保存到request作用域中 request.setAttribute(“user”, user); User u=(User)request.getAttribute(“user”); // 请求转发。服务器端跳转,是post方法,地址栏显示原来的网址但是内容变了 request.getRequestDispatcher(“/ReceiveServlet”).forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } } ReceiveServlet.java package servlet;

@WebServlet(“/RecevieServlet”) public class RecevieServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置接收请求信息的编码格式 /*

response.setCharacterEncoding(“UTF-8”); // 接收register.html的注册信息 User u=(User)request.getAttribute(“user”); // 在控制台打印输出注册信息 System.out.println(u.toString());*/

response.setContentType(“text/html;charset=utf-8”); // 获取PrintWriter对象用于输出信息 PrintWriter out = response.getWriter(); // 获取request请求对象中保存的数据 User u=(User)request.getAttribute(“user”); String name=u.getUserName(); if (u != null) { out.println( name); } } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } } 7、请说明实验步骤4的运行结果和实验步骤5的运行结果,并说明实验步骤4与5的运行结果差异的原因。

8、请写出SessionScopeServlet和SessionReceiveServlet的完整代码。

编写SessionScopeServlet实现将创建的User对象保存到Session作用域、跳转到SessionReceiveServlet中并在SessionReceiveServlet中获取保存的User对象。 SessionScopeServlet.java

package servlet; @WebServlet("/SessionScopeServlet") public class SessionScopeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 将user对象存储到request对象中 User user =new User(); user.setUserName("Mike"); user.setPassword("123"); user.setAge(22); // 处理Session HttpSession session=request.getSession(); session.setAttribute("user", user); // 使用请求转发跳转到Servlet.ResultServlet RequestDispatcher dispatcher = request.getRequestDispatcher("/SessionReceiveServlet"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } }

SessionReceiveServlet.java

package servlet; @WebServlet("/SessionReceiveServlet") public class SessionReceiveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 获取PrintWriter对象用于输出信息 PrintWriter out = response.getWriter(); // 获取request请求对象中保存的数据 User user1=(User)request.getSession().getAttribute("user"); String name1=user1.getUserName(); out.println(name1); out.println(user1); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } } 9、请写出ApplicationScopeServlet和ApplicationReceiveServlet的完整代码。

编写ApplicationScopeServlet实现将创建的User对象保存到Application作用域、跳转到ApplicationReceiveServlet中并在ApplicationReceiveServlet中获取保存的User对象。 ApplicationScopeServlet.java

package servlet; @WebServlet("/ApplicationScopeServlet") public class ApplicationScopeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 将user对象存储到request对象中 User user =new User(); user.setUserName("Mike"); user.setPassword("123"); user.setAge(22); // 处理Application ServletContext application=this.getServletContext(); application.setAttribute("user", user); // 使用请求转发跳转到Servlet RequestDispatcher dispatcher = request.getRequestDispatcher("/ApplicationReceiveServlet"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } }

ApplicationReceiveServlet.java

package servlet; @WebServlet("/ApplicationReceiveServlet") public class ApplicationReceiveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 获取PrintWriter对象用于输出信息 PrintWriter out = response.getWriter(); // 获取request请求对象中保存的数据 ServletContext application=this.getServletContext(); User user1=(User)application.getAttribute("user"); String name1=user1.getUserName(); out.println(name1); out.println(user1); } public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); } } JSP实验 3、请写出jsp:forward的2个页面的关键代码。

第一个jsp:forward

jspForward_login

第二个jsp:forward

jspForward_message forwardTestFirst中的用户名为: forwardTestFirst中的的密码为: 4、请写出jsp:include的2个页面的关键代码。 第一个jsp:include test include The current date and time are 执行完了include后执行本行。 第二个jsp:include 5、请写出JavaBean User的完整代码。 package javaBean; import java.beans.Statement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class User { private int id; private String name; private String password; private int age; private String sex; public User(String name, String password, int age, String sex) { this.name = name; this.password = password; this.age = age; this.sex = sex; } public User(int id, String name, String password, int age, String sex) { super(); this.id = id; this.name = name; this.password = password; this.age = age; this.sex = sex; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // 带name,password,age的构造方法 public User(String name, String password, int age) { super(); this.name = name; this.password = password; this.age = age; } // 无参数的构造方法 public User() { super(); } // 全参数的构造方法 public User(int id, String name, String password, int age) { super(); this.id = id; this.name = name; this.password = password; this.age = age; } /* 输入:用户进行登陆所使用的账号和密码 处理:将上述两个字符串在表中进行查询,看是否可以得到记录 输出:如果得到记录,则登陆成功;如果返回0条记录,则登陆失败 */ @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + ", sex=" + sex + "]"; } public static User login(String username, String password) throws SQLException { // 实例化一个用户对象 User user = null; Connection conn = DBConnection.getConnection(); String sql = "select * from user where name = ? and password = ?"; try { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); // 执行查询获取结果集 ResultSet rs = ps.executeQuery(); // 判断结果集是否有效,如过有效,则对用户进行赋值 while (rs.next()) { user = new User(); // 对用户对象进行复制 user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setSex(rs.getString("sex")); user.setAge(rs.getInt("age")); } rs.close(); ps.close(); } catch (SQLException e) { e.printStackTrace(); } finally { DBConnection.closeConn(conn); } return user; } /* 返回注册成功的记录的id */ public int register(){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=DBConnection.getConnection(); String sql="insert into user(name,password,age,sex) values(?,?,?,?)"; // 获取自动生成的主键 ps=conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS); ps.setString(1, this.name); ps.setString(2, this.password); ps.setInt(3, this.age); ps.setString(4, this.sex); ps.executeUpdate(); rs=ps.getGeneratedKeys(); if(rs != null && rs.next()){ int id=rs.getInt(1);//获取id System.out.println("注册成功返回的id="+id); return id; }else{ id=-1; return id; } } catch (SQLException e) { // TODO: handle exception e.printStackTrace(); } return id;//注册成功返回其在表中对应产生的自增的id,注册失败返回-1 } /* 根据id获取User对象 * */ public User getUserById(int id){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; User user=null; try{ conn=DBConnection.getConnection(); String sql="Select * from user where id=?"; ps=conn.prepareStatement(sql); ps.setInt(1, id); // 执行SQL语句并返回RS对象 rs=ps.executeQuery(); // 将RS对象中的字段提取出来,依次保存到new的user对象中 if(rs.next()){ user=new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setAge(rs.getInt("age")); } }catch(SQLException e){ e.printStackTrace(); } return user; } // 获取所有的用户 public List listAll() { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; User user=null; ArrayList list = new ArrayList(); try{ conn=DBConnection.getConnection(); String sql="Select * from user"; ps=conn.prepareStatement(sql); // 执行SQL语句并返回RS对象 rs=ps.executeQuery(); // 将RS对象中的字段提取出来,依次保存到new的user对象中 while(rs.next()){ user=new User(); // user=(User)rs; user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setAge(rs.getInt("age")); user.setSex(rs.getString("sex")); list.add(user); } }catch(SQLException e){ e.printStackTrace(); } return list; } } 6、请写出LoginServlet的完整代码。 package servlet; /** * Servlet implementation class LoginServelt */ @WebServlet("/LoginServelt") public class LoginServelt extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // TODO Auto-generated method stub doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); String username = request.getParameter("name"); String password = request.getParameter("password"); // 根据密码查询用户 User user = null; try { user = User.login(username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 判断user是否为(即是否可以在表中根据用户输入name和password查询到user对象) if (user != null) { // 将用户的对象放到session中 request.getSession().setAttribute("user", user); // 转发到index.jsp页面 request.getRequestDispatcher("index.jsp").forward(request, response); } else { // 登录失败 // request.setAttribute("info", "用户名或密码错误!"); request.getRequestDispatcher("fail.jsp").forward(request, response); } } } 7、请写出login.jsp、index.jsp的关键代码。 登陆界面 用户登陆 用户名: 密码: 登陆:登陆 Index.jsp 登陆成功页面 使用动作元素访问JavaBean 显示用户登陆成功信息 用户名: 密码: 性别:

Login.jsp

8、请写出RegisterServlet的完整代码。 package servlet; /** * Servlet implementation class RegisterServlet */ @WebServlet("/RegisterServlet") public class RegisterServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); String username = request.getParameter("name"); String password = request.getParameter("password"); String sage=request.getParameter("age"); Integer integer=Integer.valueOf(sage); int age=integer.intValue(); String sex=request.getParameter("sex"); User user=new User(username,password,age,sex);//用于保存即将注册的用户 int id=user.register(); System.out.println("==="+id); if(id!=-1){ user=user.getUserById(id); // User userSuccess=new User(id,username,password,age,sex); // 将用户的对象放到session中 request.getSession().setAttribute("user", user); // 转发到index.jsp页面 request.getRequestDispatcher("registerSuccess.jsp").forward(request, response); }else{ request.getRequestDispatcher("registerFail.jsp").forward(request, response); } } } 9、请写出register.jsp和listAll.jsp的关键代码。 Register.jsp 注册页面 用户注册 用户名: 密码: 年龄: 性别: 注册 listAll.jsp 用户列表 用户列表 用户名年龄性别 0){ for(User u:all){ %> protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user =new User(); List all=user.listAll();//调用User JavaBean的业务方法来显示所有用户 request.setAttribute("all", all); request.getRequestDispatcher("/listUsers.jsp").forward(request, response);} }

11、请写出listUsers.jsp的关键代码。

Insert title here 用户名年龄性别 ${user.name } ${user.age } ${user.sex } 论述题

1、java web项目的环境搭建安装过程、配置过程:jdk的安装配置、tomcat的安装配置、eclipse的安装配置、数据库服务器mysql的安装配置,他们之间的集成过程 2、java 项目和java web项目的区别 (1)Java Web项目是基于Java EE类的;而Java项目是基于Java应用程序的。 (2)Java项目主要面向桌面程序的应用,主要是awt、swing这类的编码,不包括JSP等前台页面的代码,大部分是CS架构的工程和一些jar包。 JavaWeb项目是BS架构的系统,是网页的编码,像Jsp、Servlet、Struts这类的, JavaWeb项目部署到服务器上,任何用户都可以通过浏览器来访问。 (3)JavaWeb项目中的Java文件是tomcat服务器来触发的,脱离了web服务器就无法启动。而Java项目是由main()方法来开始的,直接依赖JVM就能被编译执行。 (4)Java Web项目需要服务器;而Java项目不需要服务器。 (5)在eclipse中Java Web项目可以转换为Java项目,进而可以转回到Java Web项目。 (6)Java项目多数应用请求响应通过按钮的事件驱动来发起(Web项目也有)。JavaWeb项目衍生了很多框架应用。多数请求响应应用超链接URL来发起(Java项目也有)。 3、jdbc的概念、jdbc涉及的接口和类有哪些,他们之间的关系是什么 P12-15 JDBC(Java DataBase Connectivity)就是Java数据库连接,是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。 4、使用jdbc访问数据库需要做的工作有哪些?如何加载 P17-20 ** 准备工作:**(1)创建数据库和表 (2)创建 Eclipse Java项目 (3)配置项目构建路径添加JDBC驱动程序 5、jdbc访问存储过程的语法 P31 6、jdbc执行事务的方法 P33-36 7、Servlet的执行过程,生命周期,servlet映射的地址和浏览器网址的对应关系 Servlet生命周期分为实例化、初始化、响应请求调用service()方法、消亡阶段调用destroy()方法。执行过程如下:

1)当浏览器发送一个请求地址,tomcat会接收这个请求 2)tomcat会读取项目中的web.xml中的配置 3)当请求地址符合servlet-mapping标签映射的地址,会进入这个servlet 4)servlet首先会实例化(构造),然后初始化执行init()方法,init()方法至始至终执行一次,servlet对象是单实例 5)根据请求的方式是get或post,在service()方法中调用doget()或dopost()方法,完成此次请求 6)当服务器停止,会调用destroy()方法,销毁实例 **

8、Servlet的配置方法 P47-48 两种方式:(1)使用XML配置servlet (2)使用注解配置servlet 9、java web的4个作用域都是什么,每个有什么特点 P53 页面作用域、请求作用域、会话作用域、应用作用域 (JSP中可以使用这4个作用域、servlet中能用的作用域是后三个) JavaWeb的四大作用域为:PageContext,ServletRequest,HttpSession,ServletContext; PageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。 ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。 HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate(),可以立即销毁session。 ServletContext域:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。 作用域从小到大为:PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用) 10、page指令、include指令的格式、内容是什么,这两种指令有什么区别 P62-P65 11、jsp UseBean动作的语法、含义、作用 P83 12、jsp:forward的用法和作用 P67-68 13、jsp是如何执行的? P60 14、jsp的客户端跳转和服务端跳转是什么语法?两种跳转方式有什么区别? 客户端跳转-又称外部跳转。客户端向服务端发送请求的信息请求当前的资源,服务端接收请求后返回给客户端一个访问其他地址的回应。客户端在根据这个地址去进行下一次的请求。进行了2次跳转。(重定向属于客户端跳转)。原先的request对象和reponse对象在新的请求里面不可用。 服务端跳转-又称内部跳转。当客户端向服务端方发送一个请求,请求当前资源的时候,这个资源会在服务器的内部跳转到另一个资源,再向客户端发送一个响应信息。只有一次跳转。服务端将请求由当前servlet分发给另外一个servlet(JSP本质也是sevlet)进行处理,原先的request对象和reponse对象继续可用。 15、response在设置header时,setHeader,refresh的作用和含义是什么 P70-71 setHeader:设置http头信息; refresh:设置头信息进行页面刷新; 实现刷新页面次数用法为response.setHeader(“refresh”,“刷新时间间隔”); 实现目的页面跳转用法为response.setHeader(“refresh”,“刷新时间间隔;目的页面地址”); refresh是使用get方式跳转,url中可以携带参数和数据,比如response.setHeader(“refresh”,“刷新时间间隔;目的页面地址?xx=”); 同时refresh会刷新当前request请求,使得request.getAttribute的内容为null,如需使用可用Session方法获取。 16、Cookie和Session的区别 P73 Cookie:客户的浏览器上 Session:服务器上 cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全 17、javaBean的规范 P81 四条 18、jsp+javabean+servlet模式,他们之间怎么调用、怎么传递数据(参数) mvc模式:JSP + Servlet + JavaBean三层架构 MVC模式(Model-View-Controller),是系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller); 可理解为:JSP充当视图,Servlet充当控制器,JavaBeans充当模型。 1.View层(JSP),前台交互,比如我们注册时的数据等等,serlvet就是与前台数据进行交互的 2.Contrller层(servlet):Model与View之间沟通的桥梁,这个层有业务处理,用户的注册登录就可以看做是User的业务,我们就需要将相关的处理代码写到这个层中。 3.Model层:实现系统的业务逻辑,即javaBean,常见的就是封装对象的属性、数据库连接操作等。 常规会写一个Dao层,是属于mvc里面Model层抽出来。目的就是更单纯的和数据库打交道,将servlet的数据和数据库进行交互。 19、什么是EL表达式?EL表达式的作用是什么?EL表达式的用法,如何获取值 P93 作用:1.获取数据; 2.执行运算; 3.获取web开发常用对象; 4.调用Java方法 用法:EL基础语法;EL从JavaBean中读取数据;EL从数组中读取数据;EL从List中读取数据;EL从Map中读取数据 20、javaweb项目的文件夹、文件位置和浏览器网址的对应关系 21、jsp中要使用jstl的内容如何引入? P103-104 (1)jar包的获取; (2)jar包的导入; (3)在JSP页面头部使用引入标签库 22、等的用法 P105-113 P143-146 23、 配置过滤器的方法,多个过滤器如何执行?执行的代码顺序P146 ** ** 两种:(1)使用XML配置;(2)使用注解配置; 过滤器的顺序由 web.xml 文件中 的顺序决定,从上到下; 24、配置监听器的方法,监听器的编写方法 P147-151 两种:(1)使用XML配置;(2)使用注解配置; 25、JPA的实体类的定义方法(每种属性的定义方法、一对一、一对多的定义方法)、在配置文件中的配置方法(配置持久化单元P181)、增删改查的方法 P174、P188 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系。 在每个关系中,双方中的一方在其表中拥有连接列。那么一方称为所有方(owning side) 或者关系的所有者。不具有连接列的一方称之为非所有方(non-owning)或者反方 多对一映射总是在关系的所有方之上,所以如果在拥有多对一方的关系中发现一个@JoinColumn,那么这将是所有方的位置。 注解@JoinColumn,需要指定连接列的名称,可以使用name元素。 (1)@OneToMany 在一的一方定义一对多的关联关系,并且如果关联关系时双向的,mappedBy属性必须用来标注,在拥有关联关系的实体一方中表示关系的字段名,也就是使用mappedBy属性是不维护关联关系的一方,值是拥有关联关系一方中标识关系的字段名。使用了mappedBy属性后,不能在使用@JoinColumn注解,会抛异常。 @ManyToOne 没有mappedBy属性。 @OneToOne /@ManyToMany 都是在实体的字段上表示对应的关联关系,在表示双向关联关系时候,都必须使用mappedBy属性



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有