JSP-01

只有Servlet能够跟客户端做响应

当访问jsp时候,可以自动的将jsp转换为servlet,将jsp中的html代码全部拷贝出来,自动生成一个servlet

 

 

        既然jsp文件和html文件都能给出前段页面,那么我为什么 还要把html写进jsp,再把jsp转换为servlet资源传给客户端。因为就是想把java代码加进去,因为原生的html代码是无法在里面写java代码的。访问.html没有用,因为不能把java的数据加载进来,只有在jsp中才可以穿插java代码。

        JSP本质上就是一个Servlet,JSP主要负责与用户交互,将最终的界面呈现给用户,HTML+JS+CSS+JAVA的混合文件 
        当服务器接收到一个后缀是JSP的请求时,将该请求交给JSP引擎去处理,每一个JSP页面第一次被访问的时候,JSP引擎会将它翻译成一个servlet文件,再由web容器调用Servlet完成响应。

        单纯从开发角度来看JSP就是在html中嵌入java程序

具体嵌入方式有三种

1.<%   Java代码 %> 

2.<%! Java方法  %>

3.<%=Java变量 %>           //把Java对象直接输出到HTML页面中

Java代码在jsp文件中的不同区域,看似隔断,实际上是一片连续的java代码区域,最终都会放到Servlet的service方法中去 

Jsp-02

 index2.jsp

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: Admin
  Date: 2022/1/4
  Time: 9:41
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index2</title>
    <h1> test index2 path in "http://localhost:port/index2.jsp" </h1>
    <h1> test index3 path in "http://localhost:port/index3.jsp" </h1>
    <h1> test index4 path in "http://localhost:port/index4.jsp" </h1>
</head>
<body>
<h1> test index2 path in "http://localhost:port/index2.jsp" </h1>
<h1> test index3 path in "http://localhost:port/index3.jsp" </h1>
<h1> test index4 path in "http://localhost:port/index4.jsp" </h1>
<HR>
<%
    String str = "hello world";
    System.out.println(str);
    //hello world不会显示在客户端的浏览器中,而是显示在控制台
%>
<%--写进标签中的东西在浏览器页面上才能看到--%>
<h1>hello world!</h1>
<h1>写进标签中的东西在浏览器页面上才能看到</h1>
<h1>System.out.println("hello world")不会显示在客户端的浏览器中,而是显示在控制台</h1>

<HR>
<HR align=center width=300 color=#b92600 SIZE=1>
<h3>声明一个java方法并调用,在控制台输出hello world,System.out.println只能输出到控制台,不能输出到前段页面</h3>
<h3>要想在前端页面展示hello world,需要通过html标签输出</h3>
<%!
    //声明一个Java方法
    public String test() {
        return "测试JSP中的java方法";
    }
%>
<%
    //调用Java方法
    System.out.println(test());
%>


<HR align=center width=300 color=#b92600 SIZE=1>
<h3>老笨办法,一行一行标签敲出来的表格</h3>
<%
    List<String> names = new ArrayList<>();
    names.add("张三");
    names.add("李四");
    names.add("王五");
    List<Integer> ages = new ArrayList<>();
    ages.add(22);
    ages.add(21);
    ages.add(23);
%>
<table border="1">
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <tr>
        <td>
            <%--看!html标签获取java变量来了--%>
            <%=names.get(0)%>
        </td>
        <td>
            <%=ages.get(0)%>>
        </td>
    </tr>
    <tr>
        <td>
            <%=names.get(1)%>
        </td>
        <td>
            <%=ages.get(1)%>>
        </td>
    </tr>
    <tr>
        <td>
            <%=names.get(2)%>
        </td>
        <td>
            <%=ages.get(2)%>>
        </td>
    </tr>
</table>
<HR>

<HR align=center width=300 color=#b92600 SIZE=1>
<h3>通过java代码和html标签混合编程循环遍历输出表格</h3>
<table>
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <%
        for (int i = 0; i < names.size(); i++) {
    %>
    <tr>
        <td>
            <%=names.get(i)%>
        </td>
        <td>
            <%=ages.get(i)%>>
        </td>
    </tr>
    <%
        }
    %>
