JavaWeb&&JSP

什么是JSP

JSP(java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。不建议大量代码写在JSP页面里面;
jsp:作为请求发起页面,例如显示表单,超链接,作为请求结束页面,例如显示数据
Servlet:作为请求中处理数据环节
特点:简单,和HTML差不多
缺点:书写页面会很乱,HTML代码和Java交错

JSP到底怎么执行

动态请求会被分发web容器(Web服务器)中,容器会去执行字节码文件,就是.class,Servlet是Java类,可以直接编译成class文件,

追求本质

idea的Tomcat work在他自己的空间中

C:\Users>IntelliJIdea2018.1>{用户}>IntelliJIdea2018.1>system>tomcat>Web项目>找JSP生成的Servlet

Tomcat在工作的时候,将我们的Jsp页面转换成了java类

jsp 和Java如何一起使用 jsp和java web有什么区别_java


打开这个类分析

他继承一个类:HTTPJSPBase,没有直接继承HttpServlet,但是HTTPJSPBase继承了HttpServlet,所以得出结论

Jsp本身就是一个servlet的方式运行的

那他怎么输出页面的呢?发现他是使用out对象输出到浏览器

那这个out对象上去的方式是什么呢?

发现,有一个—jspService可以执行操作我们的jsp,将他输出到前端页面

jsp 和Java如何一起使用 jsp和java web有什么区别_java_02


<%@ page import=“java.util.Date” %>

<%@ page cnotallow=“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 = "qinjiang";
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
                    )
    );

%>


<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <h1>

日期:<%=new Date()%>
名字:<%=name%>
年龄:<%=age%>
i:<%=i++%>
j:<%=j++%>

JSP三大指令

page
<%@page language=“java” info=“xxx”…%>**
page指令
autoFlush:自动刷新 (true,false:默认)
contentType:页面文本类型 “text/html”
errorPage: 如果存在错误页面,就跳转至指定的页面 【不推荐使用,推荐在XML中配置】
language:JSP中使用的语言,默认是java
pageEncoding:页面编码
import:因为jsp本质上就是一个servlet,所以需要导入相关jar包才能使用。
errorPage和isErrorPage
errorPage:当前页面如果抛出异常,那么要准发到哪一个页面,由errorPage来指定
isErrorPage:它指定当前页面是否处理错误的页面,当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception

<?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">

    <!--如果网站中出现了404,就跳转到指定的页面-->
    <error-page>
        <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/error/exception.jsp</location>
</error-page>

**include** include指令 导入其他页面包含到本页,网站中一般有一些公用的位置,我们可以提取出来,比如网站的头部,和尾部 file属性:【要导入页面,一般都是不完整的网页,只包含部分】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <h1>我是footer</h1>
</div>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <h1>我是header</h1>
</div>

<body>
  <%--使用include指定加载网页其他部分--%>
  <%@include file="common/header.jsp"%>
  <h1>我是index页面</h1>
  <%@include file="common/footer.jsp"%>
</body>

taglib
在jsp中有大量的java代码十分痛苦,所以开发中我们可以使用一些现成的标签库,就相当于使用一些替代java代码的标签语言
out.print()-----> <c:out> : 这个c就是一个别人定义好的标签库,像这样的库有非常多,我们甚至可以自己定义;
我们之后学习的JSTL标签就是这里的标签库

两个属性

  • prefix:指定标签库在本页面的前缀!由我们自己来起名称!
  • uri:指定标签库的位置
  • <%@tablib prefix=“s” uri="/strutstags”%>前缀的用法<s:text>
    简单扩展BootStarp

前端框架:BootStarp

中文官网:https://www.bootcss.com/

库:拿来即用

Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 WEB 项目。

基于 jQuery 的强大的插件系统,能够快速为你的想法开发出原型或者构建整个 app 。

类似的还有layui之类的框架;

JSP使用

jsp代码可以在不同的 <%%>中实现,但是,Java代码必须保持完成,否则500;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>首页</title>
  </head>
  <body>

  <%--在页面输出100个Hello,World--%>

  <%
      for (int i = 0; i < 100; i++) {
  %>
      <h1>Hello,World</h1>
  <%
      }
  %>

 
  </body>
</html>
### JSP的使用
##### 模拟数据库
package com.kuang.db;

import com.kuang.pojo.News;

import java.util.ArrayList;
impo

rt 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
pu

blic String toString() {
        return "News{" +
                "data='" + data + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}
dao层

dao包一般一般用来存放操作数据库的对象类;
package com.kuang.dao;

//dao包一般用来存放操作数据库的对象类;

import com.kuang.pojo.News;

import java.util.List;

public interface NewsDao {
    //获得所有的新闻
    public List<News> getAllNews();

}


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 List<News> getAllNews() {
        List<News> list = NewsDB.list;
        return list;
    }

}
service层
package com.kuang.service;

import com.kuang.pojo.News;

import java.util.List;

//service一般存放业务类
public interface NewsService {
    //获得所有的新闻
    public List<News> getAllNews();
}

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 List<News> getAllNews() {
            return newsDao.getAllNews();
        }

}
servlet
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 NewsS

erviceImpl();

    @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 Serv

letException, 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>
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>