JSP学习笔记

这篇博客详细介绍了JSP的基础语法,包括注释、Scriptlet、page指令的使用,如contentType、pageEncoding、errorPage等。同时,讲解了JSP的包含指令、跳转以及如何实现用户登录程序。此外,还探讨了JSP内置对象如request、response、session和application的使用方法,以及JavaBean的基本要求、在JSP中的应用和属性操作。内容涵盖Web安全性、config对象、out对象和pageContext对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSP基础语法

1.1 JSP注释

  • 显式注释语法:
<!--注释内容-->
  • 隐式注释语法:
<%
    //单行注释
    /*多行注释*/
%>

隐式注释客户端无法看见

1.2 Scriptlet(脚本小程序)

  1. <%%>:主要用于定义局部变量、编写语句

  2. <%!%>:主要用于定义全局变量、方法、类,不能出现其他语句
    尽量不要在JSP中定义类和方法

  3. <%=%>:表达式输出

<%
    String info = "www.baidu.com";
%>
<h1>website=<%=info%></h1>

1.3 scriptlet标签

scriptlet标签使用效果和<%%>一样

<jsp:scriptlet>
    String url="www.baidu.com";
</jsp:scriptlet>
<h2><%=url%></h2>

1.4 page常用指令

1. contentType设置MIME

MIME表示打开文件的应用程序类型,
page指令中,contentType可以指定文件的显示方式
例如:

<%@ page language="java" contengType="text/html;charset=GBK"%>
<%@ page language="java" contengType="application/word;charset=GBK"%>

2. pageEncoding设置文件编码

charset是指服务器发送给客户端的内容编码,pageEncoding指的是JSP文件本身的编码。如果pageEncoding存在,那么JSP编码由pageEncoding决定,否则由charset决定,如果两个属性都不存在,则默认为ISO-8859-1
例如:

<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>

一般一个JSP页面只需要按照网页显示(text/html),则使用pageEncoding设置编码即可。

3. errorPage错误页的设置

错误页设置两步骤:
1. errorPage属性指定错误出现时的跳转页;
2. isErrorPage属性指定错误页标识

例如:
错误页中:

<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@page errorPage="error.jsp"%><!--一出现错误即跳转到错误处理页-->

错误处理页中:

<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@ page isErrorPage="true"%><!--表示该页面用于处理错误-->

错误页跳转输入服务器端跳转

可以修改Web.xml文件,实现在虚拟目录指定全局的错误处理

<error-page>
    <error-code>500</error-code>
    <location>/ch05/error.jsp</location>
</error-page>

依然服务器端跳转

4. 数据库连接操作

在page指令中可以使用import导入所需要的java开发包,导入java.sql包,进行数据库开发。
配置数据库的驱动程序,将mysql的驱动程序mysql-connector-java-5.0…复制到tomcat6.0\lib目录中,并重启服务器

例如:使用JSP列出emp表数据

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
    <head><title>www.bruce.com</title></head>
    <body>
        <%!
            //定义数据库驱动程序
            public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
            public static final String DBURL = "jdbc:mysql://localhost:3306/mldn";
            public static final String DBUSER = "root";
            public static final String DBPASS = "mysqladmin";
        %>
        <%
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
        %>
        <%
            try{
                Class.forName(DBDRIVER);
                conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
                String sql = "SELECT empno,ename,job,sal,hiredate FROM emp";
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery();
        %>
        <center>
            <table border="1" width="80%">
                <tr>
                    <td>雇员编号</td>
                    <td>雇员姓名</td>
                    <td>雇员工作</td>
                    <td>雇员工资</td>
                    <td>雇员日期</td>
                </tr>
                <%
                    while(rs.next()){
                        int empno = rs.getInt(1);
                        String ename = rs.getString(2);
                        String job = rs.getString(3);
                        float sal = rs.getFloat(4);
                        java.util.Date date = rs.getDate(5);
                %>
                    <tr>
                    <td><%=empno%></td>
                    <td><%=ename%></td>
                    <td><%=job%></td>
                    <td><%=sal%></td>
                    <td><%=date%></td>
                </tr>
                <%
                    }
                %>
            </table>
        </center>
        <%
            }catch(Exception e){
                e.printStack();
            }finally{
                rs.close();
                pstmt.close();
                conn.close();
            }
        %>
    </body>
