jsp

.jsp

1. jsp的介绍

JSP全名为Java Server Pages,中文名叫java服务器页面,本质是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp) JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

它实现了Html语法中的java扩张(以 <%, %>形式)。JSPServlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。

jsp的作用:将内容的生成和显示进行分离

JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容

 

2. jsp的原理

Ø jsp原理


创建
web工程day10,创建一个hello.jsp页面。上图描述的是一个jsp页面hello.jsp在服务器中处理的过程。

1.在浏览器中输入 http://localhost/day10/hello.jsp

2.服务器得到请求,会通过jsp引擎查找到hello.jsp页面

3.服务器将查找到的hello.jsp页面翻译成hello_jsp.java(其本质就是一个servlet)

4.jvm会将hello_jsp.java文件编译成hello_jsp.class

5.服务器运算hello_jsp.class文件

6.服务器生成响应结果

Ø jsp对应java文件分析

上述是我们对于一个jsp运行的原理的简单分析,我们可以通过查看hello.jsp文件翻译后的.java文件来了解具体内容,生成的hello.jsp页面的java源文件存在于tomcat/work目录 下。

hello.jsp页面源代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>    

    <title>hello.jsp</title>

  </head>  

 <body>

    hello jsp

  </body>

</html>

 

hello_jsp.java文件源代码


package org.apache.jsp;

 

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.util.*;

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {

 

  private static final javax.servlet.jsp.JspFactory _jspxFactory =

          javax.servlet.jsp.JspFactory.getDefaultFactory();

 

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

 

  private javax.el.ExpressionFactory _el_expressionfactory;

  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

 

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {

    return _jspx_dependants;

  }

 

  public void _jspInit() {

    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());

  }

 

  public void _jspDestroy() {

  }

 

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

        throws java.io.IOException, javax.servlet.ServletException {

 

    final javax.servlet.jsp.PageContext pageContext;

    javax.servlet.http.HttpSession session = null;

    final javax.servlet.ServletContext application;

    final javax.servlet.ServletConfig config;

    javax.servlet.jsp.JspWriter out = null;

    final java.lang.Object page = this;

    javax.servlet.jsp.JspWriter _jspx_out = null;

    javax.servlet.jsp.PageContext _jspx_page_context = null;

 

 

    try {

      response.setContentType("text/html;charset=utf-8");

      pageContext = _jspxFactory.getPageContext(this, request, response,

       null, true, 8192, true);

      _jspx_page_context = pageContext;

      application = pageContext.getServletContext();

      config = pageContext.getServletConfig();

      session = pageContext.getSession();

      out = pageContext.getOut();

      _jspx_out = out;

 

      out.write("\r\n");

      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");

      out.write("<html>\r\n");

      out.write("  <head>    \r\n");

      out.write("    <title>hello.jsp</title>\r\n");

      out.write("  </head>\r\n");

      out.write("  \r\n");

      out.write("  <body>\r\n");

      out.write("    hello jsp\r\n");

      out.write("  </body>\r\n");

      out.write("</html>\r\n");

    } catch (java.lang.Throwable t) {

      if (!(t instanceof javax.servlet.jsp.SkipPageException)){

        out = _jspx_out;

        if (out != null && out.getBufferSize() != 0)

          try { out.clearBuffer(); } catch (java.io.IOException e) {}

        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

        else throw new ServletException(t);

      }

    } finally {

      _jspxFactory.releasePageContext(_jspx_page_context);

    }

  }

}

 

通过上面的内容,大家会发现在jsp页面中的所有的html代码,最终都会被流写回到浏览器端,所以我们可以在浏览器上查看到jsp页面上的html内容

3. jsp的脚本与注释

Ø jsp中三种脚本元素

有三个基本的脚本元素,作用是使JAVA代码可以直接插入HTML代码中

u Ø声明标签

格式:<%! int a = 1; %>

作用:声明的变量在类的成员位置上

u Ø脚本片断

格式:<% int a = 1; out.println(a); %>

作用:内容会生成在_jspService()方法中

u Ø脚本表达式

