1.<jsp:forward page=""/>和response.sendRedirect("")的区别:
本质区别:第一个为服务器跳转 第二个为客户端跳转:
2.jsp的内置对象中哪些能用于保存对象值?它们的生命周期分别为?,作用域为什么?
区别:生命周期与作用域
生命周期:对象存在时间段
作用域:对象的可见性范围
request
生命周期:仅在当前请求中有效,一旦请求结束,request都西昂就会被销毁
作用域:请求作用域,即只在当前请求中有效,不能跨请求共享。
session
生命周期:与用户会话相关。会话开始可以是用户登录,会话结束可以是用户登出,会话超时或浏览器关闭等。在会话期间,session对象一直存在,并且可以在多个请求中共享数据。一般使用页面传值时常用。
作用域:会话期间有效。
Application
生命周期:与web应用的启动和关闭相关联。(也可以写成与Tomcat服务器的启动和关闭相关联)
作用域:应用程序作用域。
3.PreparedStatement和Statement两个类的对象的区别是什么?
①PreparedStatement对象传递SQL语句进行预编译后,使得该语句可以重复执行而不需要重新解析和编译,提高编译效率。而Statement对象遇到新的Sql语句后需要重新分析和编译,编译效率低。
②PreparedStatement可避免SQL注入问题。由于用户输入的数据往往是不可预知和无法控制的,直接使用Statement对象执行动态生成的SqL语句,则容易受到SQL注入攻击。而使用PreparedStatement对象时,SQL语句和参数是分开处理的,参数的类型和值都是程序员指定的,这样可以避免SQL注入问题,提高应用程序的安全性。
4.MVC设计思想
5.jsp+数据库
1.假设数据库为db_news2021,表名为user,输出全部用写为index.jsp;
2.在表中设置一个删除操作:设为delete.jsp。(写出关键代码)
index.jsp的关键代码(数据库的查询+表格)
<%
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
// 1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.数据库的连接(端口号:在端口号没被占用的时候数据库一般是3306。可以通过命令行指令查看。Tomcat端口好一般是8080,可在Tomcat编辑配置中查看)
String url = "jdbc:mysql://localhost:3306/db_news2021";
String user = "root";
String password = "123456";
conn = DriverManager.getConnection(url,user,password);
// 3.获取PreparedStatement的对象
String sql = "select * from user";
ps = conn.prepareStatement(sql);
// 4.填充占位符(省略) 占位符为sql语句中的?,但是查询全部信息不需要占位符。
// 5.执行 查询使用----executeQuery() 返回值为ResultSet
// 增删改一般使用 -------------executeUpdate() 返回值为int
// 特殊的sql语句使用-----------execute() 返回值为boolean
rs = ps.executeQuery();
%>
<table border="1">
<tr>
<td>用户名</td>
<td>密码</td>
<td>邮件</td>
<td>操作</td>
</tr>
<%
while(rs.next()){
%>
<tr>
<%--在rs获取列值的方法 1.getString("列名");
2.getObject(int x) x从1开始,例如 getObject(2)代表第二列的值
--%>
<td><%=rs.getString("username")%></td>
<td><%=rs.getObject(2)%></td>
<td><%=rs.getString("email")%></td>
<td><a href="delete.jsp?username=<%=rs.getString("username")%>">删除</a></td>
</tr>
<%}%>
</table>
delete.jsp的关键代码(数据库的删除+forward跳zhuyi
<% //设置请求格式,防止出现乱码 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; // 1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.数据库的连接 String url = "jdbc:mysql://localhost:3306/db_news2021"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url,user,password); String sql = "delete from user where username = ?"; ps = conn.prepareStatement(sql); ps.setObject(1,username); ps.executeUpdate(); %> <jsp:forward page="index.jsp"/>
注意:1.delete.jsp之后的跳转,
2.<%=rs.getString("username")%>里面不需要加;
6.jsp+javaBean(不包含数据库操作)
题目:对username= 张飞,password="123456"进行判断,正确的话,跳转到success.jsp中,否则跳转到fail.jsp中。
要求:
1.login.jsp登录操作
2.user用户类
3.success.jsp登录成功界面
4.fail.jsp登录失败页面
5.check.jsp登录检测页面
login.jsp的代码如下:
<%-- Created by IntelliJ IDEA. User: Lenovo、 Date: 2023/6/22 Time: 16:19 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录页面</title> </head> <body> <form action="check.jsp" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type ="password" name="password"><br> <input type="submit" value="提交"> </form> </body> </html>
check.jsp的代码如下:
<%@ page import="entil.user" %><%-- Created by IntelliJ IDEA. User: Lenovo、 Date: 2023/6/22 Time: 16:23 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录检测页面</title> </head> <body> <% // 设置请求编码格式 request.setCharacterEncoding("utf-8"); // 获取参数 (表单的参数是以name=value的形式传过来的,例如 http://localhost:8080/Test_war/6%E9%A2%98/check.jsp?username=二等兵&password=123) String username = request.getParameter("username"); String password = request.getParameter("password"); //将属性按题目要求封装成对象 user u = new user(username,password); // 判断 if(u.getUsername().equals("张飞")&&u.getPassword().equals("123456")){ //通过session保存值,将username传给success.jsp页面 session.setAttribute("username",username); %> <jsp:forward page="success.jsp"/> <% } else{%> <jsp:forward page="fail.jsp"/> <%}%> </body> </html>
success.jsp代码如下:
<% request.setCharacterEncoding("utf-8"); // String username = session.getAttribute("username").toString(); String username = session.getAttribute("username")+""; String username =(String)session.getAttribute("username"); %> 欢迎您,<%=username%>登录成功
注意:getAttribute()的返回值时是Object类型,可通过连接空字符串字符串,toString()方法,强制转化转化为String类型。
fail.jsp代码如下:
登陆失败,请重新<a href="login.jsp">登录</a>
7.jsp+servlet
题目:将login2.jsp中用户名,密码通过Inputservlet处理,在success2.jsp中打印出来。
步骤和上述jsp+javaBean差不多,只写出InputServlet类。
login2.jsp代码如下:
<form action="/Test_war/InputServlet" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type ="password" name="password"><br> <input type="submit" value="提交"> </form>
Inputservlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置请求类型 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); user u = new user(username,password); request.getSession().setAttribute("user",u); request.getRequestDispatcher("/7ti/success2.jsp").forward(request,response); }
success.jsp代码如下:
<% request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
%>
欢迎您,<%=username%>登录成功
注意:在跳转中,可以通过地址栏输入来判断页面的位置,方便url的填写。
8.<jsp:include page=""/>---------------动态包含 被包含页面进行编译再输出
<%@ include file="path"%>-------------静态包含 被包含页面不进行编译,直接输出
9.,<%%>和<%!%>的区别:
原来以为<%%>的变量是局部变量,<%!%>里的变量是全局变量。现阶段的理解是:<%%>里的变量和方法从创建开始到页面被关闭。<%!%>里的变量和方法是从创建开始到服务器关闭。