</html>

1.5 包含指令

1.5.1 静态包含

语法:<%@ include file = "要包含的文件路径"%>

包含的文件可以是JSP,HTML,文本,或者是一段Java程序。包含操作实际上是将被导入的文件内容导入,一起进行编译,最后再将一份整体的内容展现给用户
例如:

<body>
<%@include file="info.html"%>
</body>

1.5.2 动态包含

语法:
1. 不传递参数:
<jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false"/>

  1. 传递参数:
<jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false">
    <jsp:param name="参数名" value="参数内容"/>
    //可以传递多个参数
</jsp:include>

例如:
包含页:include_demo.jsp

<jsp:include page="receive_param.jsp">
    <jsp:param name="name" value="<%=username>">
    <jsp:param name="info" value="Bruce">
</jsp:include>

被包含页:receive_param.jsp

<%@ page contentType="text/html" pageEncoding="GBK"%>
<h1>参数1:<%=request.getParameter("name")%></h1>
<h1>参数2:<%=request.getParameter("info")%></h1>

false表示完全被读进来再输出,true表示buffer满了就输出,一般都设置为true,默认为true
动态包含是先处理再输出

1.6 跳转指令

语法:
1. 不传递参数:
<jsp:forward page="{要包含的文件路径\<%=表达式%>}"/>
2. 传递参数:

<jsp:forward page="{要包含的文件路径\<%=表达式%>}">
    <jsp:param name="" value=""/>
    //可以传递多个参数
</jsp:forward>

上述跳转属于服务器端跳转

1.7 实例操作:JSP+JDBC实现用户登录程序

JSP内置对象

2.1 九大内置对象

内置对象类型描述
pageContext
request
response
session
application
config
out
page
exception

2.2 四种属性范围

属性名属性范围
page只在一个页面中保存属性
request一次请求中保存属性,服务器跳转后仍有效
session一次会话范围中保存,任何跳转都有效,重新打开浏览器无效
application整个服务器保存,所有用户都可以使用

4个内置对象都支持以下操作方法:

public void setAttribute(String name,Object o)
public Object getAttribute(String name)
public void removeAttribute(String name)

2.2.1 page属性范围(pageContext)

2.2.2 request属性范围

2.2.3 session属性范围

2.2.4 application属性范围

2.2.5 page属性范围的更改方法

可以使用如下的方法修改page属性范围:
public void setAttribute(String name,int scope)

2.3request对象

request对象主要作用是接收客户端发送来的请求,是javax.servlet.http.HttpServletRequest接口的实例化对象

常用方法描述
public String getParameter(String name)接收请求参数
public String[] getParameterValues(String name)接收一组请求参数
public Enumeration getParameterNames()取得请求参数名
public String getRemoteAddr()取得客户端IP地址
void setCharacterEncoding(String env)throws UnsupportedEncodingException设置统一的请求编码
public boolean isUserInRole(String role)用户身份认证
public Httpsession getSession()取得当前的session对象
pubic StringBuffer getRequestURL()返回正在请求的路径
pubic Enumeration getHeaderNames()取得全部头信息的名称
pubic Enumeration getHeader(String name)根据名称取得头信息的内容
public String getMethod()取得用户的提交方式(get/post)
public String getServletPath()取得访问的路径
public String getContextPath()取得上下文资源路径

2.3.1 解决乱码

例如:

<body>
<%
    request.setCharacterEncoding("GBK");
%>
</body>

浏览器默认的是UTF-8
现阶段每一个JSP页面都写上编码设置

2.3.2 接收请求参数

参数传递有post和get方式两种

2.3.3 显示全部头信息

例如:

<%@ page contextType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>取得头信息的名称和内容</title></head>
<body>
    <%
        Enumeration enu = request.getHeaderNames();
        while(enu.hasMoreElements()){
            String headerName = (String)enu.nextElement();
            String headerValue = request.getHeader(headerName);     
    %>
    <h5><%=headerName%>--><%=headerValue%></h5>
    <%
        }
    %>
