servlet
* 1.Tomcat:应用服务器,提供接收请求并做转换,以及返回响应的机制
bin主体文件目录
* 部署项目的文件夹:webapps
* 配置的文件:conf->server.xml文件 修改连接的相关配置:端口号、编码等
* 2.servlet:接收请求,在service方法中判断请求方式从而应用doXXX方法进行处理
servlet就是一个java程序,不能直接被浏览器访问,因此需要转换为能被访问的文件格式比如html,因此严重依赖tomcat容器
* 配置:需要在web.xml文件中做注册和映射
注册<servlet>
servlet-name名称 servlet-class类所在的位置
映射<servlet-mapping>
servlet-name名称 url-pattren访问的地址 两个名称必须一致,要不然就404
jsp就是servlet,只不过是包装过后的servlet
* 3.request和reponse对象
* request的常用方法:getParameter() 接收单个参数
* getParameterValues() 接收多个参数值
* setCharacterEncoding("utf-8") 设置编码格式
* getRequestDispatcher().forward(request,response)转发请求
* response的常用方法:
* getWriter() 获取响应流对象,用于向页面输出内容
* setContentType("text/html;charset=utf-8") 设置浏览器的解码方式
* setCharacterEncoding("utf-8") 设置响应内容的编码方式
* sendRedirct() 重定向
* 4.转发和重定向的区别: 地址栏,请求,请求的参数
* 1.转发的url地址栏不会发生改变;重定向的url地址栏会发生改变
* 2.转发实际上是用上一次的请求做的;而重定向是要求浏览器重新发送一次新的请求
* 3.转发可以携带上一次请求的参数;而重定向无法携带上一次请求的参数
* 5.Jsp的九大内置对象:(必考)
* 1.request 请求,封装HTTP请求的信息
* 2.response 响应,封装HTTP响应的信息
* 3.session 会话,封装用户会话的信息
* 4.application 应用,封装Web应用程序的全局信息
* 5.page 页面,当前JSP页面的实例
* 6.pageContext 页面上下文,封装页面上下文的信息
* 7.config 配置,封装Servlet配置的信息
* 8.exception 异常,封装页面抛出的异常信息
* 9.out 输出,用于输出响应到客户端的输出流
* 6.jsp标记:
* 指令标记:page设置页面信息 include整合静态页面 taglib导入
* 动作指令:include整合页面 forward跳转页面
session代表会话:getAttribute获取值 setAttribute设置键值对 invalidate销毁
application代表应用:getAttribute获取值 setAttribute设置键值对
* 7.cookie和session的区别:
* 1.cookie是产生在服务器端,保存在客户端;session是产生在服务器端,保存在服务器端
* 2.cookie因为保存在客户端,因此不安全;session相对安全
* 3.cookie的键和值都是String类型;session的键是String类型,值是Object类型
* 4.cookie有保存时长;session在服务器上保存,会话结束session会在一定时间后销毁
* 8.四大域:(从小到大)
* 1.page域
* 2.request域
* 3.session域
* 4.application域
servlet中获取四大域方法:page无法获取,只能被servletconfig替代;request方法直接提供;request.getSession();this.getServletContext()
* 9.监听器以及过滤器:
* 过滤器的声明:需要实现javax.servlet.filter接口,重写doFilter方法
* 配置:在web.xml文件中做注册和映射
* <filter> <filter-mapping>
* 监听器的声明:实现相应的监听类型的接口(HttpSessionAttributeListener),重写其中的方法
* 配置:在web.xml文件中做注册
* <listener> 其中HttpSessionBindingListener是唯一一个不需要配置的监听器(必考)
* 10.EL表达式:可以输出域中存放的值,必须先把值存入域中保存,否则取不到
* 语法:${域.键}
* 关键字:empty 判断内容是否为空
*
* 11.JSTL标签库:(必考)
* 必须先引入相关的核心库 <%@ taglib perfix="c" uri="xxxx" %>
* <c:if>
* <c:choose>
* <c:when>
* <c:otherwise>
* <c:forEach>
* 12.生命周期:
* servlet生命周期:在第一次访问时调用init初始化,每次请求使用service服务,在服务器关闭时调用destory销毁
* filter生命周期:在服务器启动时初始化,每次请求过滤调用doFilter方法,在服务器关闭时调用destory销毁
* listener生命周期:在服务器启动时初始化,事件触发则调用相应的回调函数,在服务器关闭时销毁
13. 乱码解决:server.xml文件配置访问有关的东西,URIEncoding
//get乱码:因为url地址栏乱码,server.xml文件配置新增URIEncoding
//post乱码:setCharacterEncoding()设置请求编码,或者加编码过滤器
设置项目打包方式
- jar包:java项目归档文件(对外发行软件包)
- war包:javaweb项目归档文件(最终交付的产品)
servlet 的Maven依赖:
<!-- servletAPI,其中jakarta是现在javax的新版 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
</dependency>
- Http协议包括请求头(Get/Post等),响应头
- Servlet 创建的步骤:
-
- 创建普通java类继承HttpServelt
-
- 重写doXXX/service方法(实现具体的逻辑:接收请求参数,处理并作出响应)
-
- 配置请求映射路径(注册servlet)
Servlet 入门用法示例:
@WebServlet("/login") // 配置表单提交到的位置来本程序
public class LoginServlet extends HttpServlet { // 继承 HttpServlet
@Override // 这两个参数用来做请求和响应的
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收客户端(表单)发送的数据
String name = req.getParameter("username");
String pwd = req.getParameter("password");
System.out.println(name + "/" + pwd);
//准备响应消息
String msg = "";
try {
//访问数据库执行业务操作
QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
//准备SQL
String sql = "select * from user where username=?";
//执行查询
User user = qr.query(sql, new BeanHandler<>(User.class), name);
if (Objects.isNull(user)) {
//用户不存在
msg = "用户不存在";
} else {
//对用户输入的密码执行加密加盐
pwd = SecureUtil.md5(pwd + user.getSalt());
if (Objects.equals(pwd, user.getPassword())) {
//成功
msg = "登录成功";
} else {
//密码错误
msg = "密码错误";
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
//响应
resp.setContentType("text/html;charset=utf-8"); // 设置编码格式
PrintWriter pw = resp.getWriter();
pw.println("登录结果:" + msg);
pw.flush(); // 刷新并把缓存中的数据写出,和直接close的区别就是还可以继续写数据
//重定向:客户端跳转(地址栏变为最终地址,无法传递请求数据)
// resp.sendRedirect("/home.html");
//请求转发:服务端跳转(地址栏显示第一次请求地址,可以传递请求数据)
// req.getRequestDispatcher("/index.html").forward(req,resp);
}
}