一文入门Java Web

2020-08-29  本文已影响0人  CSeroad

前言

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页面相关的属性。
常用的是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

上一篇下一篇

猜你喜欢

热点阅读