一、什么是JSP?
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
二、JSP原理和语法
Web服务器是如何调用并执行一个jsp页面的?
浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet.
JSP语法
-
JSP获得变量的值 <%= 表达式或者变量值 %>
-
JSP定义局部变量:写一段Java代码 <% Java代码 %>
注意点:必须严格遵守Java规范 -
JSP定义全局变量 <%! 全局变量或方法 %>
-
EL表达式 ${} == <%= %>
EL表达式一般用来输出对象和变量,不能是一个对象
Web服务器在调用jsp时,会给jsp提供一些什么java对象?
查看jspService方法可以看到,Web服务器在调用jsp时,会给Jsp提供如下的8个java对象
1 PageContext pageContext;
2 HttpSession session;
3 ServletContext application;
4 ServletConfig config;
5 JspWriter out;
6 Object page = this;
7 HttpServletRequest request,
8 HttpServletResponse response
其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化
1 pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
2 application = pageContext.getServletContext();
3 config = pageContext.getServletConfig();
4 session = pageContext.getSession();
5 out = pageContext.getOut();
这8个java对象在Jsp页面中是可以直接使用的,如下所示
<%
session.setAttribute("name", "session对象");//使用session对象,设置session对象的属性
out.print(session.getAttribute("name")+"<br/>");//获取session对象的属性
pageContext.setAttribute("name", "pageContext对象");//使用pageContext对象,设置pageContext对象的属性
out.print(pageContext.getAttribute("name")+"<br/>");//获取pageContext对象的属性
application.setAttribute("name", "application对象");//使用application对象,设置application对象的属性
out.print(application.getAttribute("name")+"<br/>");//获取application对象的属性
out.print("Hello Jsp"+"<br/>");//使用out对象
out.print("服务器调用index.jsp页面时翻译成的类的名字是:"+page.getClass()+"<br/>");//使用page对象
out.print("处理请求的Servlet的名字是:"+config.getServletName()+"<br/>");//使用config对象
out.print(response.getContentType()+"<br/>");//使用response对象
out.print(request.getContextPath()+"<br/>");//使用request对象
%>
---------------------
JSP综合案例:模拟数据库
1.模拟数据库
package com.kuang.db;
import com.kuang.pojo.News;
import java.util.ArrayList;
import java.util.List;
public class NewsDB {
public static List<News> list = new ArrayList<News>();
static {
list.add(new News("7.16","学习了JSP的使用以及源码分析"));
list.add(new News("7.14","学习了Servlet,简单的JSP的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
list.add(new News("7.13","学习了Tomcat,Servlet的使用"));
}
}
2.实体类
//实体类,一般放在pojo包下,【 or entity or JavaBeans】
//实体类,只有属性,一般用来映射数据库中的字段 ( O R M )
//私有属性 , 无参构造,有参构造
//get/set方法
//为了方便程序打印,建议加上toString();
public class News {
private String data;
private String content;
public News() {
}
public News(String data, String content) {
this.data = data;
this.content = content;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "News{" +
"data='" + data + '\'' +
", content='" + content + '\'' +
'}';
}
}
3.DAO层
接口:
//dao包一般用来存放操作数据库的对象类;
import com.kuang.pojo.News;
import java.util.List;
public interface NewsDao {
//获得所有的新闻
public List<News> getAllNews();
}
实现类:
import com.kuang.db.NewsDB;
import com.kuang.pojo.News;
import java.util.List;
//NewsDao的实现类
public class NewsDaoImpl implements NewsDao {
@Override
public List<News> getAllNews() {
List<News> list = NewsDB.list;
return list;
}
}
4.sevice层
接口:
import com.kuang.pojo.News;
import java.util.List;
//service一般存放业务类
public interface NewsService {
//获得所有的新闻
public List<News> getAllNews();
}
实现类:
import com.kuang.dao.NewsDao;
import com.kuang.dao.NewsDaoImpl;
import com.kuang.pojo.News;
import java.util.List;
public class NewsServiceImpl implements NewsService {
//从dao层中取出相应的操作数据库的方法
NewsDao newsDao = new NewsDaoImpl();
@Override
public List<News> getAllNews() {
return newsDao.getAllNews();
}
}
5.servlet
import com.kuang.pojo.News;
import com.kuang.service.NewsService;
import com.kuang.service.NewsServiceImpl;
import org.apache.catalina.Session;
import org.junit.Test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
public class NewsServlet extends HttpServlet {
NewsService newsService = new NewsServiceImpl();
@Test
public void test(){
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//写代码读取数据存到某个地方,让前端读取;
List<News> allNews = newsService.getAllNews();//从业务层去获得数据中的全部新闻
int i = 1;
for (News allNew : allNews) { //遍历获得每一个新闻
String data = allNew.getData();
String content = allNew.getContent();
//四大作用域
// page(不用它,代表当前页面)
// request(一次请求中有效): 登录注册
// session (一次会话中存在) : 购物车
// application:本质就是Context (全局,所有会话共享) : 广告
//这四个作用域用来存放一些内容或者对象
HttpSession session = req.getSession();
session.setAttribute("data"+i,data);
session.setAttribute("content"+i,content);
System.out.println(session.getAttribute("data"+i));
System.out.println(session.getAttribute("content"+i));
i++;//自增
}
//数据都读取出来了,给你放到session中了,该去访问页面了
resp.sendRedirect("index.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
---------------------
6.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>newsServlet</servlet-name>
<servlet-class>com.kuang.servlet.NewsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>newsServlet</servlet-name>
<url-pattern>/news.do</url-pattern>
</servlet-mapping>
</web-app>
7.index.jsp
<%@ page import="com.kuang.db.NewsDB" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
<%--引入css--%>
<link rel="stylesheet" href="${pageContext.request.contextPath}/statics/layui/css/layui.css">
<%--引入静态资源文件必须带上项目路径位置--%>
<Script src="${pageContext.request.contextPath}/statics/layui/layui.js"></Script>
</head>
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>常规时间线</legend>
</fieldset>
<ul class="layui-timeline">
<%
for (int i = 1; i <= NewsDB.list.size(); i++) {
%>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">
<%=request.getSession().getAttribute("data"+i)%>
<%--${sessionScope.data1}--%>
</h3>
<p>
<%--${sessionScope.content1}--%>
<%=request.getSession().getAttribute("content"+i)%>
</p>
</div>
</li>
<%
}
%>
<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title">过去</div>
</div>
</li>
</ul>
</body>
</html>