</table>

</body>
</html>

效果

JSP-03

jsp内置对象9个

request:表示一次请求,和HttpServletRequest同一个类型

response:表示一次响应,和HttpServletResponse同一个类型

pageContext:页面上下文,获取页面信息,该类来自于pageContext,Servlet有上下文ServletContext

session:表示一次会话,保存用户信息,来自于HttpSession类

application: ServletContext的实例,表示当前的web应用,是个全局的对象,保存所有用户的共享信息

config: 表示当前JSP转换完成的对应的Servlet的ServletConfig对象,可以获取当前Servlet的信息

out: JspWriter对象,向客户端浏览器输出数据,也可以用jsp表达式向客户端浏览器输出信息。

page:当前Jsp对应的Servlet对象

exception:表示JSP页面发生异常

常用的是 request、response、session、application、pageContext

request常用方法
1、String getParameter(String key)获取客户端传来的参数。
2、void setAttribute(String key,Object value)通过键值对的形式保存数据。
3、Object getAttribute(String key)通过key取出value。
4、RequestDispatcher getRequestDispatcher(String path)返回一个RequestDispatcher对象该对象的forward方法用于转发请求
5、String[] getParameterValues()获取客户端传来的多个同名参数
6、void setCharacterEncoding(String charset) 指定每个请求的编码

index3.jsp

<%@ page import="java.util.Arrays" %><%--
  Created by IntelliJ IDEA.
  User: Admin
  Date: 2022/1/6
  Time: 14:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index3.jsp</title>
</head>
<body>
<%
    request.setCharacterEncoding("UTF-8");//指定每个请求的编码
    String idStr = request.getParameter("id");
    Integer id = null;
    Integer id2 = null;
    try {
        //这个请求的时候,没有带id参数会可能会导致Integer.parseInt(null)抛出异常
        id = Integer.parseInt(idStr);
    } catch (Exception e) {
        id = null;
    }
    String name = request.getParameter("name");
    String[] names = request.getParameterValues("name");
    String age = request.getParameter("age");
    //----------------------
    out.write("在jsp中 out.write(\"xxxx\") ");
    Class clazz = page.getClass();
    String id1 = (String) pageContext.getAttribute("id");

    //-----------------------
    //将数据存入request中
    try {
        request.setAttribute("id2", id + 2);
    } catch (Exception e) {
        request.setAttribute("id2", null);
    }
    //数据数据转到index4.jsp中,同事页面也跳转到index4.jsp
    //RequestDispatcher requestDispatcher = request.getRequestDispatcher("index4.jsp");
    //requestDispatcher.forward(request,response);
    //-----------------------
%>
<h3>eg: http://localhost:8080/index3.jsp?id=1&name=2&age=3 //常规传参</h3>
<h3>eg: http://localhost:8080/index3.jsp?name=2&name=3&name=4&name=abc&age=3 //不传id也可以</h3>
<h3>eg: http://localhost:8080/index3.jsp?&name=value1&name=value2&name=value3 //同名参数传多值</h3>
<h5>
    您访问的时候所带的参数是:<br/>
    你请求的地址为:http://localhost:8080/index3.jsp?id=<%=id%>&name=<%=name%>&age=<%=age%>
</h5>
<p>---------------------------------------------------------------------</p>
<p>无论请求的时候给的name参数的值有几个,总是第一个值是有效的,这叫做近水楼台先得月</p>
<p>假设:</p>
<p>http://localhost:port/index3.jsp?&name=value1&name=value2&name=value3</p>
<p>此时,name参数的值一直是value1</p>
<p>String name = request.getParameter("name");//value1</p>
<p>如果,我就要一次性给同一个参数传递多个不同的值,某些场景可能需要</p>
<p>String[] names=request.getParameterValues("name");</p>
<br/>
<p>---------------------------------------------------------------------</p>
<p>id参数传来的值:<%=id%>
</p>
<p>id1:<%=id1%>
</p>
<p>id+2:<%=id2%>
</p>
<p>age参数:<%=age%>
</p>
<p>name参数的第一个值,作为默认值:<%=name%>
</p>
<p>name参数的多个值:<%=Arrays.toString(names)%>
</p>
<%=clazz%>
<p>---------------------------------------------------------------------</p>
<p>
    数据数据转到index4.jsp中,同时页面也跳转到index4.jsp    <br/>
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("index4.jsp");<br/>
    requestDispatcher.forward(request, response);<br/>
