Javaweb _ Jsp

2020-05-11  本文已影响0人  老北瓜

javaweb简介
静态网页与动态网页
静态网页
表现形式:网页中内容是固定,不会更新
技术: Html + CSS

动态网页
表现形式:网页中的内容通过程序动态显示的,自动更新。

技术: Html ,CSS, 数据库, 至少一门高级语言(Java,C#,php), Javascript,XML等。主流的动态网页脚本技术(Jsp / Asp.net / Php) image.png

安装tomcat
...


image.png

/work 可以删除不影响使用

可以手动创建一个jsp动态页面

在 webapps中新建一个项目 image.png image.png

WEB-INF目录结构
1, WEB-INF是java的web应用的安全目录,客户端访问不到,只有服务端可以访问的目录。
2,web.xml,项目部署文件 (配置默认启动页面... )
3,classes文件夹,防止 *.class文件。
4,lib文件夹,存放jar包。

使用idea 创建一个 javaweb项目,详细过程来这
https://www.cnblogs.com/xinruyi/p/9360282.html

项目虚拟路径: 默认的就是项目名。 也可以修改,我就不修改。

Jsp基础语法

Jsp页面元素
    静态内容,注释, 声明,小脚本,表达式,指令。

Jsp指令
   page指令 jsp文件第一行的
   include指令
   taglib指令

Jsp注释

<!-- 这个是html 注释,客户端查看源码可以看见-->

<%--这里是jsp的注释, 客户端查看源码不可见--%>

<% Jsp的脚本注释
// 单行注释
/**
  *  多行注释
  */
在客户端中也看不见
 %>

Jsp脚本
在JSP页面中执行的java代码。
<% java代码 %>

Jsp声明
在Jsp页面中定义变量或者方法。
<%! java 代码 %>

Jsp表达式
在Jsp页面中执行的表达式
<%= 表达式+ %>

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
<h1>这是我的第一个 jsp 页面</h1>

<!-- 这个是html 注释,客户端查看源码可以看见-->

<%--这里是jsp的注释, 客户端查看源码不可见--%>

<%-- Jsp声明  --%>
<%!
    String s = "小明";

    int add(int x, int y) {
        return x + y;
    }
%>

<%-- Jsp 脚本 --%>
<%
    out.print("这里是Jsp的脚本");
%>
<br>

<%-- Jsp表达式 --%>
你好哇,<%= s %>
<br>
3+7 = <%= add(3, 7) %>
</body>
</html>

Jsp页面声明周期

image.png
JspService()方法被调用来处理客户端的请求。对于每一个请求,Jsp引擎创建一个新的线程来处理该请求。如果多个同时请求Jsp文件,就创建多个线程,对应每个客户端。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。多线程也会带来同步问题,由于该Servlet一直在内存,响应很快。
每次请求都会Jsp重新编译字节码文件。

使用 Jsp 声明 和 Jsp表达式生成一个九九乘法表

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>

<h1>九九乘法表</h1>
<hr>
<%-- Jsp 声明 一个方法--%>
<%!
    String result = "";
    String exec() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                result += i + " * " + j + " = " + (i * j) + "&nbsp; &nbsp; &nbsp; &nbsp;";
            }
            result += "<br>";
        }
        return result;
    }
%>
<%= exec() %>

</body>
</html>

Jsp内置对象 image.png

客户端向web服务器发送 request,
web服务器向客户端发response.

request对象
客户端的请求信息被封装在request对象中,通过它才能了解客户的需求,然后做出响应,在完成客户端的请求之前,该对象一直有效。

request传递参数

<%--
  Created by IntelliJ IDEA.
  User: admin
  Date: 2020/5/8
  Time: 17:48
  To change this template use File | Settings | File Templates.
--%>

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

<form action="reg.jsp" method="post">
    <table>
        <tr>
            <td>名字</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>爱好</td>
            <td>
                <input type="checkbox" value="read" name="favorite">读书
                <input type="checkbox" value="movie" name="favorite">电影
                <input type="checkbox" value="sport" name="favorite">运动
            </td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
