Java Web应用开发

侯玉香,聂军,雷秦川,骆丽华,陈道敏,苗莹莹,刘叶

目录

  • 1 Java Web概述
    • 1.1 任务导引
    • 1.2 动态网页技术介绍
    • 1.3 JSP的运行环境
    • 1.4 JSP的运行原理
    • 1.5 JSP程序开发模式
    • 1.6 JSP开发工具
    • 1.7 任务实施:搭建项目环境及公司主页设计
    • 1.8 学习测验
  • 2 JSP基本语法
    • 2.1 任务导引
    • 2.2 JSP的基本组成
    • 2.3 脚本元素
    • 2.4 指令元素
    • 2.5 动作元素
    • 2.6 任务实施
    • 2.7 学习测验
  • 3 服务器交互
    • 3.1 任务导引
    • 3.2 课堂实录
    • 3.3 JSP内置对象概述
    • 3.4 out对象
    • 3.5 request对象
    • 3.6 response对象
    • 3.7 session对象
    • 3.8 application对象
    • 3.9 其他内置对象
    • 3.10 任务实施:使用JSP内置对象实现登录和注销功能
    • 3.11 学习测验
  • 4 JavaBean技术
    • 4.1 任务引导
    • 4.2 JavaBean概述
    • 4.3 JavaBean的应用
    • 4.4 JavaBean的作用域
    • 4.5 任务实施
    • 4.6 JSP中的文件操作
    • 4.7 学习测验
  • 5 Servlet技术
    • 5.1 任务引导
    • 5.2 Servlet基础
    • 5.3 Servlet开发
    • 5.4 Servlet常用API
    • 5.5 任务实施
    • 5.6 章节测验
  • 6 第6章 过滤器和监听器
    • 6.1 任务导引
    • 6.2 Servlet过滤器
    • 6.3 过滤器创建与配置
    • 6.4 Servlet监听器
    • 6.5 Servlet3.0新特性
    • 6.6 任务实施
    • 6.7 学习测验
  • 7 Java Web的数据库操作
    • 7.1 任务导引
    • 7.2 JDBC技术
    • 7.3 使用JDBC驱动程序访问数据库
    • 7.4 数据库连接的JavaBean
    • 7.5 JDBC对事务的操作
    • 7.6 连接池技术
    • 7.7 任务实施
    • 7.8 扩展阅读
    • 7.9 章节测验
  • 8 JSP高级技术
    • 8.1 任务导引
    • 8.2 EL概述
    • 8.3 JSTL标签库简介
    • 8.4 JSTL核心标签
    • 8.5 JSP与Ajax
    • 8.6 任务实施
    • 8.7 扩展阅读
    • 8.8 学习测验
  • 9 JSP实用组件技术
    • 9.1 任务导引
    • 9.2 上传与下载组件
    • 9.3 发送E-mail
    • 9.4 JSP动态图表
    • 9.5 在线编辑器
    • 9.6 任务实施
  • 10 教学过程材料
    • 10.1 2024-2025学年第一学期
      • 10.1.1 教学大纲
      • 10.1.2 授课计划
      • 10.1.3 实训指导书
      • 10.1.4 教案
      • 10.1.5 课件PPT
    • 10.2 2024-2025学年第二学期
      • 10.2.1 教学大纲
      • 10.2.2 授课计划
      • 10.2.3 实训指导书
      • 10.2.4 教案
      • 10.2.5 课件PPT
    • 10.3 2025-2026学年第一学期
      • 10.3.1 教学大纲
      • 10.3.2 授课计划
      • 10.3.3 实训指导书
      • 10.3.4 教案
      • 10.3.5 课件PPT
    • 10.4 2025-2026学年第二学期
      • 10.4.1 教学大纲
      • 10.4.2 授课计划
      • 10.4.3 实训指导书
      • 10.4.4 教案
      • 10.4.5 课件PPT
  • 11 课外资料
    • 11.1 电子书
      • 11.1.1 JavaWeb从入门到精通
      • 11.1.2 JavaWeb开发详解
      • 11.1.3 JavaWeb开发之道
      • 11.1.4 深入体验JavaWeb开发内幕-核心基础
      • 11.1.5 学通JavaWeb的24堂课
      • 11.1.6 Java Web 程序设计
      • 11.1.7 Java Web程序设计教程
      • 11.1.8 Java Web设计与应用教程
      • 11.1.9 Java_Web编程新手自学手册
      • 11.1.10 Tomcat and Java Web 开发技术详解
      • 11.1.11 Spring Boot 2+Thymeleaf企业应用实战
      • 11.1.12 Spring Boot+Vue全栈开发实战
      • 11.1.13 Spring实战
      • 11.1.14 JavaEE 8+Tomcat 9
    • 11.2 教学视频
      • 11.2.1 JDBC基础教学视频
      • 11.2.2 JDBC高级应用教学视频
