一文入门Java Web

前言

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268