<br>
<br>

<%-- 通过 URL 传递参数  --%>
<a href="reg.jsp?username=李四">通过URL传递参数</a>

</body>
</html>

reg.jsp文件

<%-- 解决中文乱码问题,要跟传递参数的 requests.jsp 页面中的编码一致。--%>
<% request.setCharacterEncoding("UTF-8");%>

用户名:<%= request.getParameter("username") %>
<br>
爱好: <%
    if (request.getParameterValues("favorite") != null) {
        String[] favorites = request.getParameterValues("favorite");
        if (favorites.length != 0) {
            for (int i = 0; i < favorites.length; i++) {
                out.println(favorites[i]);
            }
        }
    }
%>

如果request传递参数过程中出现中文乱码问题。是因为前后台编码不统一,可以修改 tomcat/conf/server.xml 标签 加入

<Connector ......... URIEncoding="UTF-8"/>

request对象常用的方法:

请求体的MIME类型:   <%= request.getContentType()  %>
协议类型及版本号:   <%= request.getProtocol() %>
服务器主机名:       <%= request.getServerName() %>
服务器端口号:       <%= request.getServerPort() %>
请求文件的长度:      <%= request.getContentLength() %>
请求客户端的IP地址: <%= request.getRemoteAddr()%>
请求的真实路径:     <%= request.getRealPath("requests.jsp") %>
请求的上下文路径:   <%= request.getContextPath() %>

response对象
response对象包含了响应客户请求的有关信息,在Jsp中很少使用到它。有作用于,访问一个页面时,response对象只能对这次访问有效。
常用方法:

<%
    response.setContentType("text/html;charset=utf-8"); // 设置响应的MIME类型

    out.println("<h1>response内置对象</h1>");
    out.println("<hr>");
    out.flush();

    PrintWriter writer = response.getWriter();
    writer.println("这个是response对象生成的输出流outer对象");

    response.sendRedirect("reg.jsp");   // 请求重定向
%>

请求重定向 :
   客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会变保存,地址栏的url会改变。

请求转发:
   服务器行为, request.getRequestDispatcher(“xx.jsp”).forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的url不会改变。

缓冲区
Buffer,就是内存的一块区域用来保存临时数据。

out对象
out对象是JspWriter类的实例,事项客户端输出内容常用的对象。
常用方法

void println() :   向客户端打印字符串
void clear():    清除缓冲区内容, 如果在 flush()之后调用会抛出异常。
void clearBuffer():   清除缓冲区内容。
void flush():    将缓冲区内容输出到客户端
int getBufferSize():    返回缓冲区字节数大小,如不设置缓冲区 = 0;
int getRemaining() :   返回缓冲区还剩下多少
boolean isAutoFlush():   返回缓冲区满时,是自动清空还是抛出异常。
void close():   关闭输出流。

get 与 post区别
表单的两种提交方式 , get 与 post
1, get 以明文的方式通过url 提交数据,数据在 url 中可以看到,安全性脚底,效率高,适合提交数量不大,安全性不高的数据 , 如 搜索, 查询等。
2,post:将用户提交的信息封装在HTML Header内,适合提交数据量大,安全性高的用户信息, 如 注册,上传等。
分别使用 get 和 post 请求方式简单模拟登录过程

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>

<h1>登录</h1>

<form action="login.jsp" method="get">
    <table>
        <tr>
            <td>用户名</td>
            <td>
                <input type="text" name="username">
            </td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>
</body>
</html>
image.png

如果使用post 就不会出现用户名和密码的明文。

session

在服务器的内存中保存着不同用户的session.
1,session表示客户端与服务器的一次会话
2,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
3,从上述定义中可以看到,session实际上是一个特定的时间概念。

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

</head>
<body>
<h1> Jsp内置 Session对象</h1>
<hr>

<%

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日-HH:mm:ss");
//    设置 Session 创建时间
    Date date = new Date(session.getCreationTime());
    session.setAttribute("name", "张三");
    session.setAttribute("age", "21");
    session.setAttribute("sex", "男");

    session.setMaxInactiveInterval(10);  // 设置session会话有效期 10 秒钟
