Servlet和jsp开发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet和jsp开发相关的知识,希望对你有一定的参考价值。

Servlet和jsp开发
一、 Servlet
1.1、servlet简介
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。其实Servlet就是Java语言实现的一个接口,Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
1.2实现过程
1.客户端发送请求至服务器端;
2.服务器将请求信息发送至 Servlet;
3.Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4.服务器将响应返回给客户端。

1.3servlet九大内置对象

  1. request对象
    该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息, 即使用该对象可以获取用户提交信息。 客户端的请求参数都被封装到这个对象里面
    2.response对象
    对客户的请求做出动态的响应,向客户端发送数据。
    3.session对象
    1.什么是session:session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建(web容器创建的,使用者直接使用即可),完成会话期管理。
    从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。
  2. aplication对象
    1.什么是application:
    服务器启动后就产生了这个application对象,当客户在所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。但是与session不同的是,所有客户的application对象都是同一个,即所有客户共享这个内置的application对象。
    2.application对象常用方法:
    (1)public void setAttribute(String key,Object obj): 将参数Object指定的对象obj添加到application对象中,并为添加的对象指定一个索引关键字。(这个在web开发中很创建,可以通过与对象进行转发,达到数据共享)
    (2)public Object getAttribute(String key): 获取application对象中含有关键字的对象。
  3. out对象
    out 对象是一个输出流,用来向客户端输出数据。out对象用于各种数据的输出。可以直接输出到前端页面中。
  4. page java.lang.Object
    对应this关键字。JSP网页本身
    page对象是当前页面转换后的Servlet类的实例。从转换后的Servlet类的代码中,可以看到这种关系:
    Object page = this;
    在JSP页面中,很少使用page对象。
    7.config
    javax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。常用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事实上, JSP 页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet 中有效。

  5. exception java.lang.Throwable 的实例
    该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。常用的方法有getMessageO和printStackTraceO等。

  6. pageContext
    javax.servlet.jsp.PageContext 的实例,对象直译时可以称作“页面上下文”对象,代表的是当前页面运行的一些属性,通过此对象可以拿到其他8大对象,使用该对象可以访问页面中的共享数据。常用的方法有getServletContextO和getServletConfigO等。

//使用pageContext 设置属性,该属性默认在page 范围内
pageContext. setAttribute ("page" , "hello") ;

//使用request 设置属性,该属性默认在request 范围内
request. setAttribute ("request" , "hello");

//使用pageContext将属性设置在request 范围中
pageContext.setAttribute("request2" , "hello" , pageContext.REQUEST_SCOPE);

// 使用session将属性设置在session 范围中
session.setAttribute("session" , "hellosession"; )

//使用pageContext将属性设置在session范围中
pageContext.setAttribute("session2" , "hello" , pageContext.SESSION_SCOPE);

//使用application将属性设置在application范围中
application. setAttribute ("app" , "hello") ;

//使用pageContext 将属性设置在application 范围中
pageContext.setAttribute("app2" , "hello" , pageContext.APPL 工CATION_SCOPE) ;

1.4 四个作用域
1.application:全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。
2.session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。(一个简单的应用就是可以动态的获取登录后的用户名称)
3.request:请求作用域,就是客户端的一次请求。
4.page:一个JSP页面。
1.5 servlet简单案例—用户登录,动态获取用户名,显示欢迎信息
1.下载的html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载案例</title>
</head>
<body>
<a href="/response/ServletDownload?filename=曾惜-讲真的.mp3">曾惜-讲真的.mp3</a>
</body>
</html>
2.servlet后台逻辑

package com.lyg.servlet.download;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

@WebServlet("/ServletDownload")
public class ServletDownload extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取文件名
        String filename = request.getParameter("filename");
        //获取servletcontext对象
        ServletContext servletContext = getServletContext();
        //设置响应头
        String mineType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mineType);
        //告诉浏览器是打开还是保存,并设置下载后的文件名
        response.setHeader("content-disposition","attachment;filename="+filename);
        String userAgent = request.getHeader("user-agent");
        filename = URLEncoder.encode(filename, "utf-8");

        //创建输入流,读入目标文件
        InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/elements/"+filename);
        byte []chars=new byte[1024*8];
        //创建一个ServletOutputSteam 对象
        ServletOutputStream outputStream = response.getOutputStream();
        int len;
        while ((len=inputStream.read(chars))!=-1){
            outputStream.write(chars,0,len);
        }
        inputStream.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.doPost(request,response);
    }
}

二、jsp
2.1 jsp简介
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 [1] 是由SUN公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。他的本质上还是一个Servlet。
2.2 page指令
1.包含选项
import 使一个JAVA导入声明被插入到最终页面文件。
contentType 规定了生成内容的类型。当生成非HTML内容或者当前字符集character set并非默认字符集时使用。
errorPage 处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
isErrorPage 如果设置为TRUE,则表示当前文件是一个错误提示页面。
isThreadSafe 表示最终生成的servlet是否安全线程(threadsafe)。
2.语法
1.<%@ include file="somefile.jsp" %>:将一个页面内容包含在一个页面中

  1. <%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>:引入标签库

3.jsp和servlet综合应用---登录案例

  1. 登录后台的逻辑
package com.lyg.servlet.login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@WebServlet("/LoginDemo02")
public class LoginDemo02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        request.setCharacterEncoding("utf-8");
        //获取参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");final  String URL = "jdbc:mysql://localhost:3306/db1";
        final String USER = "root";
        final String PASSWORD = "12345678";
        String SQL = "select * from userinfo where name = ? and password = ?";
        HttpSession session = request.getSession();//获取session对象
        //连接数据库,查询
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection = DriverManager.getConnection(URL,USER,PASSWORD);
            PreparedStatement preparedStatement = connection.prepareStatement(SQL);
            preparedStatement.setString(1,username);
            preparedStatement.setString(2,password);
            ResultSet resultSet = preparedStatement.executeQuery();
            String db_username=null;
            String db_password =null;
            if (resultSet.next()){
                db_username=resultSet.getString(2);
                db_password=resultSet.getString(3);
            }
            //判断用户名和密码是否正确
            if (username.equals(db_username) && password.equals(db_password)){
                //信息都正确
                //页面跳转到success.jsp;
                session.setAttribute("username",username);//存储用户名
                response.sendRedirect(request.getContextPath()+"/success.jsp");
            }else {
                //用户名获取密码不正确
                //存储错误信息
                request.setAttribute("code_error","用户名或者密码错误");
                //同一次请求,请求转发
                request.getRequestDispatcher("/userinfo/index.jsp").forward(request,response);//转发错误信息
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
  1. 前台页面就是个很简单的form表单,这里就不演示了。
    最后谢谢小伙伴的浏览,共同学习,共同进步~~~~

以上是关于Servlet和jsp开发的主要内容,如果未能解决你的问题,请参考以下文章

jsp初识servlet转发转发与重定向的比较

Java基础——JSP

Tomcat根据JSP生成Servlet机制解析

JSP和Servlet[2]

关于Javaweb的问题,Jsp和Servlet各自的应用场景?

jsp基础语言-jsp代码段