总考纲
选择题50分
包括:
1.框架部分 4分 Spring & SpringMVC
2.JSP+Servlet部分 46分
填空题10分
看笔记
简答题20分
包括:
1.简述软件开发的三层架构
2.简述servlet生命周期
3.简述servlet的运行过程
4.简述cookie和session的区别
5.简述JSP的四大作用域
6.http响应常用的状态码有哪些?分别是什么含义?
7.简述JSP的九大内置对象
8.请描述method=“get”和“post”有什么区别?
编程题20分
包括:
1.手写JDBC操作 编写JDBC连接数据库查询所有学生信息的步骤
2.手写利用servlet+jsp实现登录(用户名 用户密码)功能
选择题和填空题
查看老师的笔记
简答题
1. 简述软件开发的三层架构
顾名思义,三层架构分为三层,分别是“数据访问层”、“业务逻辑层”、“表示层”。
数据访问层:数据访问层在作业过程中访问数据系统中的文件,实现对数据库中数据的读取保存操作。
表示层:主要功能是显示数据和接受传输用户的数据,可以在为网站的系统运行提供交互式操作界面,
表示层的应用方式比较常见,例如Windows窗体和Web页面。
业务逻辑层:将用户的输入信息进行甄别处理,分别保存。
建立新的数据存储方式,在存储过程中对数据进行读取,将“商业逻辑”描述代码进行包含。
三层架构软件系统为用户的数据传输、提取、储存创造了便利条件。
在应用数据时,信息划分架构开发项目,
对各层次之间的工作职责进行清晰规划,这样就降低了网站系统的维护风险。
2. 简述servlet生命周期
1. 创建servlet实例
由服务器创建 不需要程序员手动创建
2. 初始化init
默认在第一次访问servlet的时候执行 并且只执行一次
3. service 核心业务逻辑
调用业务逻辑
4.服务器关闭执行destory方法
3. 简述servlet的运行过程
1.首先浏览器发送请求到达服务器
2.到达服务器后会将请求中的数据打包
3.封装成一个对象,HttpServletRequest接口的实现类的对象
4.同时创建一个响应对象,HttpServletResponse接口实现类的对象
5.服务器根据请求路径查看web.xml找到对应的Servlet
6.并调用其中的service(doGet/doPost)方法
7.调用时将创建的请求对象与响应对象交给service方法
8.service方法中根据请求中的数据处理核心业务逻辑
9.并提供响应的视图 比如html
10.服务器根据响应对象生成的响应结果发送给客户端
11.客户端根据响应结果将内容展示在页面中
4. 简述cookie和session的区别
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。
当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,
很多浏览器都限制一个站点最多保存20个cookie。
cookie 和session 的联系: session是通过cookie来工作的,可以考虑将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie中。
在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,
当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。
因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。
cookie | session |
---|---|
保存在客户端中 | 保存在服务器中 |
只能保存字符串 | 可以保存任意类型数据 |
保存的数据大小和浏览器有关 一般在4k左右 | 保存的数据大小理论上没有限制 只要服务器内存够用就行 |
相对安全性较低 | 安全性较高 |
分担了服务器的压力 | 增加了服务器压力 |
Cookie
将信息保存在客户端(浏览器)
是客户端保存用户状态的一种技术
当客户端访问服务器时
服务器处理请求之后
会将少量的数据发送给客户端
客户端会将这些数据通过cookie保存到计算机的硬盘上。
当客户端再次访问服务器时
会将这些数据发送给服务器
这样我们就实现了客户端和服务器的多次交互
使得这些数据实现来回传递。
Session
在服务器端维护用户状态的一种技术
当浏览器访问服务器时 服务器会自动创建一个session对象(HttpSession)
该对象有一个唯一的标识号 jsessionid
并且服务器在默认情况下 会使用cookie技术 将jsessionid发送给浏览器并保存
当浏览器下次访问时 会将jsessionid发送给服务器
服务器通过jsessionid找到对应的session对象
通过这种方法 可以实现维护用户信息的目的
5. 简述JSP的四大作用域
作用域 | 范围 |
---|---|
pageContext | 当前界面 |
request | 同一个请求 |
session | 同一个会话 |
application | 整个应用 |
6. http响应常用的状态码有哪些?分别是什么含义?
常用状态码:
状态码 | 代表状态 |
---|---|
200 | 成功 |
302 | 重定向的状态码 |
404 | 资源不存在 访问命令寻找不到 |
405 | 请求方式不正确 |
500 | 服务器内部异常 代码出现异常 |
状态码<400 | 成功 |
状态码>=400 | 失败 |
7. 简述JSP的九大内置对象
由jsp规范提供 不需要自己创建的
1.page
当前jsp页面本身 相当于this
2.pageContext
当前页面的上下文
可以用来获取其他内置对象
使用pageContext可以访问page request session application范围内的数据
3.request
请求对象 向客户端请求数据
4.response
响应对象
5.out
输出流对象 向客户端输出数据
6.session
会话 用来保存用户的信息
7.config
serlvetConfig类型的
用来配置servlet初始化参数
8.application
整个应用 整个工程
服务启动时 会为每个已经部署的项目 创建一个唯一对象
该对象实现 了ServletContext接口 由服务器实现
该对象一直存在。
通过该对象 可以获取与整个应用有关的一些方法。
作用:绑定数据 可以访问全局初始化参数
9.exception
异常对象
只能出现在 isErrorPage=true的页面中
8. 请描述method=“get”和“post”有什么区别?
第一方面:安全性
get把数据追加在url上,明文显示,不安全,而post不是明文显示,相对安全。
第二方面:数据允许大小
get允许传递的数据只有2kb,而post则不限,
get只能向服务器发送ASCII字符,而post则可以发送整个ISO10646中的字符
第三方面:数据流
get只能传递字符型数据,不能传递二进制流数据,而post既可传递字符流也可传递二进制流。
第四方面:get和post对应的enctype属性有区别
enctype有两个值,默认值为application/x-www-form-urlencoded
而另一个值multipart/form-data只能用于post。
第五方面:由于一个get得到的结果直接对应到一个URI
所以get的结果页面有可能被浏览器缓存。而post一般则不能。
编程题
第一题 编写JDBC连接数据库查询所有用户信息
JDBC的书写操作 书写工具类 JDBCUtil.java
package cn.icanci.utils;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
/**
* @author icanci
* @version 1.10
* @classAction JDBC的操作
*/
public class JDBCUtil {
private static Connection conn;
private static String url;
private static String username;
private static String password;
static {
url = "jdbc:mysql://localhost:3306/icanci";
username = "root";
password = "ok";
}
@SuppressWarnings("unused")
private static void init() throws ClassNotFoundException, SQLException {
// 加链语执释
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//链接数据库
conn = DriverManager.getConnection(url, username, password);
}
public static Connection getConnection() throws ClassNotFoundException, SQLException {
init();
return conn;
}
public static void closeConn() throws SQLException {
//关闭数据库连接
conn.close();
}
}
测试类 JDBC_CRUD.java 测试
package cn.icanci.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.jupiter.api.Test;
import cn.icanci.utils.JDBCUtil;
/**
* @author icanci
* @version 1.10
* @classAction
*/
class JDBCUtilTest {
//测试链接
@Test
void testGetConn() throws SQLException, ClassNotFoundException {
Connection conn = JDBCUtil.getConnection();
System.out.println(conn);
JDBCUtil.closeConn();
}
//测试查询所有
@Test
void testFindAdd() throws ClassNotFoundException, SQLException {
PreparedStatement ps = null;
ResultSet rs = null;
// 获取连接
Connection conn = JDBCUtil.getConnection();
// 编写sql语句
String sql = "select * from t_user";
// 执行sql语句
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt(1);
String username = rs.getString(2);
String password = rs.getString(3);
String phone = rs.getString(4);
String address = rs.getString(5);
System.out.println(id + " " + username + " " + password + " " + phone + " " + address);
}
rs.close();
ps.close();
conn.close();
}
//测试添加
@Test
void testInsert() throws ClassNotFoundException, SQLException {
PreparedStatement ps = null;
//加载驱动
//获取链接
Connection conn = JDBCUtil.getConnection();
//编写sql语句
String sql = "insert into t_user (username,password,phone,address) values (?,?,?,?)";
//执行预编译语句
ps = conn.prepareStatement(sql);
//加载参数进去
ps.setString(1,"haxi");
ps.setString(2,"haxi");
ps.setString(3,"110");
ps.setString(4,"UU");
ps.executeUpdate();
conn.close();
ps.close();
}
//测试删除
@Test
void testDelete() throws ClassNotFoundException, SQLException {
PreparedStatement ps = null;
//加载驱动
//获取链接
Connection conn = JDBCUtil.getConnection();
//编写sql语句
String sql = "delete from t_user where id = ?";
//执行语句
ps = conn.prepareStatement(sql);
ps.setInt(1, 2);
//执行
ps.executeUpdate();
ps.close();
conn.close();
}
//测试更新
@Test
void testUpdate() throws ClassNotFoundException, SQLException {
PreparedStatement ps = null;
//加载驱动
//获取链接
Connection conn = JDBCUtil.getConnection();
//书写sql语句
String sql = "update t_user set username = ? where id = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, "瞎咋");
ps.setInt(2, 5);
ps.executeUpdate();
ps.close();
conn.close();
}
}
测试结果
1 icanci 98886f12e715dc58f36c15ac932f772c 15252067235 江苏徐州
2 dao dao 17372588461 江苏南京
3 dao dao 17372588461 江苏南京
4 ic f05a225e14ff5e194a8eef0c6990cefb 15252067235 USA
此处合并JDBC,但是不推荐
package cn.icanci.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author 178111545333
* @version 1.10
* @classAction
*/
public class JDBC_GO {
private static Connection conn;
private static String url;
private static String username;
private static String password;
static {
url = "jdbc:mysql://localhost:3306/shop";
username = "root";
password = "ok";
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
PreparedStatement ps = null;
ResultSet rs = null;
// 加链语芝士
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 链接数据库
conn = DriverManager.getConnection(url, username, password);
// 编写sql语句
String sql = "select * from t_user";
// 执行sql语句
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt(1);
String username = rs.getString(2);
String password = rs.getString(3);
String phone = rs.getString(4);
String address = rs.getString(5);
System.out.println(id + " " + username + " " + password + " " + phone + " " + address);
}
rs.close();
ps.close();
conn.close();
}
}
测试结果
1 icanci 98886f12e715dc58f36c15ac932f772c 15252067235 江苏徐州
2 dao dao 17372588461 江苏南京
3 dao dao 17372588461 江苏南京
4 ic f05a225e14ff5e194a8eef0c6990cefb 15252067235 USA
第二题 利用servlet+jsp实现登录(用户名 用户密码)功能
jsp界面 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
登陆之后的成功界面 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
Insert title here
登陆成功
Servlet控制业务逻辑
package cn.icanci.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author icanci
* @version 1.10
* @classAction user的登陆验证
*/
@WebServlet("/user/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码 必须放在第一行
req.setCharacterEncoding("UTF-8");
//接收请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//处理逻辑
if (!("icanci".equals(username) && "icanci".equals(password))) {
// 登陆失败
//控制页面跳转
// 跳转到 index.jsp
resp.sendRedirect("/index.jsp");
return;
}
//控制页面跳转 跳转到成功界面 success.jsp
resp.sendRedirect("/success.jsp");
return ;
}
}
此处 @我自己