%>

创建 Session的时间 是 <%= sdf.format(date)%> <br>
Session 的id 是 <%= session.getId()%> <br>
Session 中的user 是 <%= session.getAttribute("name")%> <br>

<a href="session_page2.jsp" target="_blank">跳转到Session_Page2页面</a>
</body>
</html>

jsp2

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

    Session的id :  <%=  session.getId() %> <br>

    <%-- 当 session 过期之后, 获取到的 SessionId 为新值,一干属性也为 null--%>
    作为参数传递的session 包含  <%
    String[] names = session.getValueNames();
    for (int i = 0; i < names.length; i++) {
        out.print(names[i] + "&nbsp; &nbsp;");
    }
%>
</head>
<body>

</body>
</html>

session的生命周期

创建 : 当客户端第一次访问jsp时, 服务器会创建一个sessionid,每次客户端访问服务器时都会携带这个sessionId,服务器会对这个SessionId进行校验。

活动: 通过超链接打开新的页页面属于同一会话;当前页面没有全部关闭,打开新的窗口访问同一项目属于同一会话;如果全部关闭重新访问会产生新的会话,原有的会话依然存在于服务端,只是不会再被使用。

销毁 1, session.invalidate()方法 ; 2, session超时 ; 3, 服务器重启。

application对象

application 对象实现了用户间数据的共享,可存放全局变量。
application开始于服务器的启动,终止与服务器的关闭。
在不同时间或不同用户之间的连接中,可以对application的同一属性进行修改。
常用方法 :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Application内置对象</title>
</head>
<body>

<%
    application.setAttribute("city", "北京");
    application.setAttribute("postCode", "10000");

%>
application 设置的 city = <%= application.getAttribute("city") %> <br>
application 设置的 属性都有 <%
    Enumeration<String> attr = application.getAttributeNames();

    while (attr.hasMoreElements()) {
        out.print(attr.nextElement() + "&nbsp;&nbsp;");
    }
%>  <br>

JSP的引擎保本 <%= application.getServerInfo() %>
</body>
</html>

page对象

类似 Object

pageContext内置对象
pageCountext 对象体用了对JSP页面内所有的对象及名字空间的访问
pageContext对象可以访问到本页所在的session,也可以取本页面所载的application的某一属性值
pageContext相当于页面中所有功能的集大成者。
常用方法:

<body>

<h1>pageContext常用方法:</h1>

通过 pageContext 获取 Session  <%= pageContext.getSession().getId() %> <br>

跳转页面 forward: <%
    /* 跳转到新页面之后,地址栏上的地址不会发生变化   */
    pageContext.forward("../login.jsp");
%>

include的使用: <%
    pageContext.include("include.jsp");
%>
</body>

Config对象
config对象是在一个Servlet初始化时,Jsp引擎向他传递信息用的,包含Servlet初始化时需要用的参数以及服务器的有关信息。

常用方法:<br>
 <%
     /* 返回含有服务器相关信息的ServletContext对象*/
     ServletContext servletContext = config.getServletContext();

     /* 返回初始化参数的值*/
     config.getInitParameter(String name) ;

     /* 返回 Servlet初始化所需所有参数的枚举*/
     Enumeration<String> initParameterNames = config.getInitParameterNames();
 %>

Exception对象
测试异常类 , 需要在 顶部 天津爱 errorPage = "xxxx.jsp",表示要处理异常的类。

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="Exception.jsp" %>
<html>
<head>
    <title>异常测试类</title>
</head>
<body>
<%
    System.out.println(100 / 0);   // 产生异常 ,一个算数异常
%>
</body>
</html>

处理异常类: 需要注意在顶部添加 isErrotPage =“true”,表示为处理异常的类。

<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>
<html>
<head>
    <title>Exception内置对象</title>
</head>
<body>

<h1>Exception内置对象</h1>

打印异常信息 :<%= exception.getMessage() %> <br>

异常的完成信息 <%= exception.toString()%>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读