JSP
一、什么是JSP
- JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术
- 处理一些Java前后端交互的数据,主要用来显示数据,不建议大量代码写在JSP页面里面
- 优点:简单,在HTML中嵌入Java代码
- 缺点:书写页面会很乱,HTML代码和JAVA交错
二、Jsp执行原理
Tomcat在工作时,将JSP转换成了Java类
打开这个类,发现它继承了HTTPJSPBase,没有直接继承HttpServlet ,但是HTTPJSPBase继承了HttpServlet,因此,JSP本身就是一个servlet的方式运行的
那他怎么输出页面的呢?发现他是使用out对象输出到浏览器
这个out对象上去的方式是什么的?我们发现有一个_jspService可以执行操作我们的JSP,将他输出到前端页面
继续分析源码,得到一些属性:
三、Jsp基础语法
-
获取变量的值
<%= 表达式或变量%>
-
局部变量
<% Java代码%>
注意:必须严格遵守Java规范(分号)
-
成员变量
<%! 全局变量或方法%>
-
EL表达式
${} == <%= %>
EL表达式一般用来输出对象和变量,不能是一个对象
-
tomcat会在jsp解析的时候将_jspService转换成对应的doget、dopost,我们正常方式无法直接调用
-
Jsp内置对象
通过pageContext可以得到JSP的内置对象,常用的有:
PageContext pageContext; HttpSession session; ServletContext application; ServletConfig config; JspWriter out; Object page = this; HttpServletRequest request, HttpServletResponse response
其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化
pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); 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的代码可以分多个<%%>写,但要注意能前后匹配上
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <%=new Date()%> <% for (int i = 0; i < 10; i++) { %> <h3>Hello Jsp</h3> <% } %> </body> </html>
四、JSP综合案例
-
模拟数据库
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的使用")); } }
-
实体类
//实体类,一般放在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 + '\'' + '}'; } }
-
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; } }
-
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(); } }
-
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); } }
-
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>
-
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>