Jsp
jsp笔记
JSP入门
概念
Java Servler Pages : Java服务器端页面
- 可以理解为一个特殊的页面,其中即可以指定html标签,又可以定义Java代码
原理
jsp本质上就是一个Servlet
运行tomcat,打开浏览器访问一个jsp文件,看控制台日志信息上面有如下一段
复制该路径,文件打开
即运行的jsp文件产生的资源
由此可以看出:.jsp --> .java --> .class
打开.java文件查看代码:发现index_jsp类继承 HttpJspBase类
而HttpJspBase类是由apache提供的,即tomcat提供的。
下面再看tomcat中HttpJspBase类,
发现他继承自 HttpServlet, 所以说jsp本质上是一个Servlet
脚本
1、代码脚本
格式:<% Java语句 %>
作用:在JSP页面中可以编写需要的Java代码
2、表达式脚本
格式:<%=表达式 %>
作用:在浏览器的JSP页面上输出数据
3、声明脚本
格式:<%! 声明Java代码 %>
作用:可以给JSP翻译出来的Java类定义属性、方法、静态代码块、内部类等
指令
作用:用于配置jsp页面,导入资源文件
格式:
<%@ 指令名称 属性名1=属性值1 属性2=属性值2……%>
分类:
1、page :配置jsp页面
-
contenType:等同于response.setContentType()
1、设置响应体的mime类型以及字符集
2、设置当前jsp页面的编码(只能是高级的ide才能生效,低级工具则需要设置pageEncoding属性设置当前页面字符集)
-
import:导包,如使用Java 的list集合就要导包
-
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
-
isErrorPage:标识当前页面是否是错误页面
true:是,可以使用内置对象exception(异常信息对象)
false:否,默认值。不可以使用内置对象exception
2、include :页面包含的。引入页面的资源文件
如很多页面都包含有某个特点,将该特点写到一个页面a,其他页面引入该页面a
<%@ include file="a.jsp" %>
3、taglib :导入资源
多用于导入标签库
<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core"%>
- prefix :前缀,自定义的
注释
html注释:
<!-- 注释内容--> 只能注释html代码片段
jsp注释:推荐使用
<%注释内容%> 可注释所有
内置对象
在jsp页面中不需要获取和创建,可以直接使用的对象、
jsp一共有9个内置对象。
-
request
-
response
-
out : 字符串输出流对象。可以将数据输出到页面上。和response.getWriter()类似
-
response. getWriter() 和 out. writer() 的区别
在tomcat服务器真正给客户端做出响应之前,会先找response 缓冲区数据,再找out缓冲区数据。
所以response. getWriter() 会比 out. writer() 先输出,为了不影响布局,jsp会都选择用out. writer()
-
(exception对象只有在 page指令下的isErrorPage属性的属性值为true才有)
MVC:开发模式
1、jsp演变历史
1、早期只有servlet,只能使用response输出标签数据,非常麻烦
2、后来有jsp,简化了servlet的开发,如果过度使用jsp,在jsp中写入大量的Java代码和html结构,造成难于维护,难于分工协作。
3、再后来,Java的web开发,借鉴mvc开发模式,使得程序得设计更加合理
2、MVC:
M:Model,模型。JavaBean
- 完成具体得业务操作,如:查询数据库,封装对象
V:View,视图。jsp
- 展示数据
C:Controller,控制器。Servlet
- 获取用户输入
- 调用模型
- 将模型返回数据给视图进行展示
EL表达式
1、概念:Expression Language 表达式语言
2、作用:替换和简化jsp页面中的Java代码编写
3、语法:${表达式}
4、注意:
-
jsp默认支持EL表达式,如果要忽略EL表达式
1、设置jsp中page指令中:isELIgnored=“true” 忽略当前页面中所有EL表达式
2、\ ${表达式} :忽略当前这个EL 表达式
5、使用:
常用于:1、运算;2、获取值
${5+7}
${pageContext.request.contextPath} 获取虚拟目录
action="${pageContext.request.contextPath}/loginServlet"
1、运算符
1、算数运算符:+ - * /(也可div) %(mod)
2、比较运算符:> < >= <= == !=
3、逻辑运算符:&&(and) ||(or) !(not)
4、空运算符:empty
- 功能:用于判断字符串、集合、数组对象是否为null并且长度是否为0
- 长度为0或者对象为null则返回true
- ${empty lists}
empty举例:
<%
String str="";
ArrayList ali=new ArrayList<>();
ali.add(str);
%>
${empty ali} <%--长度为0或者 为空,返回true--%>
${not empty ali} <%--不为空 相当于 if(ali != null && ali.lenght !=0)--%>
2、获取值
1、el表达式只能从域对象中获取值
2、语法:
1、${域名称 . 键名} : 从指定域中获取指定键的值
-
域名称:
域名称 1、pageScope --->pageContext 2、requstScope --->requst 3、sessionScope --->session 4、applicationScope --->application - 举例:在request域中存储了name=张三 - 获取:${requstScope.name}
**2、${键名} : 表示依次从最小的域中查找是否有该键对应的值,直到找到为止(即上面的1~4从小到大)**
```jsp
<%request.getSession().setAttribute("name","李四");%>
${pageContext.request.setAttribute("name","张三")}
${name} <%--张三--%>
${sessionScope.name} <%--李四--%>
3、获取对象、list集合、Map集合的值
1、对象:${域名称.键名.属性名}
- 本质上会去调用对象的getter方法
例如:现在有User类,要在jsp中获取其对象内容
public class User {
private String name;
private int age;
private Date birthday;
//省略get/set方法
}
jsp:
<%@ page import="maindao.User" %> <%--导入java类--%>
<%--获取对象,设置值. 并将对象存储到request域中--%>
<%
User user = new User();
user.setName("张三");
user.setAge(18);
user.setBirthday(new Date());
request.setAttribute("u",user);
%>
<%--
通过的是对象的属性来获取
- setter或getter方法,去掉set或get,在将剩余部分,首字母变小写。
- setName --> Name --> name
实际上是调用成员方法。
--%>
${requestScope.u.name}<br>
${u.name}<br>
${u.age}<br>
${u.birthday}
将时间格式化输出:在Bean类中添加一个方法
public class User {
private String name;
private int age;
private Date birthday;
//逻辑视图
public String getBirStr(){
if (birthday != null){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(birthday);
}else {
return "";
}
}
//省略get/set方法
}
jsp:
${
requestScope.u.name}<br>
${
u.name}<br>
${
u.age}<br>
${
u.birthday}<br>
${
u.birStr} //调用了getBirStr()方法
2、List集合:${域名称.键名[索引]}
<%--LIst--%>
<% ArrayList list = new ArrayList<>();
list.add("张三");
list.add(23);
request.setAttribute("list",list);
%>
${requestScope.list[0]}
${list[1]}
3、Map集合:${域名称.键名.key名称}
或 ${域名称.键名["key名称"]}
<%--Map--%>
<%
HashMap hash=new HashMap<>();
hash.put("name","李小龙");
hash.put("gender","男");
hash.put("user",user);
request.setAttribute("map",hash);
%>
${requestScope.map.name}
${map.gender}<br>
${map.user.birStr}
3、隐式对象:
-
el表达式中有11个隐式对象
-
pageContext:
-
获取jsp其他八个内置对象
- ${pageContext. request. contextPath } : 动态获取虚拟目录
-
JSTL
1、概念:JavaServer Page Tag Library Jsp标准标签库
- 是由Apache组织提供的开源的免费的jsp标签
2、作用:用于简化和替换jsp页面上的Java代码
3、使用步骤:
1、导入jstl相关jar包
2、引入标签库:taglib指令:<%@ taglib %>
jsp中:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix="c" :前缀
3、使用标签
4、常用标签:
1、if : 相当于Java中的if语句
<c:if test="true">
你好啊,真的才能进哦
</c:if>
c:if标签:
属性:test 必须写的属性,接收Boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签
2、choose :相当于Java中的switch语句
<%
request.setAttribute("number",7);
%>
<c:choose>
<c:when test="${number==1}">星期1</c:when>
<c:when test="${number==2}">星期2</c:when>
<c:when test="${number==3}">星期3</c:when>
<c:when test="${number==4}">星期4</c:when>
<c:when test="${number==5}">星期5</c:when>
<c:when test="${number==6}">星期6</c:when>
<c:when test="${number==7}">星期天</c:when>
<c:otherwise>数字输入有误</c:otherwise>
</c:choose>
3、foreach :相当于Java 中的for语句
<%--
1、完成重复的操作
- 属性:
begin:开始值
end:结束值
var:临时变量
step:步长
varStatus:循环状态对象
index:容器中元素的索引,从0开始(非容器会显示值)
count:循环次数,从1开始
--%>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
${i} ,${s.index} ,${s.count} <br>
</c:forEach>
<%--
2、遍历容器
- 属性
items:容器对象
var:容器中元素的临时状态对象
varStatus:循环状态对象
index:容器中元素的索引,从0开始
count:循环次数,从1开始
--%>
<%
ArrayList list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index} ${s.count} ${str}<br>
</c:forEach>
案例:
需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合展示到jsp页面的表格中
<%--该User类为上面el表达式哪里的User类--%>
<%
List list = new ArrayList();
list.add(new User("张三",23,new Date()));
list.add(new User("李四",15,new Date()));
list.add(new User("聂风",26,new Date()));
list.add(new User("步惊云",20,new Date()));
request.setAttribute("list",list);
%>
<table width="400" border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>生日</th>
</tr>
<c:forEach items="${list}" var="s" varStatus="st">
<tr>
<td>${st.count}</td>
<td>${s.name}</td>
<td>${s.age}</td>
<td>${s.birStr}</td>
</tr>
</c:forEach>
</table>
三层架构
1、界面层(表示层) :用户看的界面。用户可以通过界面上的组件和服务器进行交互
2、业务逻辑层 :处理业务逻辑的。
3、数据访问层 :操作数据存储文件。
案例:用户信息列表展示
1、需求:用户信息的增删改查操作
2、设计:
1、技术选型:Servlet+JSP+MySQL+JdbcTempleat + Duird + BeanUtils + tomcat
2、数据库设计:
create database day1; -- 创建数据库
use day1; -- 使用数据库
create table user( -- 创建表
id int primary key auto_increment,
name varchar(20) not null,
gender varchar(5),
age int,
address varchar(32),
qq varchar(20),
email varchar(50)
);
3、开发:
1、环境搭建
1、创建数据库环境
2、创建项目,导入需要的jar包
2、编码
首先创建一些必要的包:
![image-20210428093909351](https://i-blog.csdnimg.cn/blog_migrate/f2285992e52962e07372d1cadf76ae7f.png)
dao包:
UserDao接口:定义一些操作数据库的抽象方法
impl包:定义UserDao接口的实现类,在该类中通过JDBC访问数据库
service包:
UserService接口:定义了一些业务操作(操作数据库)方法
impl包:定义UserService接口的实现类,该类通过调用UserDao接口的实现类完成业务,返回操作后的对象
接口:定义业务方法
//UserService接口,暂时定义了两个业务操作
public interface UserService {
/**
*查询
* @return
*/
public List<User> findAll();
/**
* 登录
* @param user
* @return
*/
public User login(User user);
}
//UserDao接口,为完成service对应的业务操作,同时定义了满足业务操作的访问数据库的方法
public interface UserDao {
/**
* 查找全部属性
* @return
*/
public List<User> findAll();
/**
* (登录查找)查找用户名和密码
* @param user
* @return
*/
public User findByUsernameAndPassword(User user);
}
实现类:实现接口方法,并编写对应功能
//UserDaoImpl实现类
public class UserDaoImpl implements UserDao {
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<User> findAll() { //实现UserDao接口的查询全部信息方法
//jdbc操作数据库
//定义sql
try {
String sql="select * from user";
List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
return users;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}}
//UserServiceImpl实现类
public class UserServiceImpl implements UserService { //实现UserService接口方法
private UserDao dao=new UserDaoImpl(); //创建UserDaoImpl实现类对象
@Override
public List<User> findAll() {
//调用UserDaoImpl实现类对象的对应方法完成查询
return dao.findAll();
}}
1、简单功能:
1、列表查询
@WebServlet("/userLiseServlet") //Servlet控制
public class UserListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用UserService完成查询
UserService service=new