</body>
</html>

2.3.4 角色验证

增加新用户需要修改conf/tomcat-user.xml文件,
例如:

<user username="10202357" password="Tu86511620" roles="admin" />

用户的角色会自动创建
配置完之后还需要配置web.xml文件,在web.xml文件中加入对某一资源的验证操作

2.3.5 其他操作

例如:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>获得IP\访问路径\提交方式</title>
</head>
<body>
    <%
        String method = request.getMethod();
        String ip = request.getRemoteAddr();
        String path = request.getServletPath();
        String contextPath = request.getContextPath();
    %>
    <h3>
        请求方式:<%=method%></h3>
    <h3>
        IP地址:<%=ip%></h3>
    <h3>
        访问路径:<%=path%></h3>
    <h3>
        上下文名称:<%=contextPath%></h3>
</body>
</html>

request内置对象在实际开发中使用最多,当服务器端需要得到客户端的相关信息时就会用到request对象完成

2.4 response对象

response对象的主要作用是对客户端请求的响应,是javax.servlet.http.HttpServletResponse接口的实例

常用方法描述
public void addCookie(Cookie cookie)给客户端增加Cookie
public void setHeader(String name,String value)设置回应的头信息
public void sendRedirect(String location)throws IOException页面跳转

2.4.1 设置头信息

例如:
设置自动刷新:

<%
    reponse.setHeader("refresh","2")
%>

定时跳转:

<%
    reponse.setHeader("refresh","2"URL="hello.html")
%>

定时跳转(JSP\HTML方式)都属于客户端跳转

使用HTML完成跳转功能:

<html>
<head>
    <title>测试html页面的跳转</title>
    <META HTTP-EQUIV="refresh" CONTENT="3;URL=hello.html">
</head>
<body>
    <h3>
        3秒后跳转到hello.html页面,如果没有跳转请按<a href="hello.html">这里</a>!
    </h3>
</body>
</html>

当一个页面中没有JSP代码又想执行定时跳转的时候才使用HTML形式的设置跳转头信息

2.4.2 页面跳转

例如:

<%
    response.sendRedirect("01.html");
%>

<jsp:forward>不同,response属于客户端跳转,要在整个页面执行完以后才执行跳转。
<jsp:forward>可以方便地进行参数传递,而且服务器端跳转要比客户端跳转更常用

2.4.3 操作cookie

Cookie的常用方法描述
public Cookie(String name,String value)
public String getName()
public String getValue()
public void setMaxAge(int expiry)

Cookie是服务器给客户端增加的,所以使用reponse对象
例如:

<%
    Cookie c1 = new Cookie("Tu","Bruce");
    c1.setMaxAge(60);//Cookie保存60秒
    response.addCoolie(c1);//向客户端增加Cookie
%>

例如:取出Cookie

<%
    Cookie c[] = request.getCookies();
    for(int x = 0; x < c.length; x++){
%>
    <h3><%=c[x].getName()%>--><%=c[x].getValue()%></h3>
<%
    }
%>      

2.5 session对象

在开发中session对象最主要的用处是完成用户的登录、注销等常见功能。

常用方法描述
public String getId()取得Session Id
public long getCreationTime()取得Session的创建时间
public long getLastAccessedTime()取得Session的最后一次操作时间
public boolean isNew()判断是否是新的Session
public void invalidate()让Session失效
public Enumeration getAttributeNames()得到全部属性的名称

2.5.1 取得Session Id

例如:

<%
    String id = session.getId();
%>
<h3>
    session id:<%=id%>
</h3>

服务器重启,session id一般就会消失。tomcat可以通过配置server.xml文件加入保存session操作

2.5.2 登录与注销

实例:
编写表单并进行验证login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>登录注销</title>
</head>

