1.JSP
1.1 JSP的概述
1.1.1 什么是JSP
JSP:Java Server Pages(Java服务器端页面),其实就是在HTML中嵌入Java代码
1.1.2 为什么学习JSP
SUN公司提供了动态网页开发技术:Servlet。Servlet本身有一些缺点,SUN公司发现了这些问题,推出了一个新的动态网页开发技术JSP。
Serlvet的缺点:
- Servlet需要配置,不方便维护
- Servlet很难向页面中输出HTML页面内容
1.1.3 JSP的运行原理分析
JSP文件翻译成Java文件(Servlet文件),将这个Java文件编译生成class文件,运行class文件。
1.2 JSP的脚本元素
1.2.1 JSP的脚本元素概述
JSP = HTML + Java代码 + JSP自身
JSP的脚本元素就是再JSP中嵌入Java代码
1.2.2 JSP的脚本元素的分类
1.2.2.1 声明标签
- 语法:
<%! 变量或方法声明 %>
写在这个脚本中的代码,翻译成Servlet内部的成员变量或成员方法。 - 用法:
1.2.2.2 表达式标签
- 语法:
<%= 表达式 %>
写在这个脚本中的代码,翻译成方法内部的out.print();当中的内容。 - 用法
1.2.2.3 程序代码标签
- 语法:
<% 程序代码 %>
写在这个脚本中的代码,翻译成方法内部的局部变量或方法内部的代码片段。
经常使用 - 用法:
之所以这种经常使用而声明变量很少使用是因为Servlet线程很不安全的,所以定义了全局变量容易导致线程不安全。
1.3 JSP的开发模式之MVC模式
1.3.1 JSP开发模式
1.3.1.1 动态网页开发模式的发展
1.4 开发中的路径问题
1.4.1 路径问题概述
提供一些页面,在页面中会提供连接或者表单,当点击链接或者表单的时候需要进行提交,提交的Serlvert中。从页面向Servlet发送请求的地址(路径)应该如何编写。
1.4.2 路径的分类
相对路径
- 相对路径的写法:
相对路径不是以 / 开头的。
直接写ServletDemo1
或者是./ServletDemo1
意思是在但当前目录下进行查找访问
在上一级目录下进行查找访问
绝对路径(通常使用)
- 绝对路径的写法:
通常以 / 开始的路径
使用绝对路径,不需要关心当前文件和要请求的文件的相对位置的关系!!
- 注意:
① 绝对路径分成服务器端路径和客户端路径
② 客户端路径 需要带工程名
③ 服务器端路径 不需要带工程名
1.5 案例
1.5.1 案例需求
提供登陆页面,用于用户登录(用户名和密码需要查询数据库)。如果登陆失败,需要回到登录页面(给出提示信息)。如果登陆成功,页面进行跳转,在成功页面上显示登录成功的总人数。
1.5.2 Request作为域对象存取数据
1.5.2.1Request作为域对象的作用范围
Request对象其实就是从客户端浏览器向服务器发送的一次请求信息的封装。那么实质上向Request中所保存的数据有效期也是一次请求范围。
一次请求范围:从客户端浏览器向服务器发送一次请求,服务器针对这次请求对浏览器做出响应。当服务器做出相应之后,请求对象就销毁了,保存在其中的数据就无效了。
1.5.3 页面跳转
请求转发 和 重定向 都可以完成页面的跳转
1.5.3.1 请求转发
写法:
通过ServletRequest对象获得RequestDispatcher对象。
再根据RequestDispatcher中的forward方法进行请求转发。
代码实现:
路径方面有些特殊,需要格外注意
1.5.3.2 重定向
通过HttpServletResponse对象中的以下方法
写法:
代码实现:
1.5.3.3 请求转发和重定向区别
原理
区别总结
- 请求转发是一次请求一次响应,而重定向是两次请求两次响应。
- 请求转发地址栏不会变化,重定向地址栏发生变化
- 请求转发路径不带工程名,重定向需要带工程名路径。
- 请求转发只能在本网站内部,重定向可以定向到任何网站。
由于Request域只作用于一次请求范围,所以若使用Request储存数据,就只能使用请求转发。
1.5.3.4 代码演示请求转发和重定向区别
- 注意:
如果需要使用request进行值传递,需要通过请求转发完成。如果页面需要调整到其他网站上必须使用重定向。
1.5.4 案例准备-MVC的准备
1.5.5 案例准备-创建数据库
1.5.6 案例准备-项目环境搭建
1.5.7 案例准备-引入相关资源
1.5.7.1 引入相关jar包
- MySQL数据库驱动包
- C3P0连接池所需jar包
- DBUtils开发的jar包
1.5.7.2 引入C3P0连接池配置文件
放到src下即可自动加载
1.5.7.3 引入JDBC开发的工具类
由于使用的是JDBC,其中自带释放资源方法,所以可以将release方法删除。
1.5.8 案例代码-登陆界面实现
1.5.9 案例代码-登陆代码实现
登录代码实现流程
登陆页面(login.jsp) → 登录的Servlet(LoginServlet),在这个Servlet中需要接收数据,将这个数据封装到一个JavaBean中,调用另一个JavaBean处理数据。根据处理结果进行页面跳转。
登录代码实现
- 第一步:在controller包下创建LoginServlet
- 第二步:在domain下创建一个User类,用于封装数据
- 第三步:在model包下创建一个UserModel类,用于处理数据
- 第四步:根据处理结果进行页面跳转
此处注意:
我们所使用的jar包一定要放在WEB-INF下的lib里然后再导包,不然会出现500错误org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
1.5.10 案例代码-错误信息回显
1.5.11 案例代码-记录登陆成功人数分析
在服务器初始化的时候,初始一个总人数为0。将这个值保存到一个作用范围尽量大的域对象中。(ServletContext域中)
在登录成功之后,从域中将这个值获取到,进行+1的操作。将这个值存回到ServletContext域中。
在成功页面上从SerlvetContext域中获取值并且显示到页面上。
服务器初始化的时候: Servlet生命周期中有一个init方法,在Servlet被创建的时候执行(第一次访问)。但是可以配置启动时加载。这个init可以在登录的Servlet中写,也可以创建一个InitServlet来专门进行初始化。
1.5.12案例代码-记录登陆成功人数
注意: 在最后的success.jsp界面中调用getServletContext()方法,会因服务器版本不同而调用方法不同: