jsp,mvc架构


概述

Java Server Pages:和servlet一样,用于动态web技术

Jsp原理

D:\apache-tomcat-9.0.29\work\Catalina\localhost\ROOT\org\apache\jsp下有index_jsp.java,其中代码HttpJspBase类是extends HttpServlet类。idea中使用tomcat会在idea中tomcat生产work目录

浏览器向服务器发送请求,不管访问什么资源,其实就是在访问Servlet.

Jsp本质就是Servlet

	//初始化
    public void _jspInit() {
    }

	//销毁
    protected void _jspDestroy() {
    }

    @Override
    public abstract void _jspService(HttpServletRequest request,
                                     HttpServletResponse response)
        throws ServletException, IOException;
  1. 判断请求

  2. 内置对象

        final javax.servlet.jsp.PageContext pageContext;//页面上下文
        final javax.servlet.ServletContext application;//application
        final javax.servlet.ServletConfig config;//config
        javax.servlet.jsp.JspWriter out = null;//out
        final java.lang.Object page = this;//当前页
     	request//请求
        response//响应
        session
        exception
    
  3. 输出页面前的代码

    response.setContentType("text/html; charset=UTF-8");
          pageContext = _jspxFactory.getPageContext(this, request, response,
          			null, false, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          out = pageContext.getOut();
          _jspx_out = out;
    
  4. 以上对象可以在jsp页面直接使用

  5. 如果是java代码,jsp转servlet就会原封不动转化,如果是html。就会用out.write()

基础语法

依赖
    
        
        
            javax.servlet
            javax.servlet-api
            3.1.0
        

        
        
            javax.servlet.jsp
            javax.servlet.jsp-api
            2.3.3
        

        
        
            javax.servlet.jsp.jstl
            jstl-api
            1.2
        

        
        
            taglibs
            standard
            1.1.2
        
    
jsp表达式
  • 语法

    <%= new Date()%>	<%= 变量或表达式>
    <% %>	脚本片段
    <%! %>	jsp声明
    <%----%>	jsp注释 jsp注释不会在客户端显示,而html注释会
    
  • jsp脚本片段

    <%
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum = sum + i;
        }
        out.println("

    sum=" + sum + "

    "); %>
  • jsp脚本片段再实现

    <%
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum = sum + i;
        }
        out.println("

    sum=" + sum + "

    "); %>
  • jsp声明

    会被编译到jsp生成的java类中,其它会被生成到_jspService中

    <%--会被编译到jsp生成的java类中,其它会被生成到_jspService中--%>
    <%!
        static {
            System.out.println("loading servlet");
        }
    
        private int globalVar = 0;
    
        public void test(){
            System.out.println("进入方法test");
        }
    %>
    
jsp指令
错误页面
  • web.xml配置

    
    	404
    	/404.jsp
    
    
    
    	500
    	/500.jsp
    
    
  • jsp页面声明

    <%@ page errorPage="404.jsp" %>
    
  • include拼接

    <%--1.会将两个页面合二为一--%>
    <%@ include file="404.jsp"%>
    

    hello

    <%@ include file="500.jsp"%> <%--2.本质还是两个页面--%>

    hello

    >

    总结:第一种写法时,拼接的两个页面都声明了同一个变量,页面就会500错误。第二中书写时就会报错。所以推荐第二种写法

内置对象
  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application[ServletContext] 存东西
  • config[ServletConfig]
  • out
  • page
  • exception
作用域

application>session>request>pageContext

<%
pageContext.setAttribute("name1", "1号",PageContext.SESSION_SCOPE);
//等价于
session.setAttribute("name1", "1号");
%>

jsp标签,jstl标签,el表达式

jsp标签
<%--1.请求转发:坑:jsp:forward里面不要写注释--%>
<%--jsp:param:在请求里放参数--%>

    



<%--javaBean--%>
<%--javaBean--%>


name:
等价于:
User user=new User();
user.setName("jpy");

<%--2.取参--%>
<%--取参--%>
<%= request.getParameter("name")%>
${param.name}

resuqestScope和requst

  • ${requestScope.name} 等价于 request.getAttribute("name")
  • request.getParameter("name")等价于parm.name
jstl标签

弥补html标签的不足,有很多自定义标签,标签功能和java代码一样

  • 核心标签
  • 格式化标签
  • sql标签
  • xml标签
  • jstl函数

如果tomcat中没有jstl和standard包,也需要导入jstl和standard的jar包

<%--引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • if

  • foreach

    <%
        ArrayList nums = new ArrayList();
        nums.add(1);
        nums.add(2);
        nums.add(3);
        request.setAttribute("nums", nums);
    %>
    

MVC概述

架构模式,模型(Model)、视图(View)、控制器(Controller),降低了视图与业务逻辑间的双向偶合

Model
  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)
View
  • 展示数据
  • 提供连接发起Servlet请求(a,form ,img...)
Controller(Servlet)
  • 接收客户请求:(request:请求参数,Session信息...)

  • 交给业务层处理对应的代码

  • 控制视图跳转

    登陆----》接收登陆请求---》Controller处理请求(获取登陆参数)---》业务层处理(判断用户名和密码:事务)---》Dao层(查询用户名和密码是否正确)