格式:<%= "hello " + a %>

作用:它就相当于是out.println()将内容直接输出到页面中,注意表达式不能以分号结尾

Ø jsp中的注释

jsp页面中可以使用三种注释

可以使用html中注释  

<!-- html的注释  -->

可以对jsp脚本内容使用java注释  

  //单行注释  /* 多行注释 */

可以使用jsp注释(推荐)

<%--  jsp注释  --%>

4. jspservlet的结合使用

把昨天的登录操作使用jsp实现一下,流程稍稍改变一下:

 

创建数据库与表

CREATE DATABASE day10;

USE day10;

CREATE TABLE USER(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(20),

PASSWORD VARCHAR(20),

email VARCHAR(50),

sex VARCHAR(20),

telephone VARCHAR(20),

introduce VARCHAR(200)

)

INSERT INTO USER VALUES(NULL,"tom","123","tom@itcast.cn","","13888888888","good boy");

 

导入mysql驱动jar

创建JdbcUtils工具类及jdbc.properties配置文件

创建User类

public class User {

private int id;

private String username;

private String password;

private String email;

private String sex;

private String telephone;

private String introduce;

 

get/set方法省略

 

login.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>    

    <title>登陆窗口</title>

  </head>  

  <body>

   <%=request.getAttribute("loginmsg") %>

    <form action="/day10/login" method="post">

     USERNAME:<input type="text" name="username"><br>

     PASSWORD:<input type="password" name="password"><br>

     <input type="submit" value="登陆">

    </form>

  </body>

</html>

 

LoginServlet类

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 1.获取请求参数 username password

String username = request.getParameter("username");

String password = request.getParameter("password");

// 2.调用UserOperation类中的login方法

UserOperation uo = new UserOperation();

User user = uo.login(username, password);

//3.判断user是否为null来确定是否登陆成功

if(user==null){

//登陆失败,请求转发到login.jsp页面

request.setAttribute("loginmsg", "登陆失败");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}else{

//登陆成功,重定向到success.jsp

response.sendRedirect("/day10/success.jsp");

}

}

 

UserOperation操作类

public User login(String username, String password) {

User user = null;

// 1.定义sql语句

String sql = "select * from user where username=? and password=?";

// 2.查找数据库操作

Connection con = null;

PreparedStatement pst = null;

ResultSet rs = null;

 

try {

// 2.1获取Connection对象

con = JdbcUtils.getConnection();

// 2.2 获取执行sql语句的PreparedStatement对象

pst = con.prepareStatement(sql);

// 2.3对占位符赋值

pst.setString(1, username);

pst.setString(2, password);

// 2.4执行sql获取ResultSet

rs = pst.executeQuery();

// 2.5操作ResultSet

if (rs.next()) {

user = new User();

user.setId(rs.getInt("id"));

user.setEmail(rs.getString("email"));

user.setUsername(rs.getString("username"));

user.setPassword(rs.getString("password"));

user.setSex(rs.getString("sex"));

user.setTelephone(rs.getString("telephone"));

user.setIntroduce(rs.getString("introduce"));

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

// 2.6关闭资源

JdbcUtils.closeResource(con,pst,rs);

}

return user;

}



success.jsp页面 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>    

    <title>登陆成功窗口</title>

  </head>  

  <body>

    <h1>登陆成功</h1>

  </body>

</html>

首次进入登录页面的时候发现最上面显示为null,需要先判断一下loginmsg是否为空,在输出.这段代码用el表达式(明天讲)实现起来特别简单.

EL 全名为Expression Language

语法:${标识符}

常用功能:获取各种域中存储的数据

jsp写法:<%=request.getAttribute("loginmsg");>

el写法:${requestScope.loginmsg}

修改之后的login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>    

    <title>登陆窗口</title>

  </head>  

  <body>

   ${requestScope.loginmsg}

    <form action="/day10/login" method="post">

     USERNAME:<input type="text" name="username"><br>

     PASSWORD:<input type="password" name="password"><br>

     <input type="submit" value="登陆">

    </form>

  </body>

</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值