JSP

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综合案例

  1. 模拟数据库

    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>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值