美文网首页
一文入门Java Web

一文入门Java Web

作者: CSeroad | 来源:发表于2020-08-29 15:35 被阅读0次

    前言

    Java Web属于JAVAEE 方向,一般为服务器端的程序应用。指使用java语言对web进行开发,而jsp服务于Java Web开发。

    简介

    JSP全称Java Server Pages,是一种动态网页开发的标准。当浏览器访问一个jsp页面时,jsp引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,再由Servlet引擎加载编译后的代码并执行,把执行结果返回给客户端。

    第一个Java Web 应用程序

    使用eclipse创建项目,编写第一个java web应用程序。

    image.png
    WebContent 为web应用程序的根目录
    WEB-INF    存放java包和驱动
    META-INF   用来配置应用程序、扩展程序等等
    

    访问该页面

    image.png

    JSP语法

    jsp声明

    在jsp页面声明变量和方法

    <%! java代码 %>
    

    jsp表达式

    在jsp页面执行的表达式

    <%= 表达式 %>
    

    注:表达式不以分号为结束

    jsp注释

    JSP是嵌入在HTML语言中,同样可以使用HTML注释

    <!-- this is body-->
    

    右击源代码可显示内容,完全暴露给用户。

    <%-- 
    this is jsp comments
    --%>
    

    查看源代码并不会显示。
    JSP程序段中的注释

    <%
    //this is comments
    /*this is comments*/
    %>
    

    查看源代码也不会显示,同样适用。

    jsp生命周期

    jsp生命周期大概需要以下阶段

    • 编译阶段
      当浏览器请求jsp页面时,jsp引擎首先会编译这个文件。而编译这个文件需要解析jsp文件、将jsp转化为servlet、编译servlet。
    • 初始化阶段
      载入jsp文件后,在请求之前调用jspInit()方法进行初始化。
    • 执行阶段
      当jsp页面完成初始化后,jsp引擎会调用_jspService()方法。然后和请求行为进行交互。
    • 销毁阶段
      当jsp页面从容器移除,调用jspDestroy()方法进行销毁。

    JSP指令

    jsp指令用来设置jsp页面相关的属性。
    常用的是page指令、include指令、taglib指令。

    page指令

    主要用来定义JSP当前的全局属性,位于页面的最上方。

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    

    常见属性有:

    language 属性,指定jsp页面使用的脚本语言;
    contentType 属性,指定jsp页面的编码格式,默认ISO8859编码格式,建议UTF-8编码;
    import 属性,设置默认导入的java类;
    pageEncoding 属性,jsp文件本身的编码;
    

    include指令

    将外部文件嵌入到当前jsp语句中,这个web文件可以是jsp文件、html文件。同时解析页面的jsp语句。

    <%@ include file="header.html" %>
    <%@ include file="footer.jsp" %>
    

    JSP动作元素

    动作元素在请求处理的时候起作用,用XML语法编写。

    forward元素

    把请求转发到一个新的页面。

    <jsp:forward page="login.jsp"></jsp:forward>
    

    等同于

    request.getRequestDispatcher("login.jsp").forward(request,response);
    

    注意forward指令下面的内容不会输出。
    举例登录页面,访问index.jsp将调转到login.jsp页面。
    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    
    <jsp:forward page="login.jsp">
    <jsp:param value="cseroad" name="username"/>
    <jsp:param value="cserpad-password" name="password"/>
    </jsp:forward>
    

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>login</title>
    </head>
    <body>
    <% 
    String userName = request.getParameter("username");
    String passWord = request.getParameter("password");
    out.println("用户名:"+userName);
    out.println("<br/>");
    out.println("密码:"+passWord);
    %>
    </body>
    </html>
    

    login.jsp接收到username、password参数

    image.png

    include元素

    包含静态和动态文件。
    语法格式

    <jsp:include page="URL" flush="true|false"></jsp:include>
    

    flush 表示是否从缓冲区读取。默认为false。

    举例,传递bgcoloe颜色参数到body.jsp

    <jsp:include page="body.jsp">
        <jsp:param value="green" name="bgcolor"/>
    </jsp:include>
    

    body.jsp

    <body bgcolor="<%= request.getParameter("bgcolor") %>">
    hello
    </body>
    

    bgcolor参数通过指令传递了进来。

    image.png

    附加
    include 指令是包含页面的源代码,转化为一个servlet
    include 动作是包含的页面的输出结果,主页面和被包含页面是两个独立的servelet。

    useBean元素

    用来在jsp页面中实例化或指定范围内使用javabean:

    <jsp:useBean id="标示符" class="java类名" scope="作用范围" />
    

    需要首先在src目录创建包名。

    image.png

    这里创建com.po包,Users类
    Users.java

    package com.po;
    
    public class Users {
        private String username;
        private String password;
        
        //保留默认的构造方法
        public Users() {
            
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    再在useBean元素的class属性指定包名。
    bean.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>useBean动作创建javaBean</title>
    </head>
    <body>
    <jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
    用户名:<%=myUsers.getUsername() %>
    密码:<%=myUsers.getPassword() %>
    </body>
    </html>
    

    因为用户名、密码没有进行初始化,所以为null。

    image.png

    setProperty元素

    给实例化的JavaBean对象的属性赋值。
    可以通过表单赋值也可以通过手工设置。
    这里以手工设置用户名、密码,还是上面的实例:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>useBean动作创建javaBean</title>
    </head>
    <body>
    <jsp:useBean id="myUsers" class="com.po.Users" scope="page"></jsp:useBean>
    <jsp:setProperty property="username" name="myUsers" value="cseroad"/>
    <jsp:setProperty property="password" name="myUsers" value="123456"/>
    用户名:<%=myUsers.getUsername() %>
    密码:<%=myUsers.getPassword() %>
    </body>
    </html>
    
    image.png

    JSP九大隐式内置对象

    Out对象

    out对象是JspWriter类的实例,是向客户端打印字符串。

    <%
    out.println("hello");
    out.print("world");
    out.newLine();
    %>
    

    println和print都会输出一个换行符,但需要查看源代码才可以看得到。
    也可以对输出缓冲区进行管理。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <%
    out.println("获取当前缓冲区" + out.getBufferSize());
    out.println("<br/>");
    out.println("当前缓冲区剩余字节数目" + out.getRemaining());
    %>
    
    image.png
    out.flush() 强制刷新缓冲区的数据
    out.clearBuffer() 清空缓冲区数据
    out.isAutoFlush()  是否自动清除缓冲区
    

    request对象

    request对象用来完成客户端的请求,是HttpServletRequest类的实例。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>request 对象实例</title>
    </head>
    <body>
    <form action="" method="post">
    <input type="text" name="userName">
    <input type="submit" name="提交">
    </form>
    请求方法名:<%= request.getMethod() %><br/>
    请求的资源:<%= request.getRequestURI() %><br/>
    请求使用的协议:<%= request.getProtocol() %><br/>
    请求的服务器IP:<%= request.getServerName() %><br/>
    请求的服务器端口:<%= request.getServerPort() %><br/>
    客户端的IP地址:<%= request.getRemoteAddr() %><br/>
    客户端的主机名:<%= request.getRemoteHost() %><br/>
    请求的真实路径:<%= request.getRealPath("welcome.jsp") %><br/>
    表单提交数据:<%= request.getParameter("userName") %>
    </body>
    </html>
    
    image.png

    以用户注册功能,访问注册页面,提交到do_register.jsp页面,并跳转到welcome.jsp欢迎页面。
    register.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>录入表单信息</title>
    </head>
    <body>
    <form action="do_register.jsp" method="post">
    用户名:<input name="userName" type="text"><br/>
    技能:
    <input type="checkbox" name="skills" value="java">java
    <input type="checkbox" name="skills" value="php">php
    <input type="checkbox" name="skills" value="python">python
    <input type="checkbox" name="skills" value="golang">golang
    <br/>
    <input type="submit" value="提交"/>
    <input type="reset" value="重置">
    </form>
    </body>
    </html>
    

    do_register.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
        
    <%
    String  userName = request.getParameter("userName");
    String skills = "";
    String[] skillArr = request.getParameterValues("skills");
    if(skillArr != null && skillArr.length > 0){
        for(int i=0;i<skillArr.length;i++){
            out.println(skillArr[i]+"<br/>");
            skills = skills + skillArr[i] + "";
        }
    }
    
    request.setAttribute("userName",userName);
    request.setAttribute("skills",skills);
    %>
    <jsp:forward page="welcome.jsp"></jsp:forward>
    

    welcome.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>welcome user </title>
    </head>
    <body>
    信息展示页面<br/>
    用户名:<%= request.getAttribute("userName") %><br/>
    技能:<%= request.getAttribute("skills") %>
    </body>
    </html>
    
    image.png image.png

    重点关注

    getParameter()  返回指定的参数值
    getParameterValues()  返回指定参数值的数组
    setAttribute() 存储请求中的属性
    getAttribute() 返回指定属性的属性值
    

    response对象

    response对象是javax.servlet.http.HttpServletResponse类的实例。

    <%
    response.setHeader("Cache-Control","no-cache");//不缓存
    response.sendRedirect("http://www.baidu.com"); //请求重定向,跳转至百度
    response.setIntHeader("Refresh",2);
    out.println("data is "+ new java.util.Date().toString()+"<br/>" );//每个两秒自动刷新一次
    %>
    

    设置Cookie相关属性

    <%
    Cookie myCookie = new Cookie("cseroad","cseroad-password");
    myCookie.setMaxAge(3600);
    response.addCookie(myCookie);
    %>
    

    访问

    image.png

    session对象

    session是一个时间概念,session对象在第一个jsp页面被装载时自动完成,完成会话管理。
    只有当所有页面都关闭的时候,所有会话才都会被关闭。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>session实例</title>
    </head>
    <body>
    
    session的唯一标识符:<%= session.getId() %><br/>
    session创建时间:<%= new java.util.Date(session.getCreationTime()).toString()%><br/>
    session最后的修改时间:<%= new java.util.Date(session.getLastAccessedTime()).toString() %><br/>
    session的失效时间:<%= session.getMaxInactiveInterval() %><br/>
    </body>
    </html>
    
    image.png

    可以在WEB-INF的web.xml文件中修改session会话时间。

    <session-config>
    <session-timeout>10</session-timeout>
    </session-config>
    

    举个例子:
    login.jsp登录页面,登录do_login.jsp在session中保存username,然后跳转到welcome.jsp欢迎用户页面。再超链接到注销logout.jsp页面。
    代码如下:
    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>登陆表单</title>
    </head>
    <body>
    <form action="do_login.jsp" method="post">
    userName:<input name="userName" type="text"><br/>
    passWord:<input name="passWord" type="password"><br/>
    <input type="submit" value="提交"/>
    <input type="reset" value="重置">
    </form>
    </body>
    </html>
    

    do_login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    
    <%
        String userName = request.getParameter("userName");
        String passWord = request.getParameter("passWord");
        if(userName != null && passWord != null){
            session.setAttribute("userName",userName);//在session中保存userName
            response.setHeader("refresh","2;URL=welcome.jsp");
        }
    
    %>
    

    welcome.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>欢迎页面 </title>
    </head>
    <body>
        <% if(session.getAttribute("userName") != null ){ %>
        欢迎<%= session.getAttribute("userName")%>
        <!-- //获取session的userName的value值  -->
        <a href="logout.jsp">注销</a>
        <br/>
        <%} else{ %>
        请先登录
        <a href="login.jsp">登录</a>
        <%} %>
        <% if(session.isNew()){ %>
        <br/>
        欢迎新用户
        <%}else{ %>
        欢迎老用户
        <%} %>
    </body>
    </html>
    

    logout.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <%
        session.invalidate();
        response.setHeader("refresh", "2;URL=welcome.jsp");
    %>
    

    以上代码用到的主要方法有

    getAttribute() 返回与会话中指定名称绑定在一起的对象 
    setAttribute() 使用指定名称将对象绑定到会话
    getValueNames() 返回一个包含此SESSION种可用属性的数组,可以理解为表单提交的数组
    

    application对象

    application对象实现了用户间数据的共享,可存放全局变量。
    开始于服务器启动,终止与服务器关闭。

    服务器信息:<%= application.getServerInfo()%><br/>
    应用名称:<%= application.getServletContextName()%><br/>
    
    image.png

    举个例子统计页面访问计数器:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        Object obj = application.getAttribute("counter");
        if(obj == null){
            application.setAttribute("counter", new Integer(1));
            out.println("该页面被访问1次<br/>");
        }else{
            int counterValue = Integer.parseInt(obj.toString());
            counterValue++;
            out.println("该页面被访问了"+counterValue+"次<br/>");
            application.setAttribute("counter", counterValue);
        }
    %>
    </body>
    </html>
    

    config对象

    config 对象是在一个Servlet初始化时,JSP引擎向他传递信息用的。
    在web.xml中添加内容

      <servlet>
        <servlet-name>config</servlet-name>
        <jsp-file>/01/config.jsp</jsp-file>
        <init-param>
            <param-name>username</param-name>
            <param-value>cseroad</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
      </servlet>
      
      
      <servlet-mapping>
        <servlet-name>config</servlet-name>
        <url-pattern>/01/*</url-pattern>
      </servlet-mapping>
    

    config.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>config对象实例</title>
    </head>
    <body>
    用户名:<%= config.getInitParameter("username") %><br/>
    密码:<%= config.getInitParameter("password") %><br/>
    </body>
    </html>
    

    访问config.jsp,可以获取到用户名、密码。

    image.png

    exception对象

    当页面产生异常,就会有exception对象。如果jsp页面要使用该对象,必须设置 isErrorPage为true,否则无法编译。
    设置除数为零的异常。访问index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page errorPage="throw_error.jsp" %>
    
    
    <%
    int a = 1/0;
    %>
    
    

    跳转到throw_error.jsp捕捉异常文件

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page isErrorPage="true" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>异常处理</title>
    </head>
    <body>
    异常描述信息
    
    <%
    out.println(exception.getMessage());
    %>
    <br/>
    exception对象的字符串描述
    <%
    out.println(exception.toString());
    %>
    </body>
    </html>
    
    image.png

    page对象

    page对象指当前jsp页面本身,像类的this指针,是java.lang.Object类的实例。
    和Object类的方法相同。

    当前page页面对象的字符串描述:<%=page.toString()%>
    

    访问:

    image.png

    查看Catalina文件可获取到该文件编译后的class类。

    image.png

    pageContent对象

    pageContent 对象提供了对jsp页面所有对象和空间的访问。也可以访问本页面的session。
    通过pageContent对象输出hello world。

    <%
        JspWriter myOut = pageContext.getOut();
        myOut.println("hello world");
        
    %>
    

    通过pageContent对象设置username属性保存到session,并输出。

    <%
        pageContext.setAttribute("username", "cseroad",pageContext.SESSION_SCOPE);
        
        String value = session.getAttribute("username").toString();
        out.println(value);
        
    %>
    
    image.png

    四个域对象

    pageContext

    仅作用于当前jsp页面

    request

    仅作用于同一个请求,主要用于请求转发

    session

    仅作用于一次会话,在servlet中可以通过request对象获取

    application

    作用于整个web应用

    参考资料

    https://ke.jikexueyuan.com/zhiye/javaweb/
    https://www.imooc.com/video/3955

    相关文章

      网友评论

          本文标题:一文入门Java Web

          本文链接:https://www.haomeiwen.com/subject/phwgjktx.html