<body>
    <form action="login.jsp">
        用户名:<input type="text" name="uname" /></br> 密&nbsp;&nbsp;码:<input
            type="password" name="upass"> <input type="submit" value="登录">
        <input type="reset" value="重置">
    </form>
    <%
        String name = request.getParameter("uname");
        String password = request.getParameter("upass");
        if (!(name == null || "".equals(name) || password == null || ""
                .equals(password))) {
            if ("Bruce".equals(name) && "2222".equals(password)) {
                response.setHeader("refresh", "2,URL=welcome.jsp");
                session.setAttribute("userid", name);
    %>
    <h3>用户登录成功,两秒后跳转到欢迎页!</h3>
    <h3>
        如果没有跳转,请点击<a href="welcome.jsp">这里</a>
    </h3>
    <%
        } else {
    %>
    <h3>错误的用户名和密码</h3>
    <%
        }

        }
    %>
</body>
</html>

登录成功欢迎页welcome.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'welcome.jsp'</title>
</head>

<body>
    <%
        if (session.getAttribute("userid") != null) {
    %>
    <h3>
        欢迎<%=session.getAttribute("userid")%>光临本系统,<a href="logout.jsp">注销</a>
    </h3>
    <%
        } else {
    %>
    <h3>
        请先进行系统的<a href="login.jsp">登录</a>
    </h3>
    <%
        }
    %>
</body>
</html>

登录注销logout.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'logout.jsp'</title>
</head>

<body>
    <%
        response.setHeader("refresh", "2;login.jsp");
        session.invalidate();
    %>
    <h3>你已经成功注销,两面后自动跳转回首页</h3>
    <h3>
        如果没有跳转,请点击<a href="login.jsp">这里</a>
    </h3>
</body>
</html>

2.5.3 判断新用户

<%
session.isNew();
%>

2.5.4 取得用户的操作时间

<%
long start = session.getCreationTime();
long end = session.getLastAccessedTime();
long time = (end-start)/1000;//得出操作的秒
%>

2.6 application对象

常用方法描述
String getRealPath(String path)
public Enumeration getAttributeNames()
public String getContextPath()

2.6.1 取得虚拟目录对应的绝对路径

例如:

<%
    String path = application.getRealPath("/");
    String path1 = this.getServletContext().getRealPath("/");//两个方法的结果一样
%>

例如:在Web项目的根目录中的note文件夹保存文件

2.6.2 网站计数器

2.6.3 查看application范围的属性

例如:

<%
    Enumeration<?> enu1 = this.getServletContext().getAttributeNames();
    while (enu1.hasMoreElements()) {
        String name = (String) enu1.nextElement();
%>
    <h4><%=name%>--><%=this.getServletContext().getAttribute(name)%></h4>
<%
    }
%>

2.7 Web安全性及config对象

2.7.1 Web安全性

2.7.2 config对象

使用config对象中的getInitParameter()方法可以取得初始化的配置参数,所有配置参数在web.xml文件中进行配置。

2.8 out对象

2.9 pageContext对象

pageContext对象可以取得ServletRequest\ServletResponse\ServletConfig\ServletContext接口的实例

=================================================================================

JavaBean

3.1 JavaBean基本要求

  • 所有类必须放在一个包中
  • 所有类声明成public class
  • 所有类属性封装并编写对应的getter和setter方法
  • 所有类至少存在一个无参构造方法

3.2 JSP中使用JavaBean

3.2.1 Web开发的标准目录结构

编译好的class文件或jar包应该放在WEB-INF\classes文件夹中,可以根据命令

javac -d. SimpleBean.java命令根据package的定义打包编译

3.2.2 使用JSP的page指令导入所需要的JavaBean

例如:
    <%@page import="cn.mldn.lxh.demo.*"%>

3.3.3 使用指令导入所需要的JavaBean

例如:
    <jsp:useBean id="simple" scope="page" class="cn.mldn.lxh.demo.SimpleBean"/>

ps:此方法省略了手工实例化对象的过程

3.3 JavaBean与表单

实例:
输入表单input.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>input.html</title>
</head>

<body>
    <form action="input.jsp" method="post">
        姓名:<input type="text" name="name"><br />年龄:<input type="text"
            name="age"> <input type="submit" value="提交"> <input
            type="reset" value="重置"><br>
        <br>
        <br></form>
</body>
</html>

