1.JSP
Java server page
用户角度:就是网页
程序员角度:就是一个servlet
-----为什么会有jsp?
html多数情况下来显示静态内容,一成不变的
有些动态数据需要查询数据库,然后在网页上显示,html不支持写Java代码,jsp可以写
2.怎么写jsp
----指令的写法
<%@ 指令名字%>
----1.page指令
language:表明jsp页面中可以写Java代码
contenttype:说明文件类型,告诉浏览器我是什么内容类型,以及使用什么编码
pageEncoding jsp的内容编码
extends 用于指定jsp翻译成Java文件后,继承的父类是谁,一般不用改
session 里面只能写true或false 用于控制在这个jsp页面里面,能否直接使用session对象
具体区别:看翻译后的Java文件
errorpage:指的是错误的页面,里面写错误页面的路径
iserrorpage:上面的errorpage用于指定错误的时候跑到哪个页面,这个iserrorpage就是声明
某一个页面到底是不是错误的页面
----2.include指令
包含另外一个jsp的内容进来 <%@ include file=“other.jsp”%>
背后就是把另外一个页面的所有内容拿过来一起输出,所有的标签元素都包含进来
----3.taglib指令
<%@ taglib prefix="" url="" %>
url:标签库路径 prefix:标签库的别名
3.jsp动作标签
<jsp:include page=""></jsp:include>
<jsp:param value="" name=""/>
<jsp:forward page=""></jsp:forward>
<jsp:include page="other.jsp"></jsp:include>
动态包含指定页面,不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来
<jsp:forward page="other.jsp"></jsp:forward>:
前往哪一个页面等同于请求转发的代码
request.getRequestDispatcher("other.jsp").forward(request, response);
<jsp:param value="" name=""/>:
在包含或者跳转某个页面的时候加入这个参数
例: <jsp:forward page="other.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
在other.jsp中获取参数
<br>收到的参数是:<br>
<%=request.getparameter("address")%>
4.jsp内置对象
内置对象:就是我们可以直接在jsp页面中使用这些对象,不用创建
—pagecontext
—session
—request
—application
以上四个是作用域对象
作用域:表示这些对象可以存值,他们的取值范围有限定 setattribute getattribute
例:
<%
pageContext.setAttribute("name","page");
application.setAttribute("name","session");
session.setAttribute("name","request");
request.setAttribute("name","application");
%>
取出4个作用域中的值<br>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
<%=pageContext.getAttribute("name") %>
四个作用域的区别
pagecontext:类型【pagecontext】(页面的上下文)
作用域仅限于当前页面,还可以获取到其他八个内置对象
request:类型【httpservletrequest】
仅限于一次请求,只要服务器对该请求做出了响应,这个域中存的值就没有了
session:类型【httpsession】
作用域限于1次会话(多次请求与响应)当中
application:类型【servletcontext】(servlet的上下文)
整个工程都可以访问,服务器关闭就不能访问了
response 【httpservletresponse】
既有out,又有response:先输出response本身要输出的内容,然后才是输出out里面的内容
out 【jspwriter】
page 【object】----就是这个jsp翻译成的Java类的实例对象
config 【servletconfig】
exception【throwable】
5.EL表达式
是为了简化在jsp里面写的那些Java代码
------写法格式
${ 表达式 }
例:取出4个作用域中存放的值
<br>使用EL表达式取出作用域中的值<br>
没有快捷键
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
------------------------------------------------------------------
<%
String[] a={"aa","bb","cc","dd"};
pageContext.setAttribute("array",a);
%>
例: <br>使用EL表达式取出作用域中数组的值<br>
${array[0] },${array[1] },${array[2] },${array[3] }
例: <br>使用EL表达式取出作用域中集合的值<br>
<%
ArrayList list=new ArrayList();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
pageContext.setAttribute("list",list);
%>
${list[0] },${list[1] },${list[2] },${list[3] }
例: <br>使用EL表达式取出作用域中map的值<br>
<%
Map map=new HashMap();
map.put("name", "zhangsan");
map.put("age", "18");
map.put("address.aa", "shenzhen..");
pageContext.setAttribute("map",map);
%>
${map.name },${map.age },${map["address.aa"] }
<!-- 直接指定说到这个作用域里面去找name -->
${pageScope.name }
<!-- 先从page里面找,没有去request,去session,applicat找 -->
${name }
如果这份值有下标,直接使用[]
如果没有下标,直接使用.去取
----------------------------------------------
<%
// User user = new User("zhangsan",18);
// session.setAttribute("u", user);
%>
${u.name },${u.age}
${empty u }
${a > b }
${a gt b }
一般使用EL表达式用的多的是从一个对象中取出它的属性值
6.jsp九大内置对象,EL11个内置对象
${ 对象名.成员 }
pagecontext
作用域相关对象
pagescope
requestscope
sessionscope
applicationscope
头信息相关对象
header
headervalues
参数信息相关对象
param
paramvalues
cookie
全局初始化参数
initparam
注:XMind 是一款非常实用的商业思维导图软件
7.JSTL
Jsp全称: standard tag library jsp标准标签库
简化jsp代码编写,替换<%%>写法,一般与EL表达式配合
----怎么使用
1.导入jar文件到工程的webcontent/web-inf/lib jstl.jar standard.jar
2.将tld文件夹拷贝到webcontent/web-inf下面
3.在jsp页面上,使用taglib指令,来引入标签库
注:如果想要支持EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持
-----常用标签
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
--------------------------------------------
<c:set>
<!-- 声明一个对象name,对象的值zhangsan,默认存到page,指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name }
<c:if>
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出,c:if是没有else的
<br>----------------------<br>
<c:set var="age" value="18"></c:set>
<c:if test="${age > 16 }">
年龄大于了16岁
</c:if>
<br>----------------------<br>
<c:set var="age" value="18"></c:set>
<c:if test="${age > 25 }">
年龄大于了25岁
定义一个变量名flag去接受前面表达式的值,然后存在session域中
<c:set var="age" value="18"></c:set>
<c:if test="${age > 16 }" var="flag" scope="session">
年龄大于了16岁
</c:if>
${flag }
<c:foreach>
<!-- 从1开始遍历到10,得到的结果,赋值给i,并且会存储到page域中,step增幅为2 -->
<c:forEach begin="1" end="10" var="i" step="2"><br>
${i }
</c:forEach>
<%
// ArrayList list=new ArrayList();
// list.add(new User("zhangsan",18));
// list.add(new User("zhangsan",28));
// list.add(new User("zhangsan",38));
// list.add(new User("zhangsan",48));
%>
<!-- items:表示遍历哪一个对象,注意:这里必须写EL表达式 -->
<!-- value:遍历出来的每一个元素用user去接受 -->
<c:forEach var="user" items="${list }">
<%-- ${user.name}-----${user.age } --%>
</c:forEach>
8.Form表单中method为get和post的区别:
参考:https://www.cnblogs.com/yaochc/p/4957791.html
servlet是运行在服务器上的,它是网页和服务器之间的中间层
9.学生信息管理系统
—1.先写login.jsp,并且搭配一个LoginServlet去获取登录信息
<body>
<h3>欢迎使用黑马学生管理系统</h3>
<form action="Login"method="post">
账号:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
<input type="submit" value="登录"/><br>
</form>
</body>
—2.数据库中创建用户表,里面只要有id,username和password
—3.创建userdao,定义登录的方法
—4.创建userdaoimple,实现刚才定义的登录方法
Connection conn=null;
PreparedStatement ps =null;
ResultSet rs=null;
try {
//1.注册驱动
conn=资源释放.getConn();
// 3.执行sql
String sql="select * from yonghu where username=? and password=?";
// 4将参数化的SQL语句发送到数据库。
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs= ps.executeQuery();
//执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatement的 ResultSet对象。
// 5.遍历每一条记录
return rs.next();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
资源释放.release(conn, ps, rs);
}
return false;
—5.在loginservlet里面访问userdao,判断登录结果,以区分对待
//post提交过来的数据有中文
request.setCharacterEncoding("utf-8");
/*
* 确保发往服务器的参数以汉字的编码来提取
*/
response.setContentType("text/html;charset=utf-8");
/*
* 设置HTTP 响应的编码,同时指定了浏览器显示的编码;
*/
// 1.获取客户端提交的信息
String username = request.getParameter("username");
String password = request.getParameter("password");
// 2.去访问dao,看是否满足登录
UserDao dao=new UserDaoDemo();
boolean issuccess=dao.login(username, password);
// 3.针对dao的返回结果,做出响应
if (issuccess) {
// response.getWriter().write("登录成功");
// 跳转页面:1.请求转发2.重定向
// 重定向(地址栏上显示stu_list.jsp)
// 1.查询出来所有的学生信息
Studao studao=new StudaoDemo();//实现接口
ArrayList<Student> list=studao.findall();
// 先把集合存到作用域中
request.getSession().setAttribute("list", list);//存值
// 2.重定向跳转页面
response.sendRedirect("stu_list.jsp");
} else {
response.getWriter().write("用户名或者密码错误");
—6.创建stu-list.jsp,让登录成功的时候跳转过去
—7.创建学生表,里面字段随意
—8.定义学生studao
—9.实现上面的studao,为studaodemo
Connection conn=null;
PreparedStatement ps =null;
ResultSet rs=null;
ArrayList<Student> list=new ArrayList<Student>();
try {
//1.注册驱动
conn=资源释放.getConn();
// 3.执行sql
String sql="select * from t_stu";
// 4.得到结果集
ps = conn.prepareStatement(sql);
rs= ps.executeQuery();
// 5.遍历每一条记录
// 数据多了用对象装,对象也多了用集合装,void只能装一个学生,不能装多个学生
while (rs.next()) {
Student stu=new Student();
stu.setId(rs.getInt("id"));
stu.setAge(rs.getInt("age"));
stu.setName(rs.getString("name"));
stu.setXingbie(rs.getString("xingbie"));
stu.setAddress(rs.getString("address"));
list.add(stu);
}
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}finally {
资源释放.release(conn, ps, rs);
}
return list;
—10.登录成功的时候完成三件事
查询所有学生
把所有的学生集合存储到作用域中
跳转到stu_list.jsp
—11.在stu_list.jsp中,取出域中的集合,然后使用c标签,去遍历集合
<br>学生列表<br>
<table border="1" width="700">
<tr align="center">
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>住址</td>
<td>操作</td>
</tr>
<c:forEach items="${list }" var="stu">
<tr align="center">
<td>${stu.id }</td>
<td>${stu.name}</td>
<td>${stu.age }</td>
<td>${stu.xingbie }</td>
<td>${stu.address }</td>
<td><a href="#">更新</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
10.总结
jstl:c:foreach用的多
el表达式:用的多的取四个作用域中的值、11个内置对象
jsp:三大指令,三个动作标签、九个内置对象
jstl,el表达式均是方便jsp的
接上:关闭浏览器后还想再次显示购物车中的信息
string id=request.getsession().getid();
cookie cookie=new cookie("jsession",id);
cookie.setMaxage(60*60*24*7);
response.addcookie(cookie);