Servlet常用API

1.HttpSerlvet常用方法

getServletContext():获取ServletContext对象,即JSP内置对象中的application对象。

getServletName():获取Servlet配置时声明在Web应用内部使用的名字。

getInitParameter(String name):获取Servlet配置时提供的名为name的参数值。

2.HttpSerlvetRequest常用方法

getRequestURL():获取请求的URL地址,包括协议名,服务器名,端口号和所请求服务的路径,但不包含请求时所带的参数。

getRequestURI():获取所请求服务的路径。

getContextPath():获取Web应用的根路径。

getServletPath():获取Servlet的访问地址。

getParameter(String name):获得名为name的参数的单个值。

getParameterValues(String name):获得名为name的参数的多个值。

getAttribute(String name):获得名为name的属性值。

setAttribute(String name,String value):设置名为name的属性值为value。

getSession():获取session对象。

getRequestDispatcher(String path):获取请求转发对象,转向地址为path。所获得的RequestDispatcher对象的forward()方法实现真正的跳转。 

3.HttpSerlvetResponse常用方法

setContentType(String type):设置响应的内容类型为type。

setCharacterEncoding(String charset):设置响应的编码字符集为charset。

getWriter():返回一个PrintWriter对象,利用这个对象可以向客户端输出文本,这个对象的作用类似于JSP的内置对象out。

sendRedirect(String location):向客户端发送一个重定向请求,地址为location。

4.ServletConfig常用方法

(1)获取Servlet的初始化参数

在web.xml文件中,<init-param>元素的相关配置代表Servlet的初始化参数,通过getInitParameter()方法来完成的。

(2)获取Servlet初始化参数名

<param-name>元素的值即为Servlet初始化参数名。通过getInitParameterNames()方法来完成。

(3)获取Servlet名称

通过getServletName()方法来获取Servlet在web.xml文件中的注册名称

5.获取服务器端信息的方法

服务器端信息包括服务器名、服务器端口号、服务器的属性信息等,Servlet通过ServletContext和ServletRequest接口提供的相关方法可获取这些服务器端信息


接口

方法名称

作用

ServletRequest

String getServerName()

获取服务器名

int getServerPort()

获取服务器端口号

ServletContext

String getServerInfo()

获取服务器信息

Enumeration getAttributeNames()

获取服务器属性名

Object getAttribute(String name)

获取服务器属性值

int getMajorVersion()

获取服务器支持的Servlet的主版本号

int getMinorVersion()

获取服务器支持的Servlet的次版本号


【案例5-4】 获取服务器端信息

package ch5;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;


import javax.servlet.GenericServlet;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebServlet;

@WebServlet(description = "ServerInfoServlet", urlPatterns = { "/servlet/ServerInfoServlet" })