</p>
</body>
</html>

servlet06.java

@WebServlet("/servlet06")
public class Servlet06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 地址栏发送的请求是get请求
        // http://localhost:8080/servlet06?id=1&name=%E5%BC%A0%E4%B8%89&age=23
        response.getWriter().write("HtteServlet doGet");
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println("http://localhost:port/servlet06?id=" + id + "&name=" + name + "&age=" + Integer.parseInt(age));
        // http://localhost:port/servlet06?id=1&name=寮犱笁&age=23
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //如果想要客户端发送post请求,要么写一个表单发送,要么用postman等工具发送post请求
        response.getWriter().write("HtteServlet doPost");
    }

}

JSP-04

Session

用户会话
        服务器无法识别每一次HTTP请求的出处(不知道来自于哪个终端),它只会接受到一个请求信号,所以就存在一个问题:将用户的响应发送给其他人,必须有一种技术来让服务器知道请求来自哪,这就是会话技术。
        会话:就是客户端和服务器之间发生的一系列连续的请求和响应的过程,打开浏览器进行操作到关闭浏览器的过程。
        会话状态∶指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的一系列请求和响应关联起来。

    实现会话的两种方式:

  • Session
  • Cookie

属于同一次会话的请求都有一个相同的标识符,sessionlD
session常用的方法:
String getld()        获取sessionID
void setMaxInactivelnterval(int interval)        设置session的失效时间,单位为秒
int  getMaxInactivelnterval()        获取当前session的失效时间,默认失效时间 1800s
void invalidate()        设置session立即失效
void setAttribute(String key,Object value)        通过键值对的形式来存储数据,request也可以存储
Object getAttribute(String key)        通过键获取对应的数据
void removeAttribute(String key)        通过键删除对应的数据

a标签触发退出登录,退出登录的逻辑是Servlet08写的,所以“/servlet08”得写一样了

Cookie

创建Cookie 

Cookie cookie = new Cookie( "name" ,"tom");
response. addcookie ( cookie) ;

读取cookie

Cookie[] cookies=request.getCookies();
for (Cookie cookie1 : cookies) {
        //因为out.write只能写String类型的,所以,把cookie toString一下
        int i=1;
        out.write("cookie"+i+" "+cookie1.toString()+":\t"+cookie1.getName()+"="+cookie1.getValue()+"<br/>"); i++;

Cookie常用的方法:
void setMaxAge(int age)        设置Cookie的有效时间,单位为秒
intgetMaxAge()        获取Cookie的有效时间
String getName()        获取Cookie 的name
String getValue()        获取Cookie的value

session:
保存在服务器
保存的数据是Object
会随着会话的结束而销毁
保存重要信息
存储用户信息;
        session: setAttribute("name" ,"admin"")存
        getAttribute(""name"")取

生命周期:
        服务端:只要WEB应用重启就销毁,客户端:只要浏览器关闭就销毁。


cookie:
保存在浏览器
保存的数据是String
可以长期保存在浏览器中,无会话无关
保存不重要信息
典型的应用:biblibili保存你观看的视频进度,下次打开从上次关闭的位置继续观看。
存cookie: response.addCookie(new Cookie(name,"admin")
取cookie:
Cookie[ ] cookies = request.getcookies() ;
for (cookie cookie:cookies){
        if(cookie.getName( ).equals ( "nane" )){
                out.write("欢迎回来"+cookie.getvalue( ) );
         }
}
生命周期:
        不随服务端的重启而销毁,客户端:默认是只要关闭浏览器就销毁,我们通过setMaxAge()方法设置有效期,一旦设置了有效期,则不随浏览器的关闭而销毁,而是由设置的时间来决定。


 

问题:

打开idea的Event Log查看其被占用的端口号,我这里是xxx

打开cmd
netstat -ano|findstr xxx        //获取进程号
taskkill -f -pid yyy                 //杀死进程
 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