一.基础
1. 概念
- Java Server Pages:
java服务器端页面
* 可以理解为:一个特殊的页面,其中既可以指定定义html标签
,又可以定义java代码
* 用于简化书写!!!
*JSP本质上就是一个Servlet
2. 脚本
- JSP定义Java代码的方式
<% 代码 %>
:定义的java代码,在service方法中,service方法中可以定义什么,该脚本中就可以定义什么
。
<%! 代码 %>
:定义的java代码,在jsp转换后的java类的成员位置。
<%= 代码 %>
:定义的java代码,会输出到页面上
。输出语句中可以定义什么,该脚本中就可以定义什么。
- 将5名员工信息(编号,姓名,年龄)存入List集合中,在jsp页面遍历集合,结合table标签展示员工数据。
public class Emp {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public Emp() {
}
public Emp(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<%@ page import="pojo.Emp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
tr:hover{
background-color: cornflowerblue;
}
</style>
</head>
<body>
<%--
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
--%>
<table border="2" cellpadding="25" cellspacing="0" align="center">
<%--定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。--%>
<%
Emp e1 = new Emp(1,"aa",55);
Emp e2 = new Emp(2,"啊啊",55);
Emp e3 = new Emp(3,"得到",34);
Emp e4 = new Emp(4,"弟弟",43);
Emp e5 = new Emp(5,"哈哈",22);
Emp e6 = new Emp(6,"玖玖",78);
Emp e7 = new Emp(7,"大狙",90);
ArrayList<Emp> emps = new ArrayList<>();
emps.add(e1);
emps.add(e2);
emps.add(e3);
emps.add(e4);
emps.add(e5);
emps.add(e6);
emps.add(e7);
//输出
for (int i = 0; i <emps.size() ; i++) {
%>
<tr>
<td><%=emps.get(i).getId()%></td>
<td><%=emps.get(i).getName()%></td>
<td><%=emps.get(i).getAge()%></td>
</tr>
<%
}
%>
<%--在jsp转换后的java类的成员位置。--%>
<%! %>
<%--会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。--%>
<%= 1%>
</table>
</body>
</html>
二.高级
1.三大指令
- page 用于
声明jsp
: jsp=html+page指令- taglib 用于
导入外部资源标签库
,jstlinclude 静态包含,一个jsp页面可以包含另一个jsp页面
- page指令的属性
- contentType=“text/html;charset=UTF-8”
指定jsp文件的mime类型和字符集
- import=“java.util.*” 为jsp的脚本中的Java代码去导包
- errorPage=“500.jsp”
如果当前页面发生异常,就跳转到500.jsp中
- isErrorPage=“true”
承认自己是不是错误处理页面,如果为true就可以使用exception内置对象
include指令
静态包含 –
两个jsp之间使用静态包含,会被tomcat服务器编译成一个servlet,可以实现脚本互通
<%@include file="top.jsp"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="15" >
<tr>
<td>员工号</td>
<td>员工</td>
<td>工资</td>
</tr>
<%--
静态包含 -- 两个jsp之间使用静态包含,
会被tomcat服务器编译成一个servlet,可以实现脚本互通
<%@include file="top.jsp"%>
--%>
<%@include file="b.jsp"%>
</table>
</body>
</html>
taglib
引入外部标签库,通常用于引入jstl标签
- <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
*prefix:前缀,自定义的
2.内置对象
- 注释
<%-- jsp注释 --%> 该注释中的java脚本不会被执行
<!-- html注释--> 该注释中的java脚本会被执行,但是执行结果会被注释
九个内置对象
在jsp页面中不需要创建,直接使用
的对象一共有9个:
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
- 归类:
-
域对象(从小到大)
pageContext
request
session
application -
其它(页面 就算有 异常 也要 响应 输出 配置)
page
exception
response
out
config
3.jsp发展史和mvc
- javaWeb发展史
1.早期只有servlet,只能使用response输出标签数据,非常麻烦
2.后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又有html标签,造成难于 维护,难于分工协作
3.再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性
总结:
1.只有servlet,如果响应动态资源,必须使用response.writer()
去输出大量的标签
2.jsp出生和繁荣,完全依赖jsp,省略了servlet,优点:便于开发,缺点:耦合度高,代码非常不清晰
3.mvc模式,jsp和servlet共存,jsp中只有少量的java代码,主要还是用于页面展示,核心功能放在servlet中
- mvc – 一种软件设计典范
M
:Model,模型。JavaBean
*完成具体的业务操作,如:查询数据库,封装对象
- V:
View
,视图。JSP
*展示数据
- C:
Controller,控制器
。Servlet
*获取用户的输入
*调用模型
*将数据交给视图进行展示
- 优缺点:
- 优点:
耦合性低,方便维护,可以利于分工协作
重用性高- 缺点:
使得项目架构变得复杂,对开发人员要求高
总结:
m:model
模型层
,泛指service层,dao层和javaBean实体类
v:view
视图层
,使用jsp展示数据
c:controller
控制层
,使用servlet处理请求和响应
作业
1.使用jsp实现用户表的所有数据查询和展示,不使用Servlet
bean
public class Users {
private int id;
private String name;
private String psw;
@Override
public String toString() {
return "Users{" +
"id=" + id +
", name='" + name + '\'' +
", psw='" + psw + '\'' +
'}';
}
public Users() {
}
public Users(int id, String name, String psw) {
this.id = id;
this.name = name;
this.psw = psw;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPsw() {
return psw;
}
public void setPsw(String psw) {
this.psw = psw;
}
}
dao
public interface UserDao {
//查询所有用户信息
List<Users> selectUsers();
}
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JdbcUtil.getDs());
@Override
public List<Users> selectUsers() {
return template.query("select * from users",new BeanPropertyRowMapper<Users>(Users.class));
}
}
service
public interface UserService {
List<Users> findUsers();
}
public class UserServiceImpl implements UserService {
//引入dao
private UserDao dao = new UserDaoImpl();
@Override
public List<Users> findUsers() {
return dao.selectUsers();
}
}
JdbcUtil
public class JdbcUtil {
private static DataSource ds;
static {
try {
Properties prop = new Properties();
prop.load(new FileInputStream("E:\\Java-servlet\\day18-jsp\\src\\druid.properties"));
ds= DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDs(){
return ds;
}
}
JSP
<%@ page import="com.service.UserService" %>
<%@ page import="com.service.impl.UserServiceImpl" %>
<%@ page import="java.util.List" %>
<%@ page import="com.bean.Users" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
private UserService service = new UserServiceImpl();
%>
<table border="1" cellpadding="15" cellspacing="0" bgcolor="#7fffd4">
<%
List<Users> users =service.findUsers();
for (int i = 0; i <users.size() ; i++) {
%>
<tr>
<td><%=users.get(i).getId()%></td>
<td><%=users.get(i).getName()%></td>
<td><%=users.get(i).getPsw()%></td>
</tr>
<%
}%>
</table>
</body>
</html>
2.jsp搭配Servlet完成数据的员工表所有数据的查询和展示
UsersServlet
@WebServlet("/users")
public class UsersServlet extends HttpServlet {
private UserService service = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//servlet中 取 调 存 转
//调
List<Users> users = service.findUsers();
//存
request.getSession().setAttribute("users",users);
//转
response.sendRedirect("/yq/users2.jsp");
}
}
JSP
<%@ page import="java.util.List" %>
<%@ page import="com.bean.Users" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellpadding="15" cellspacing="0" bgcolor="#7fffd4">
<%
//servlet中代码编写顺序 取 存 调 转
List<Users> users = (List<Users>)session.getAttribute("users");
for (int i = 0; i <users.size() ; i++) {
%>
<tr>
<td><%=users.get(i).getId()%></td>
<td><%=users.get(i).getName()%></td>
<td><%=users.get(i).getPsw()%></td>
</tr>
<%
}%>
</table>
</body>
</html>