本文共 7663 字,大约阅读时间需要 25 分钟。
2019年7月16日。
这是我学习JavaWeb的第四天。 这一天,我学到了以下的知识。Java Service Page :Java服务器页面。其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行
JSP能处理一些Java前后端交互的数据,主要用来显示数据,但不建议大量代码写在JSP页面里面;
优点:简单,和HTML差不多
缺点:书写页面会很乱,HTML代码和JAVA交错;
动态请求会被分发到Web容器(Web服务器)中。
容器会去执行字节码文件,就是 .class文件。
Servlet是java类,可以直接编译成class文件。
但是,Jsp怎么编译成class文件?
于是我们会想,jsp是不是会被转换成一个java类。
追究本质
Tomcat在工作的时候,将我们的Jsp页面转换成了java类
打开这个类分析:
该类继承一个类:HTTPJSPBase , 没有直接继承HttpServlet , 但是HTTPJSPBase继承了HttpServlet,所以得出结论
JSP本身就是一个servlet的方式运行的
那他怎么输出页面的呢?发现他是使用out对象输出到浏览器
那这个out对象上去的方式是什么呢?
发现,有一个_jspService可以执行操作我们的JSP,将它输出到前端页面。
继续分析源码,得到一些属性;
JSP基础语法
<%= 表达式或者变量值 %>
<% Java代码 %>
注意点:必须严格遵守Java规范<%! 全局变量或方法 %>
除此之外,JSP中还分为EL表达式和JSTL标签这两种表达方法,本篇博客先介绍EL表达式。
${}
EL表达式一般用来输出变量的值,而不是一个对象。
语法演示示例如下:<%@ page import="java.util.Date" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><%--JSP基础语法 1.JSP获得变量的值 <%= 表达式或者变量值 %> 2.JSP定义局部变量:写一段Java代码 <% Java代码 %> 注意点:必须严格遵守Java规范 3.JSP定义全局变量 <%! 全局变量或方法 %>简化符:因为HTML是标记语言,我们需要一些标记EL表达式和JSTL标签 ${ } == <%= %> 联系和区别 EL表达式一般用来输出变量的值;而不能是一个对象;tomcat会在jsp解析的时候将_jspService转换成对应的doget。dopost,我们正常方式无法直接调用!//JSP内置对象: pageContext 作用域: application = pageContext.getServletContext(); 应用 session = pageContext.getSession(); 会话 request = 请求 page = this; 页面 === out.输出--%><%! int i = 0; public int add(int a,int b){ return a+b; }%><%//Java代码String name = "abc";int age = 18;int j = 0; Date date = new Date(); out.write( (java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate ("${name}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, name ) );%>$Title$ 日期:<%=new Date()%>名字:<%=name%>年龄:<%=age%>i:<%=i++%>j:<%=j++%>
jsp代码可以在不同的 <%%>中实现,但是,Java代码必须保持完成,否则页面会报500错误(服务器代码错误);
示例如下:<%@ page contentType="text/html;charset=UTF-8" language="java" %>首页 <%--在页面输出100个Hello,World--%> <% for (int i = 0; i < 100; i++) { %>Hello,World
<% } %>
模拟一个数据库,在数据库中有一个新闻表(News),在表中有两个字段(日期和信息),完成JSP的综合运用,项目示例如下:
package com.kuang.db;import com.kuang.pojo.News;import java.util.ArrayList;import java.util.List;public class NewsDB { public static Listlist = new ArrayList (); 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)
package com.kuang.pojo;//实体类,一般放在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 + '\'' + '}'; }}
package com.kuang.dao;//dao包一般用来存放操作数据库的对象类;import com.kuang.pojo.News;import java.util.List;public interface NewsDao { //获得所有的新闻 public ListgetAllNews();}
package com.kuang.dao;import com.kuang.db.NewsDB;import com.kuang.pojo.News;import java.util.List;//NewsDao的实现类public class NewsDaoImpl implements NewsDao { @Override public ListgetAllNews() { List list = NewsDB.list; return list; }}
package com.kuang.service;import com.kuang.pojo.News;import java.util.List;//service一般存放业务类public interface NewsService { //获得所有的新闻 public ListgetAllNews();}
package com.kuang.service;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 ListgetAllNews() { return newsDao.getAllNews(); }}
package com.kuang.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 { //写代码读取数据存到某个地方,让前端读取; ListallNews = 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); }}
newsServlet com.kuang.servlet.NewsServlet newsServlet /news.do
<%@ page import="com.kuang.db.NewsDB" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>首页 <%--引入css--%> <%--引入静态资源文件必须带上项目路径位置--%>
<%--${
sessionScope.content1}--%> <%=request.getSession().getAttribute("content"+i)%>注意:该主页(index.jsp)引用了layui前端框架,若想显示完整的效果,请去layui的官网上下载相关库
转载地址:http://ricen.baihongyu.com/