接收内容表单input.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="cn.mldn.lxh.demo.*"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>

<body>
    <%
        SimpleBean simple = new SimpleBean();
        simple.setName(request.getParameter("name"));
        simple.setAge(Integer.parseInt(request.getParameter("age")));
    %>
    <h3>
        姓名:<%=simple.getName()%></h3>
    <h3>
        年龄:<%=simple.getAge()%></h3>
</body>
</html>

例如:修改input.jsp接收表单全部内容

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="cn.mldn.lxh.demo.*"%>>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head>

<body>
    <jsp:useBean id="simple" scope="page"
        class="cn.mldn.lxh.demo.SimpleBean"></jsp:useBean>
    <jsp:setProperty property="*" name="simple" />
    <h3>
        姓名:<%=simple.getName()%></h3>
    <h3>
        年龄:<%=simple.getAge()%></h3>
</body>
</html>

3.4 设置属性:

4种设置属性操作:

<jsp:setProperty name="实例化对象的名称(id)" property="*"/>//自动匹配
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称"/>//指定对象的属性名称
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称" param="参数名称"/>//指定参数,参数名称是原表单传递过来的参数名称
<jsp:setProperty name="实例化对象的名称(id)" property="属性名称" value="内容"/>//指定内容

3.5 取得属性:

语法:

<jsp:getProperty name="实例化对象的名称(id)" property="属性名称"/>

等价于getter()方法

3.6 JavaBean的保存范围

例如:session范围的JavaBean
在src文件夹中建立此类

package cn.mldn.lxh.demo;
public class Count {
    private int count = 0;

    public Count() {
        System.out.println("------------一个对象产生--------------");
    }

    public int getCount() {
        return ++this.count;
    }

}

写如下页面session.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>JavaBean范围</title>

</head>
<jsp:useBean id="cou" scope="session" class="cn.mldn.lxh.demo.Count" />
<body>
    <h3><jsp:getProperty name="cou" property="count" /></h3>
</body>
</html>

3.7 JavaBean的删除

例如:

3.6页面改动为
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>JavaBean范围</title>

</head>
<jsp:useBean id="cou" scope="session" class="cn.mldn.lxh.demo.Count" />
<body>
    <h3><jsp:getProperty name="cou" property="count" /></h3>
    <%
        session.removeAttribute("cou");
    %>
</body>
</html>
````
运行结果:每一次显示完都会删除session对象并重新声明一个新的JavaBean






<div class="se-preview-section-delimiter"></div>

## 3.8  实例:注册认证







<div class="se-preview-section-delimiter"></div>

## 3.9  DAO设计模式






<div class="se-preview-section-delimiter"></div>

# 文件上传




<div class="se-preview-section-delimiter"></div>

## 4.1  SmartUpload







<div class="se-preview-section-delimiter"></div>

## 4.2  FileUpload








<div class="se-preview-section-delimiter"></div>

# Servlet程序开发




<div class="se-preview-section-delimiter"></div>

## 4.1 Servlet简介
Servlet(服务器端小程序)





<div class="se-preview-section-delimiter"></div>

## 4.2 第一个Servlet程序
处理HTTP请求的Servlet程序,必须继承HttpServlet类,而且自定义的Servlet类至少还要覆写HttpServlet类中提供的doGet()方法
doGet()方法中定义了两个参数:HttpServletRequest和HttpServletResponse,用来接收和回应用户的请求
示例:
用Servlet输出helloworld(实际上Servlet并不适合输出显示)




<div class="se-preview-section-delimiter"></div>

package org.lxh.servletdemo;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println(“”);
out.println(“Bruce“);
out.println(““);
out.println(“

HELLO WORLD

“);
out.println(““);
out.println(“”);
}
}

编译完成后可以将程序打包保存在WEB-INF\classes文件夹下即可,或者放在jdk目录下的jre\lib\ext中
配置web.xml文件

4.3 Servlet与表单

4.4 Servlet生命周期

4.5 取得初始化配置信息

4.6 取得其他内置对象

4.7 Servlet跳转

4.8 Web开发模式:Mode 1与Mode 2

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值