public class ServerInfoServlet extends GenericServlet{

public void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException {

ServletContext servletContext=getServletContext(); //获取Servlet上下文

res.setCharacterEncoding("UTF-8");            //设置响应的编码类型为UTF-8

                res.setContentType("text/html;charset=UTF-8");

PrintWriter out=res.getWriter();                 //获取输出对象

out.println("<h2>服务器端信息列表</h2>");

out.println("<table border='1'>");

out.println("<tr>");

out.println("<td>服务器名</td>");

out.println("<td>"+req.getServerName()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>服务器端口号</td>");

out.println("<td>"+req.getServerPort()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>服务器信息</td>");

out.println("<td>"+servletContext.getServerInfo()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>主版本号</td>");

out.println("<td>"+servletContext.getMajorVersion()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>次版本号</td>");

out.println("<td>"+servletContext.getMinorVersion()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>服务器属性</td>");

Enumeration<String> params = servletContext.getAttributeNames();

String param="";

    while (params.hasMoreElements()){

        param += (String)params.nextElement()+"<br/>";

    }

out.println("<td>"+param+"</td>"); 

out.println("</tr>");

out.println("</table>");

out.close();               //关闭输出对象

}

}  




6.获取客户端信息的方法

客户端信息包括客户端主机名、客户端IP地址、客户端端口号、客户端的请求参数等,Servlet通过ServletRequest接口或其子接口HttpServletRequest提供的相关方法可获取客户端信息


序号

方法名

作用

1

String getRemoteHost()

获取客户端主机名

2

String getRemoteAddr()

获取客户端IP地址

3

int getRemotePort()

获取客户端端口号

4

String getProtocol()

获取客户端请求协议

5

String getCharacterEncoding()

获取客户端请求的编码格式

6

Enumeration getParameterNames()

获取客户端请求的所有参数名

7

String getParameter(String name)

获取客户端请求的参数名获取参数值


【案例5-5】获取客户端信息。

package ch5;


import java.io.IOException;

import java.io.PrintWriter;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


@WebServlet(description = "ClientInfoServlet", urlPatterns = { "/servlet/ClientInfoServlet" })

public class ClientInfoServlet extends HttpServlet{

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

this.doPost(req, resp);

}

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

resp.setCharacterEncoding("UTF-8"); //设置响应的编码类型为UTF-8

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

PrintWriter out=resp.getWriter();     //获取输出对象

out.println("<h2>客户端信息列表</h2>");

out.println("<table border='1'>");

out.println("<tr>");

out.println("<td>客户端主机名</td>");

out.println("<td>"+req.getRemoteHost()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>客户端IP地址</td>");

out.println("<td>"+req.getRemoteAddr()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>客户端端口号</td>");

out.println("<td>"+req.getLocalPort()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>客户端请求方式</td>");

out.println("<td>"+req.getMethod()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>客户端请求协议</td>");

out.println("<td>"+req.getProtocol()+"</td>"); 

out.println("</tr>");

out.println("<tr>");

out.println("<td>客户端请求编码格式</td>");

out.println("<td>"+req.getCharacterEncoding()+"</td>"); 

out.println("</tr>");

out.println("</table>");

        out.close();//关闭输出对象

}

}


7.HttpSession的相关方法 

(1)获取HttpSession对象

public HttpSession getSession()

public HttpSession getSession(Boolean create) 

(2)在HttpSession对象中保存数据 

public void setAttribute(String name,Object value) 

参数name是绑定到会话中的属性名称,参数value是属性的值。

(3)在HttpSession对象中读取数据 

public Object getAttribute(String name) 

参数name的值为setAttribute(String name,Object value)方法中设置的name的值。

(4)HttpSession 的实际应用

其工作原理是这样的: 

a.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号sessionId; 

b.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。 

当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。 

【案例5-6】结合JavaBean技术,使用HttpSession模拟购物车的信息保存

程序结构如图所示,Book.java是JavaBean,Db.java用来模拟数据库,ListBookServlet.java用于列出所有商品,点击购买将调用BuyServlet.java文件,ListCarServlet.java是购物车页面(点击购买了多少书本,就展示多少书本)。



Book.java:

package ch5.shopping;

public class Book {

    private String id;

    private String name;

    private String author;

    private double price;

    

    public Book(String id, String name, String author, double price) {

        this.id = id;

        this.name = name;

        this.author = author;

        this.price = price;

    }


public String getId() {

return id;

}


public void setId(String id) {

this.id = id;

}


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getAuthor() {

return author;

}


public void setAuthor(String author) {

this.author = author;

}


public double getPrice() {

return price;

}


public void setPrice(double price) {

this.price = price;

}

}

Db.java:

package ch5.shopping;


import java.util.LinkedHashMap;

import java.util.Map;


/**

 *  模拟一个保存Book的数据库

 */

public class Db {

    private static Map<String,Book> map=new LinkedHashMap<String,Book>();

    

    static{

        map.put("1", new Book("1","《spring实战","沃尔斯(Craig Walls)",66));

        map.put("2", new Book("2","《大型分布式网站架构设计与实践","陈康贤",79));

        map.put("3", new Book("3","《一线架构师实践指南》","温昱",35));

        map.put("4", new Book("4","《高性能网站构建实践》","刘鑫",88));

        map.put("5", new Book("5","《淘宝技术这十年》","子柳",45));

    }

    

    public static Map getAll(){

        return map;

    }

    

    public static void main(String[] args) {

        Map<String,Book> map=Db.getAll();  //获取模拟数据库Db的所有Book数据

        for(Map.Entry<String, Book> entry:map.entrySet()){

            Book book=entry.getValue();

            System.out.println(book.getName()+"<a href='BuyServlet?id="+book.getId()+"' target='_blank' >购买</a><br/>");

        }

    }

}


ListBookServlet.java:

package ch5.shopping;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;


import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


/**

 * 购买页面

 * 模拟网站首页 列出所有书本

 */

@WebServlet("/ListBookServlet")

public class ListBookServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

       

    public ListBookServlet() {

        super();

    }


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

        response.setCharacterEncoding("UTF-8");

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

        PrintWriter out =response.getWriter();

        

        out.println("本站有如下书籍<br/>");

        Map<String,Book> map=Db.getAll();  //获取模拟数据库Db的所有Book数据

        for(Map.Entry<String, Book> entry:map.entrySet()){

            Book book=entry.getValue();

            //点击“购买”后跳转至BuyServlet处理,并带上对应的书本Id

            out.print(book.getName()+"<a href='BuyServlet?id="+book.getId()+"' target='_blank' >购买</a><br/>");

        }

        out.println("<a href='ListCarServlet'>查看购物车</a>");

    }


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

    }


}


BuyServlet.java:

package ch5.shopping;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;


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;


//点击购买

@WebServlet("/BuyServlet")

public class BuyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

       

    public BuyServlet() {

        super();

    }


    //ListBookServlet点击购买后跳转到这里

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

        

        String id=request.getParameter("id"); //获取书本的Id

        Book book=(Book) Db.getAll().get(id);  //根据Id查找“数据库”对应的书,即本次购买的书

        

        HttpSession session=request.getSession();

        

        //从Session得到用户用于保存所有书的集合(购物车)

        List<Book> list = (List) session.getAttribute("listBook");  //首次购买这里没有数据

        if(list==null){   //如果是首次购买

            list=new ArrayList();  //新建一个List

            session.setAttribute("listBook", list);  //将购买的书本放入Session

        }

        list.add(book);   //每多购买一本,就在List中多添加一本书

        //request.getRequestDispatcher("/ListCarServlet").forward(request, response);  //转发会导致页面在刷新时不断购买刚刚购买的商品

        response.sendRedirect(request.getContextPath()+"/ListCarServlet");  //重定向:可以避免刷新时重复购买的情况

    }


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

    }


}

ListCarServlet.java:

package ch5.shopping;


import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;


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;


/**

 * 模拟购物车的页面展示

 */

@WebServlet("/ListCarServlet")

public class ListCarServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public ListCarServlet() {

        super();

    }


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

        response.setCharacterEncoding("UTF-8");

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

        PrintWriter out =response.getWriter();

        

        HttpSession session =request.getSession(false); //获取Session

        if(session==null){  //如果Session中为空

            out.write("您没有购买任何商品!!!");

            return ;

        }

        

        out.write("您购买了如下商品:<br/>");

        List<Book> list=(List) session.getAttribute("listBook");  //如果Session不为空,提取对应的Session中的数据

        for(Book book:list){

            out.write(book.getName()+"<br/>");   //将提取的数据进行展示

        }

    }


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

    }


}

点击购买后,跳至购物车页面,支持多次点击购买。