第一章
java是一门面向对象的编程语言,主要特点是:垃圾回收机制,可以跨平台运行等。
Java的三大特征分别是:封装,继承,多态。
其中Java分为三大体系结构:
A.JavaSE : Java的核心基础版,属于Java的核心,例如基本数据类型,String,线程技术等。
B.JavaEE : Java的Web服务版,属于Web项目的核心,主要负责搭建网站。
C.JavaME : Java的嵌入式版,属于嵌入式的核心,主要负责电子遥控相关产品。(非重点)
不管是JavaEE还是JavaME都是建立在JavaSE的基础之上。
互联网的产品一般分为两大架构,分别是B/S架构和C/S架构。
1. B/S架构:全称为Browser/Server,即浏览器/服务器结构。
主要是做网页端程序设计,只需要安装浏览器即可使用。(我们的主要学习任务)
2. C/S架构:全称为Client/Server,即客户端/服务器架构。
主要是做应用程序设计,需要下载客户端才可以使用。
不管是什么架构,本质都可以利用Java实现,所以不要看C/S架构比B/S架构普遍,就不想学习B/S架构。
B/S架构也是C/S架构的基础。
总结:未来我们都是使用JavaEE技术来实现B/S架构的项目。
服务器:
服务器的本质就是一台电脑。
所有的电脑都可以作为服务器存在。
例如:一个项目在谁的电脑上运行。那么,那台电脑就成了一台服务器。但是那台电脑如果关机了,蓝屏了,
就会导致别的用户无法正常访问那个项目。 就称之为“服务器炸了”。
一般来说:一台好的服务器的配置比一般电脑的配置要高很多很多。
如果想利用JavaWeb制作一个网站供客户使用就必须要服务器的支持。
Tomcat服务器是一种运行在服务器(电脑)上的软件,其主要功能是用来提供Web服务
Tomcat是Apache基金会的一个核心项目。
(和Java属于同一个公司)
目前tomcat9.0是最稳定最常用的版本。
只要你的电脑成功安装了JDK,tomcat即可使用。
tomcat默认端口号为8080。(mysql默认端口号3306)
如何利用idea创建一个web项目:
1.创建一个基本的普通项目
2.选中这个项目,右键选择add Framework 然后勾选Web Application 选择默认的版本4.0
(注意:idea的版本不同,步骤会有略微的不同)
3.此时就已经创建好了。新的目录简介如下:
src:放java源代码的地方
web:放前台页面的地方(HTML) 初学者常犯的错误:经常把html页面放在web目录下得WEB-INF目录
WEB-INF: web项目的安全目录(用户无法访问的地方。暂做了解)
web.xml: web项目的起点(并不是意味着从这里启动。) 例如设置网址的欢迎界面 默认是index.html
index.jsp就可以删除了。改成index.html页面即可。
启动tomcat服务器。 (因为刚刚已经将项目部署tomcat服务器中)
所以现在只需要启动tomcat服务器 ,你的项目也随之启动
细节1补充:
访问项目的网址是什么: 默认是:localhost:8080/项目名_war_exploded/
如何修改:
首先必须要保证localhost:8080的存在 : 因为8080是端口号 localhost表示本机的ip地址
由于是在本机运行,所以可以用localhost 但是如果想要别人访问,就只能使用你的ip地址
疑问:为什么别的的网址都是www.baidu.com 因为别人购买了一个域名(别名)
细节2补充:解决控制台乱码
file -- setting -- editor -- console --改成UTF-8
细节3补充:修改项目启动之后的浏览器。默认是ie 一般都使用谷歌浏览器
回到tomcat服务器的配置页面
细节4补充:启动tomcat 提示什么8080还是1099 什么报错 (表示端口被占用了。之前的tomcat没正常的关闭。)
解决办法:1.重启电脑 2.修改端口号 3.主要解决方式:打开任务管理器,找到进程 用户 找到java.exe关闭即可。
细节5补充:web.xml web项目项目的起点,可以修改项目运行的起始页面等等。
例如:我的网页只有login.html 和reg.html 只有登录注册
如果没有在web.xml文件中 指明欢迎页面 默认在web目录下 找index页面
如果index都找不到 就出现404错误(404表示资源找不到。思考 路径是不是写错的)
如何设置web.xml的欢迎界面
只需要在web.xml中 添加以下代码
<welcome-file-list>
<welcome-file>Xxxx.html</welcome-file>
</welcome-file-list>
以上重中之重。
疑问:我可以保证我的项目内部存在index.html页面来作为首页, 是不是可以不用掌握上面的这个知识点呢?
答:万万不行 原因: 以下场景:淘宝首页: 项目一启动(访问淘宝首页),就显示很多很多商品
这些商品的数据都是从数据库查询而来把。 想要去数据库查,就肯定需要用到java代码。
流程:项目一启动---访问java---访问数据库---获取到数据将数据还给html页面
一个web项目最基本的package结构:
com.yyzy.
entity :存放数据库表的对应的实体类
test :存放测试的
util :存放工具类(可以复用的类。比如数据加密,JDBCUtil)
dao :存放和数据库交互的代码
servlet :专门和html交互的java代码
项目的流程: 用户访问html页面 -- 用户操作页面 --- 发送给servlet --- dao --- servlet --- html
servlet承担一个桥梁的作用:负责Java和html进行交互。
web项目如何导入jar包
1.在web-inf目录下手动创建一个lib文件夹(存放jar包: 什么是jar包:封装了Java的额外功能的包)
2.将相关的jar包丢进去
3.选中jar包 add as library
复习: JDBCUtil类怎么写
详情见com.yyzy.util.JDBCUitl
/*
1.导入jar包
2.静态化加载mysql驱动
3.静态化声明数据库密码账号url地址
4.创建一个静态方法,让别的地方可以直接通过类名访问 获取Connection连接
*/
static String url = "jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
static String username = "root";
static String password = "root";
//优先加载 只会加载一次
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver1");
} catch (ClassNotFoundException e) {
System.out.println("出错了!!!" + e);
}
}
public static Connection getConn(){
try {
Connection connection = DriverManager.getConnection(url, username, password);//三个参数顺序不能随便的
return connection;
} catch (SQLException e) {
System.out.println("获取连接失败" + e);
return null;
}
}
第二章
<a href="index1.html">前台发送请求的三种方式</a><br><br><br>
<a href="index2.html">后台如何接受前台发出的请求---Servlet创建方式</a><br><br><br>
<a href="index3.html">前台如何发送带有数据的请求</a><br><br><br>
<a href="index4.html">后台如何接受前台的数据</a><br><br><br>
<a href="index5.html">实现用户注册基础版</a><br><br><br>
<a href="index6.html">实现用户注册进阶版</a><br><br><br>
<p>web项目是存在缓存问题的:好处就是节省流量节省加载时间。</p>
<p>web项目是存在缓存问题的:坏处就是无法得到理想的正确的结果。</p>
<p>Web缓存存在的两个地方 : 1.浏览器内部--更多工具--清除浏览数据</p>
<p>Web缓存存在的两个地方 : 2.idea项目内部的out目录(加载web项目的缓存目录)</p>
<p>前台发送请求的方式1:通过超链接</p>
<a href="http://www.baidu.com">指向互联网资源</a>
<a href="index.html">指向项目内部的页面资源</a>
<a href="/xxx">指向项目内部的Java资源</a>
<hr>
<p>前台发送请求的方式2:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>
<hr>
<p>前台发送请求的方式3:通过表单</p>
<form action="index.html" method="post">
账号:<input type="text" name="username"><br>
<input type="submit" value="提交">
</form>
<script>
document.getElementById("btn").onclick = function (){
location.href = "index.html";//本质依然是超链接
}
</script>
<p>后台如何获取前台发来的请求</p>
<p>答:通过tomcat提供的Servlet类来实现</p>
<p>什么是Servlet:处理前台请求的一个类</p>
<p>如何去创建Servlet:</p>
<p>1.导入jar包---servet-api.jar 在tomcat的lib目录里面</p>
<p>2.在servlet的包下创建一个Servlet的类</p>
<p>2.1 Servlet的命名规范: XxxServlet 其中Xxx表示什么功能的Servlet </p>
<p>3.继承HttpServlet</p>
<p>4.重写父类的service方法,然后把默认的super删除</p>
<p>5.在类上添加@WebServlet("/Xxx") 注解。表示前台通过什么请求路径访问该类,一般和类名同名</p>
<p>测试如下Servlet</p>
<a href="/TestServlet">通过超链接访问Servlet</a>
<button id="btn">通过JS访问Servlet</button>
<script>
document.getElementById("btn").onclick = function (){
location.href = "/TestServlet";
}
</script>
<p>前台发送携带数据的请求的方式1:通过超链接</p>
<p>语法如下:在URL地址的后面加上?key=value&key=value&key=value的形式即可</p>
<p>注意事项:都是英文状态下的符号,如果含有中文的内容 也无需加引号</p>
<a href="index.html?id=123&name=张三">指向互联网资源</a>
<hr>
<p>前台发送携带数据的请求的方式1:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>
<hr>
<p>前台发送请求的方式3:通过表单</p>
<p>注意事项:内部的表达元素都要加上name来修饰。因为后台都是通过name来获取值</p>
<p>注意事项:单选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:多选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:下拉框:内部的option的value值可以省略的,但是你要知道,如果省略了以option标签的内部为准。如果没省略就以value为准</p>
<form action="/RegServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:
<input type="radio" name="sex" value="男" checked >男
<input type="radio" name="sex" value="女" >女<br>
爱好:
<input type="checkbox" name="likes" value="吃">吃
<input type="checkbox" name="likes" value="喝">喝
<input type="checkbox" name="likes" value="玩">玩
<input type="checkbox" name="likes" value="乐">乐
<br>
地址:
<select name="address">
<option>湖南</option>
<option value="123广东~">广东</option>
<option>云南</option>
</select> <br>
自我介绍:
<textarea name="jieshao">自我介绍:</textarea>
<br>
生日:<input type="date" name="birthday"><br>
<input type="submit" value="提交">
</form>
<script>
document.getElementById("btn").onclick = function (){
location.href = "index.html?id=456";//本质依然是超链接
}
</script>
form action="/RegServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:
<input type="radio" name="sex" value="男" checked >男
<input type="radio" name="sex" value="女" >女<br>
爱好:
<input type="checkbox" name="likes" value="吃">吃
<input type="checkbox" name="likes" value="喝">喝
<input type="checkbox" name="likes" value="玩">玩
<input type="checkbox" name="likes" value="乐">乐
<br>
地址:
<select name="address">
<option>湖南</option>
<option value="123广东~">广东</option>
<option>云南</option>
</select> <br>
自我介绍:
<textarea name="jieshao">自我介绍:</textarea>
<br>
生日:<input type="date" name="birthday"><br>
<input type="submit" value="提交">
</form>
需要修改的地方:
1. 修改tomcat的conf文件夹的logging.properties文件 将下面这行改成GBK
#java.util.logging.ConsoleHandler.encoding = GBK 默认是UTF-8
2.File-setting-console编码改成GBK
3.File-setting-FileEncoding 三个地方改成UTF-8
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//工具类。生成Connetion链接供dao包下的类使用
public class JDBCUtil {
/*
1.静态化加载驱动
2.声明一个可以返回COnnetion链接静态方法供dao去使用
*/
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("加载mysql驱动失败" + e);
}
}
public static Connection getConn(){
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root", "root");
return connection;
} catch (SQLException e) {
System.out.println("获取链接失败" + e);
return null;
}
}
public class UserInfoDao {
//注册用户
public boolean regUserinfo(Userinfo userinfo){
String sql = "insert into userinfo values(null,?,?,?,?,?,?,?)";
Connection conn = JDBCUtil.getConn();
try {
PreparedStatement pre = conn.prepareStatement(sql);
pre.setString(1,userinfo.getUsername());
pre.setString(2,userinfo.getPassword());
pre.setString(3,userinfo.getSex());
pre.setString(4,userinfo.getLikes());
pre.setString(5,userinfo.getAddress());
pre.setString(6,userinfo.getJieshao());
pre.setString(7,userinfo.getBirthday());
int i = pre.executeUpdate();
if (i == 1) {
return true;
}else{
return false;
}
} catch (SQLException e) {
System.out.println("解析sql语句失败" + e);
return false;
}
}
}
<form id="f" action="/RegServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:
<input type="radio" name="sex" value="男" checked >男
<input type="radio" name="sex" value="女" >女<br>
爱好:
<input type="checkbox" name="likes" value="吃">吃
<input type="checkbox" name="likes" value="喝">喝
<input type="checkbox" name="likes" value="玩">玩
<input type="checkbox" name="likes" value="乐">乐
<br>
地址:
<select name="address">
<option>湖南</option>
<option value="123广东~">广东</option>
<option>云南</option>
</select> <br>
自我介绍:
<textarea name="jieshao">自我介绍:</textarea>
<br>
生日:<input type="date" name="birthday"><br>
<input type="submit" value="提交">
</form>
<script>
//第一步获取对象
var username = document.getElementsByName("username")[0];
var password = document.getElementsByName("password")[0];
var likes = document.getElementsByName("likes");
var jieshao = document.getElementsByName("jieshao")[0];
var birthday = document.getElementsByName("birthday")[0];
function checkJieshao(){
var jieshaoVal = jieshao.value;
if(jieshaoVal!=""){
return true;//将其改成生成一个提示框或文本框
}else{
return false;
}
}
function checkBirthday(){
var birthdayVal = birthday.value;
if(birthdayVal!=""){
return true;
}else{
return false;
}
}
function checkUsername(){
var usernameVal = username.value;
if(usernameVal!=""){
return true;//将其改成生成一个提示框或文本框
}else{
return false;
}
}
function checkPassword(){
var passwordVal = password.value;
if(passwordVal!=""){
return true;
}else{
return false;
}
}
function checkLikes(){
for(var i = 0;i<likes.length;i++){
if(likes[i].checked){
return true;
}
}
return false;
}
//表单提交事件
document.getElementById("f").onsubmit = function (){
//满足所有的校验才可以提交
if(checkBirthday()&&checkJieshao()&&checkLikes()&&checkPassword()&&checkUsername()){
return true;
}
alert("提交失败")
return false;
}
</script>
第一层:前台校验,一般通过JS可以实现。 可以解决大部分的问题。
缺点1:可以通过浏览器关闭使用JS
缺点2:可以通过各种工具来绕过JS,直接访问Java后台代码 例如postman等
第二层校验:后台Java校验 一般就是长度校验,非空校验等等
第三层校验:数据库校验 一般通过约束来实现。
主键约束
外键约束
自增约束
唯一约束
非空约束
检查约束 : 近些年才开放其功能 之前仅仅是支持语法,不支持功能。 现在已经完全开放 使用高版本的mysql和navicat即可使用。
默认约束
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受数据的流程:
//1.设置编码
req.setCharacterEncoding("utf-8");
//收集单独独立的数据,例如账号密码性别年龄生日自我介绍等等
//xxx表示前台的参数名是什么 接受返回值全是String 需要自行转换
// String xxx = req.getParameter("xxx");
//收集多个数据:例如爱好 需要遍历 来一一取值
// String[] xxx = req.getParameterValues("xxx");
String username = req.getParameter("username");
if(username.length()==0){
System.out.println("账号不能为空");
return ;//跳出去
}
System.out.println("账号为" + username);
String password = req.getParameter("password");
System.out.println("密码为" + password);
String sex = req.getParameter("sex");
System.out.println("sex为" + sex);
String[] likes = req.getParameterValues("likes");
System.out.println(likes);
if(likes==null){
System.out.println("爱好不能为空");
return ;//跳出去
}
String l = "";
for (int i = 0;i<likes.length;i++){
if(i==likes.length-1){
l = l + likes[i] ;
}else{
l = l + likes[i] + ",";
}
}
String birthday = req.getParameter("birthday");
System.out.println("birthday为" + birthday);
String address = req.getParameter("address");
System.out.println("address为" + address);
String jieshao = req.getParameter("jieshao");
System.out.println("jieshao为" + jieshao);
UserInfoDao ud = new UserInfoDao();
Userinfo userinfo = new Userinfo(null,username,password,sex , l ,address,jieshao,birthday);
boolean b = ud.regUserinfo(userinfo);
System.out.println(b);
}
第三章
public class UserDao {
public UserDao(){
System.out.println("UserDao被调用了被实例化了(new)");
}
public void say(){
System.out.println("执行了userdao的Xx方法");
}
}
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
UserDao ud = null;
@Override
public void init() throws ServletException {
ud = new UserDao();
System.out.println("我被创建了,只会执行一次");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进来了");
//servlet的生命周期:
// 1.初始化调用init方法 只会执行一次 自动执行
// 2.执行 调用service方法,调用几次执行几次 需要手动调用
// 3.消亡调用destory方法 只会执行一次 自动执行 没啥用,一般是项目停止自动执行。
ud.say();
}
@Override
public void destroy() {
System.out.println("我死了");
}
}
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Bservlet");
//转发跳转:
// req.getRequestDispatcher("AServlet").forward(req,resp);
req.getRequestDispatcher("index.html").forward(req,resp);
}
}
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Cservlet");
//重定向跳转:
// resp.sendRedirect("xxx");
resp.sendRedirect("index.html");
}
}
@WebServlet("/DServlet")
public class DServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Dservlet");
System.out.println("这里模拟dao操作,已经收集好了数据....");
//注册完成,跳转到首页
req.getRequestDispatcher("index.html").forward(req,resp);
}
}
@WebServlet("/EServlet")
public class EServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Dservlet");
System.out.println("这里模拟dao操作,已经收集好了数据....");
//注册完成,跳转到首页
resp.sendRedirect("index.html");
}
}
@WebServlet("/FServlet")
public class FServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效
//如何存储数据 注意key要保证唯一,否则会被覆盖
// req.setAttribute("key","aa");
req.setAttribute("username","张三");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}
@WebServlet("/GServlet")
public class GServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// session作用域:重点掌握:作用域一次会话有效。浏览器关闭就失效
//如何存储数据 注意key要保证唯一,否则会被覆盖
//1.获取session对象
HttpSession session = req.getSession();
//2.存值
session.setAttribute("username","李四");
//简写req.getSession().setAttribute("aa,","xx");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}
@WebServlet("/HServlet")
public class HServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量
//如何存储数据 注意key要保证唯一,否则会被覆盖
//1.获取application对象
ServletContext context = req.getServletContext();
//2.存值
context.setAttribute("username","王五");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}
@WebServlet("/ZServlet")
public class ZServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//测试四大作用域的数据
// String username =(String) req.getAttribute("username");
// System.out.println(username);
// Object o = req.getSession().getAttribute("username");
// System.out.println(o);
Object o = req.getServletContext().getAttribute("username");
System.out.println(o);
}
}
<a href="AServlet">知识点1:演示servlet的生命周期</a>
<hr>
<a href="index1.html">演示servlet的跳转</a>
<hr>
<a href="index2.html">演示转发跳转的弊端</a>
<hr>
<a href="index3.html">演示重定向跳转</a>
<hr>
<a href="index4.html">演示Servlet的四大作用域</a>
<p>
servlet的跳转:
1.可以从servlet跳转到另外一个servlet(删除数据之后返回到刷新查询servlet)
2.可以从servlet跳转到前台页面(注册成功返回登录页面)
有两种方式: <br>
<a href="BServlet">通过转发跳转</a><br>
<a href="CServlet">通过重定向跳转</a><br>
</p>
<p>
转发跳转: 只需1次请求即可完成 效率高 URL地址不会改变 例如从B转发到A URL地址依然是B <br>
重定向跳转: 只需2次请求即可完成 效率低 URL地址会改变 例如从B定向到A URL地址就是A<br>
总结:能用转发就用转发。但是以下情况不推荐:涉及到敏感操作一定不能使用转发,
涉及到注册操作.涉及到增删改都推荐使用重定向
备注:超链接本质就是重定向跳转
</p>
<h3>注册页面</h3>
<form action="DServlet" method="post">
账号 <input type="text" name="username" >
密码 <input type="password" name="password" >
<input type="submit" value="注册">
</form>
<h3>Servlet的四大作用域</h3>
<p>有些情况下:我们需要实现后台servlet的数据共享(先掌握这里)</p>
<p>有些情况下:我们需要实现后台servlet和前台页面的数据共享(暂时不讲解)</p>
<p>比如:后台查询到了数据 需要丢给前台去渲染</p>
<p>四大作用域:pageContext < request < session < application </p>
<p>pageContext作用域:仅在当前页面有效,只要页面发生了跳转就失效。 所以不用</p>
<p>request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效,所以切忌使用重定向跳珠</p>
<p>session作用域:重点掌握:作用域一次回话有效。(浏览器打开到关闭为一次回话)</p>
<p>application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量</p>
<a href="FServlet">测试request作用域</a> <hr>
<a href="GServlet">测试session作用域</a> <hr>
<a href="HServlet">测试application作用域</a> <hr>
第四章
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("info1","你好111");
req.getSession().setAttribute("info1","你好222");
ServletContext context = req.getServletContext();
context.setAttribute("info1","你好333");
req.getRequestDispatcher("2.jsp").forward(req,resp);
}
}
<a href="1.jsp">jsp简介</a> <hr>
<a href="2.jsp">EL表达式</a> <hr>
<h3>JSP简介</h3>
<p>为什么要学习JSP:</p>
<p>答:默认的HTML技术是无法将后台的数据直接渲染在前台的</p>
<p>例如在后台的request容器,session容器存了东西,要想在前台拿出来渲染,单独利用HTML无法实现的</p>
<p>所以需要借助额外的知识点才可以实现: 例如JSP技术,AJAX技术等</p>
<h3>JSP的组成</h3>
<p>JSP组成: HTML + Java + JSP本身 </p>
<p>不仅可以写html代码还可以写java代码还可以写JSP代码</p>
<p>但是一般来说 不会再JSP里面写Java代码,最多写点JSP代码 </p>
<p>JSP的本质:本质就是一个Servlet .运行流程:现将JSP解析成servlet再运行。</p>
<h3>JSP现状</h3>
<p>25年前的技术,早已过时,无人问津。所以本书的内容仅做了解。(我讲的都掌握即可)</p>
<p>技术领域:存在即合理。 即使已经过时了。但是过时的原因仅仅是:后人借鉴了它,然后超过了它</p>
<p>原因:效率极低。现在的项目都是讲究一个前后端分离。 前台只操心前台,后台只操心后台</p>
<p>两种注释的区别: JSP的注释不会被解析到浏览器中,而HTML会</p>
<!--我是HTML注释 -->
<%--我是JSP注释 --%>
<h3>EL表达式:</h3>
<p>知识点1:仅仅存在于JSP中,脱离了JSP无法运行。</p> <hr>
<p>知识点2:可以直接将后台数据渲染在页面上。</p> <hr>
<p>知识点3:语法: 美元符号{ xxx } </p><hr>
例如:可以实现基本的运算: ${1+1+1} ${1*5*2} ${"111" + "222"} <br>
<hr>
例如:可以轻松地获取后台容器的数据: <a href="AServlet">先存几个</a> <br>
${info1} ~~~ ${info2} ~~~ ${info3} <br>
<br>如果存在 不同的容器 但是key相同 。那么可以在key的前面加上前缀即可:例如 <br>
${requestScope.info1} ~~~ ${sessionScope.info1} ~~~ ${applicationScope.info1}
<hr>
例如:可以轻松的获取url地址上的相关参数
<a href="update.jsp?id=123&name=张三&age=18">修改页面</a>
<head>
<title>Title</title>
</head>
<body>
<p>下面的写法是获取容器里面的id,但是现在我们要获取url地址里面相关参数</p>
~${id}~
<p>如果想要获取url地址上的参数,那么只需要加上前缀 param</p>
${param.id} ~~${param.name} ~~${param.age} ~~