04_01_javaweb(JSP核心技术、JSP内置对象、MVC设计模式)

JSP核心技术

JSP的概述

  • JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
  • 与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。

JSP的示例

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Hello Time</title></head>
<body> 现在的时间是:<%= new Date()%>
</body>
</html>

JSP与Servlet的关系

在这里插入图片描述

JSP的语法

JSP语法结构

  • 声明区
  • 程序代码区
  • 表达式
  • 注释
  • 指令和动作
  • 内置对象

声明区

基本语法:

<%! %>

说明:可以定义全局变量、方法、类。

<%! int i; public void setName(){… …} %>

程序代码区

基本语法:
<%程序代码区%>
说明:可以定义局部变量以及放入任何的Java程序代码。

<% int j; for (int k=0; k<10; k++) { … … } %>

表达式

基本语法:
<%=… …%>
说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的
表达式。
注意:不需要以;结束,只有一行

<%=“hello world”%>
<%=i+1%>

– 示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试变量的声明和打印</title>
    <%!
        int ia;//这是一个全局变量
        public void show(){
            System.out.println("这个是全局方法!");
        }

        public class MyClass{
            {
                System.out.println("这是一个全局类");
            }
        }
    %>

    <%
        int id = 20;//这是一个局部变量
        // 后台输出
        for (int i=0;i<3;i++){
            System.out.println("随便放入java程序代码!");
        }
    %>
</head>
<body>
<%= ia+1%> <%--1--%>
<%=id%> <%--20--%>
<%= "我就暂时写到这"%> <%--打印字符串--%>
</body>
</html>

– 测试:

题目:使用for循环输出一个html语言的表格,具体表头如下: 
id name age salary 
1  1    1   1 
2  2    2   2 
... 
5  5    5   5

使用jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现表格的绘制</title>
</head>
<body>
<table>
    <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
        <td>salary</td>
    </tr>
    <%
        for (int i = 1; i < 6; i++) {
    %>
    <tr>
        <td><%=i%>
        </td>
        <td><%=i%>
        </td>
        <td><%=i%>
        </td>
        <td><%=i%>
        </td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

注释

格式: <!--… …--> HTML文件的注释,浏览器可以查看到 
<%--… …--%> JSP文件的注释,浏览器看不到 
<%//… …%> Java语言中的单行注释,浏览器看不到 
<%/*… …*/%> Java语言中的多行注释,浏览器看不到 注释的内容不会被执行

指令和动作

  • 指令格式:
    <%@指令 属性=“属性值”%>
  • 指令的属性可以设定多个。
  • JSP常用指令有:page、taglib、include。
page指令
  • page指令用于导包和设置一些页面属性,常用属性如下:
import 导入相应的包,惟一允许在同一文档中多次出现的属性 
contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型 
pageEncoding 设置页面的编码 
language 指定页面使用的语言 
session 控制页面是否参与HTTP会话 
errorPage 处理当前页面中抛出但未被捕获的任何异常 
isErrorPage 当前页是否可以作为其他页面的错误处理页面

示例:

<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <title>page指令的使用</title>
</head>
<body>
<%
    List<String> list = new LinkedList<>();
%>
</body>
</html>
taglib指令
  • taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 --> 
<!-- uri属性用于指定库的标识 --> 
<%@taglib uri=“tagLibary” prefix=“prefix”%>
include指令
  • include指令用于引入另一个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>

示例:
被引入的:head.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>非引入的通用文件</title>
</head>
<body>
所有页面的规格头部部分就可以写在这里,然后让所有页面包含或引入改文件即可
</body>
</html>

引入的操作:include.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 表示包含或引入head.jsp文件,include指令的方式 指静态的包含 --%>
<%@ include file="head.jsp"%>
<html>
<head>
    <title>文件引入的使用</title>
</head>
<body>
    
</body>
</html>
  • JSP引擎会在JSP文件的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。
jsp:include/jsp:param
  • jsp:include动作用于引入另一个JSP程序或HTML文件等。
  • 执行到include时,被include的文件才会被编译。
  • 如果include的是jsp文件,那它不会被转换成Servlet文件。
<jsp:include page=“URLSpec” flush=“true”/> 
<jsp:include page=“URLSpec” flush=“true”>
 <jsp:param name=“key” value=“value”/> 
 </jsp:include>

示例:
被引入的:head.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>非引入的通用文件</title>
</head>
<body>
所有页面的规格头部部分就可以写在这里,然后让所有页面包含或引入改文件即可
</body>
</html>

引入的操作:include.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 表示包含或引入head.jsp文件,include指令的方式 指静态的包含 --%>
<%--<%@ include file="head.jsp"%>--%>
<%--动态的包含,推荐用以下的使用方式--%>
<jsp:include page="head.jsp"></jsp:include>
<html>
<head>
    <title>文件引入的使用</title>
</head>
<body>
    
</body>
</html>
include指令和include动作的区别
  • include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)。
  • include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
jsp:forward/jsp:param
  • forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
<jsp:forward page=“urlSpec” flush=“true”/> 
<jsp:forward page=“urlSpec”> 
	<!-- 用于指定参数和其对应的值 --> 
	<jsp:param name=“key” value=“value”/> 
</jsp:forward>

JSP内置对象

基本概念

  • 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
  • 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。

对象名称

对象变量对象类型作用
outJSPWriter输出流
requestHttpServletRequest请求信息
responseHttpServletResponse响应信息
sessionHttpSession会话
applicationServletContext全局的上下文对象
pageContextPageContextJSP页面上下文
pageObjectJSP页面本身
configServletConfigServlet配置对象
exceptionThrowable捕获网页异常
  • 问题:内置对象 pageContext.request.session.application 的作用范围从小到大依次是?
    解析:pageContext 对象的作用范围是当前页面,request 对象的作用范围是当前请求,session 对象的作用范围是当前会话,application 对象的作用范围是整个服务器上。所以为pageContext.request.session.application

out内置对象

  • out内置对象是一个缓冲的输出流,用来给客户端输出信息。

– 常用方法如下:

方法声明功能介绍
void println(String x)向客户端输出各种类型数据
void newLine()输出一个换行符
void close()关闭输出流
int getBufferSize()返回缓冲区的大小
int getRemaining()返回缓冲区中未使用的字节数
void flush()输出缓冲区里的数据
void clearBuffer()清除缓冲区里的数据,同时把数据输出到客户端
void clear()清除缓冲区里的数据,但不把数据输出到客户端

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>out内置对象的使用</title>
</head>
<body>
<%
    out.print("<h1>");
    out.println("Hello World");
    out.print("</h1>");

    int bufferSize = out.getBufferSize();
    System.out.println("缓冲区的总大小为:" + bufferSize);
    int remaining = out.getRemaining();
    System.out.println("缓冲区的剩余大小为:" + remaining);
    System.out.println("已使用的字节数为:" + (bufferSize - remaining));

    out.clear();
    remaining = out.getRemaining();
    System.out.println("清除的缓冲区" + remaining);
%>
</body>
</html>

request内置对象

  • request对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
  • 该对象的属性值只在一个请求中保存,当脱离请求直接访问时,就会出现获取值为空。

– 常用方法如下:

方法声明功能介绍
String getMethod()返回客户端向服务器端传送数据的方式
String getParameter(String name)返回客户端向服务器端传送的参数值,即获取到页面请求中传输的数据
String[] getParameterValues( String name)获得指定参数的所有值
String getRequestURI()获得请求地址
String getRemoteAddr()返回发送请求的客户端或最后一个代理的IP地址
int getRemotePort()返回发送请求的客户端或最后一个代理的端口号
String getServerName()获取服务器的名字
int getServerPort()获取服务器端的端口
void setAttribute(String name,Object o)在此请求中存储属性。属性在请求之间重置
Object getAttribute(String name)将指定属性的值作为对象返回,若不存在则返回空值

示例:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>request内置对象的使用</title>
</head>
<body>
<%
    String serverName = request.getServerName();
    System.out.println("获取到的服务器名称为:" + serverName);
    int serverPort = request.getServerPort();
    System.out.println("获取到的服务器端口号为:" + serverPort);
    //通过内置对象设置属性信息,也就是存储数据
    request.setAttribute("name", "guanyu");
%>

<%--实现转发效果,也就是服务器跳转--%>
<jsp:include page="requestTarget.jsp"></jsp:include>
</body>
</html>

跳转页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取requerst对象中的值</title>
</head>
<body>
<%="获取到的属性值为" + request.getAttribute("name")%><%--guanyu--%>
</body>
</html>

response内置对象

  • response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
  • 经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。

– 常用方法如下:

方法声明功能介绍
void addCookie(Cookie cookie)添加一个Cookie对象,用于在客户端保存特定的信息
void addHeader(String name, String value)添加HTTP头信息,该Header信息将发送到客户端
boolean containsHeader(String name)判断指定名字的HTTP文件头是否存在
void sendRedirect(String location)重定向JSP文件
void setContentType(String type)设置类型与编码方式

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>reponse内置对象的使用</title>
</head>
<body>
<%
    //表示每隔1秒进行刷新
    response.addHeader("refresh", "1");
    //获取到当前系统时间
    Date d1 = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String format = sdf.format(d1);
%>
<%= "当前时间为:" + format%>
</body>
</html>

session内置对象

  • session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
  • 该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。

– 常用方法如下:

方法声明功能介绍
void setAttribute(String name,Object value)使用指定的名称将对象绑定到此会话
Object getAttribute(String name)返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定则返回空值

application内置对象

  • application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
  • 在整个服务器上保存数据,所有用户共享。

– 常用方法如下:

方法声明功能介绍
void setAttribute(String name, Object object)将对象绑定到此servlet上下文中的给定属性名
Object getAttribute(String name)返回给定名称的servlet容器属性,若没有该名称的属性返回null

pageContext内置对象

  • pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
  • 只在一个页面中保存数据。

– 常用方法如下:

方法声明功能介绍
void setAttribute(String name, Object value,int scope)使用适当的作用域设置指定的名称和值
Object getAttribute(String name, int scope)返回指定作用域中名称关联的对象,若找不到则返回null
ServletRequest getRequest()获取请求对象
ServletResponse getResponse()获取响应对象
HttpSession getSession()获取会话对象
ServletConfig getServletConfig()获取配置对象
JspWriter getOut()获取输出对象
Object getPage()获取页面对象
Exception getException()获取异常对象

exception内置对象

  • exception 对象是Throwable的实例,表示的是JSP的异常信息。
  • 如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
  • 单个页面的处理方式
<%@page errorPage="error.jsp" %>

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>exception内置对象的使用</title>
<%@ page errorPage="error.jsp"%>
</head>
<body>
<%
    int ia = 10;
    int ib = 0;
    System.out.println(ia/ib);//算数异常
%>
</body>
</html>

异常页面:

<%@ page contentType="text/html;charset=UTF-8" language="java"  isErrorPage="true" %>
<html>
<head>
    <title>异常处理页面</title>
</head>
<body>
<%
    if (exception != null){
        out.println("异常的错误信息为:"+exception.getMessage());
    }
%>
</body>
</html>
  • 在web.xml中配置统一的异常处理页面。
<error-page>
 <exception-type>java.lang.Throwable</exception-type>
  <location>/error.jsp</location> 
</error-page>

JavaBean组件

– 基本概念

  • JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
  • JavaBean本质上就是Java类,通常要求如下:
    • 属性:全部私有化,通过get和set方法进行访问。
    • 方法:必须是public关键字修饰。
    • 构造器 :必须有无参构造方法。
      创建Bean
public class Student {

    private int id;
    private String name;

    public Student() {
    }

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

– 使用方式

  • 使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” /> 
保存范围有:page|request|sessin|application,默认为page范围。
  • 使用jsp:setProperty的方式设置javaBean的属性值
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>

示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>javaBean组件的使用</title>
</head>
<body>
<%--表示创建出Student类型的对象由Student引用变量负责记录 有效范围是当前页面--%>
<jsp:useBean id="student" scope="page" class="com.zyp.demo02.Student"/>
<%--表示将student对象中名字为id的属性值设置为--%>
<jsp:setProperty name="student" property="id" value="1003"/>
<jsp:setProperty name="student" property="name" value="zhangfei"/>
<%
    //通过基础的jsp进行获取bean对象,并且赋值
    //创建Student类型的对象并设置成员变量值
    //Student student = new Student();
    //student.setId(1001);
    //student.setName("zhangfei");
%>
<%="获取到的学号为:"+student.getId()%>
</br>
<%="获取到的姓名为:"+student.getName()%>
</body>
</html>
  • 使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现javabean组件中对象属性的值的打印</title>
</head>
<body>
<%--要引入对应的bean类,不然会报错--%>
<jsp:useBean id="student" scope="session" class="com.zyp.demo02.Student"/>
<%--获取名字为student对象中属性为id 的数值并打印--%>
经过参数赋值后获取到的学号为:<jsp:getProperty name="student" property="id"/>
<br/>
经过参数赋值后获取到的姓名为:<jsp:getProperty name="student" property="name"/>
</body>
</html>

将前端的值传入到jsp文件中实现javaBean的值的传送和接收
jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现前端页面传入过来的参数的接收和设置</title>
</head>
<body>
<jsp:useBean id="student" scope="session" class="com.zyp.demo02.Student"/>
<jsp:setProperty name="student" property="id" param="id1"/>
<jsp:setProperty name="student" property="name" param="name1"/>
</body>
</html>

前端html页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>向javaBean组件传入参数的使用</title>
</head>
<body>
<form action="bean2.jsp" method="post">
    学号:<input type="text" name="id1"/> <br/>
    姓名:<input type="text" name="name1"/><br/>
    <input type="submit" value="向javaBean组件传参"/>
</form>
</body>
</html>

– 保存范围

  • JavaBean的保存范围有page、request、session以及application,默认是page范围。
    – 删除方式
<% 内置对象.removeAttribute(“JavaBean的名字”); %>

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现javaBean组件数据删除</title>
</head>
<body>
<%
    //表示从session对象中删除名字为student的属性
    session.removeAttribute("student");
%>
</body>
</html>

MVC设计模式

– 基本概念

  • MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
  • M:主要用于封装业务数据的JavaBean(Bean) 和业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
  • V:主要负责数据收集和数据展现,通常由JSP文件完成。
  • C:主要负责流程控制和页面跳转,通常由Servlet完成。
    – 基本模型
    在这里插入图片描述
    – 通过MVC设计进行登录操作
    M:
    文件位置:demo03.bean
    实体类:User
public class User {
    private int id;
    private String userName;
    private String password;

    public User() {
    }

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                Objects.equals(userName, user.userName) &&
                Objects.equals(password, user.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, userName, password);
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

文件位置:demo03.dao
抽象类:UserDao

public interface UserDao {
    //自定义抽象方法,描述登录功能的实现
    public abstract User userLogin(User user);
}

实现类:UserDaoImp

public class UserDaoImp implements UserDao {

    @Override
    public User userLogin(User user) {
        ResultSet resultSet = null;
        Connection connection = null;
        PreparedStatement ps = null;
        User tu = null;
        try {
            //1.获取数据库连接
            connection = DBUtbil.getConnection();
            //2.准备sql语句
            String sql = "select * from t_user where userName=? and password=?";
            //3.执行sql语句后获取结果并且返回
            ps = connection.prepareStatement(sql);
            ps.setString(1, user.getUserName());
            ps.setString(2, user.getPassword());
            resultSet = ps.executeQuery();
            if (resultSet.next()) {
                tu = new User(resultSet.getString("userName"), resultSet.getString("password"));
                return tu;//查找成功
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //4.释放相关资源
            try {
                DBUtbil.closeResource(connection, ps);
                if (null != resultSet) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return null;//查找失败
    }

}

文件位置:demo03.factory
工厂类:UserDaoFactory

public class UserDaoFactory {
    /**
     * 通过静态工厂方法模式来实现UserDao实现USerDao的对象创建
     * @return
     */
    public static UserDao getUserDao(){
        return new UserDaoImp();
    }
}

文件位置:demo03.service
服务层UserService

public class UserService {

    private UserDao userDao;

    public UserService(){
        this.userDao = UserDaoFactory.getUserDao();
    }

    /**
     * 自定义成员方法实现根据参数指定的User对象来调用Dao层实现登入功能
     * @param user
     * @return
     */
    public User userLoginService(User user){
        return userDao.userLogin(user);
    }
}

文件位置demo03.ubil
数据库连接工具类:DBUtbil

public class DBUtbil {
    private static String jdbcName; //驱动信息
    private static String dbUrl;    //用于描述URL信息
    private static String dbUserName; //用于描述用户名的信息
    private static String dbPassword; //用于描述密码信息

    //成员的初始化操作
    static {
        jdbcName = "com.mysql.jdbc.Driver";
        dbUrl = "jdbc:mysql://localhost:3306/db_web";
        dbUserName = "root";
        dbPassword = "qwer1234";
        try {
            Class.forName(jdbcName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     *获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
        return con;
    }

    /**
     * 关闭连接
     * @param con
     * @throws SQLException
     */
    public static void closeConnection(Connection con) throws SQLException {
        if (null!=con){
            con.close();
        }
    }

    public static void closeResource(Connection con, PreparedStatement ps) throws SQLException {
        if (null!=con){
            con.close();
        }
        if (null!=ps){
            ps.close();
        }
    }
}

C:
文件位置:demo03.servlet
C层,进行跳转界面LoginServlet

@WebServlet(name = "LoginServlet", urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取到前端传送过来的用户名和密码,并且打印出来
        String userName = request.getParameter("userName");
        System.out.println("获取到的用户名为:" + userName);
        String password = request.getParameter("password");
        System.out.println("获取到的密码为:" + password);
        //2.创建UserService类型的对象去实现数据的校验功能
        UserService userService = new UserService();
        User user = userService.userLoginService(new User(userName, password));
        if (null == user){
            System.out.println("登录失败,用户名密码错误");
            request.setAttribute("error","登录失败,请重新输入");
            //实现服务器跳转 共享request和response对象
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");
            requestDispatcher.forward(request,response);
        }else {
            System.out.println("登录成功,欢迎使用");
            //将登录成功的信息放入session
            request.getSession().setAttribute("user",user);
            //实现客户端跳转
            response.sendRedirect("main.jsp");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

V:
文件位置:web
jsp文件:login.jsp登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>实现简单的登录功能</title>
</head>
<body>
<form action="loginServlet" method="post">
    用户名:<input type="text" name="userName"/><br/>
    密&nbsp&nbsp&nbsp码:<input type="text" name="password"/><br/>
    <span style="color: red;"><%=request.getAttribute("error")==null?"":request.getAttribute("error")%></span><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

登录后跳转界面:main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页面</title>
</head>
<body>
<h1>登录成功,欢迎<%=((User)session.getAttribute("user")).getUserName()%>使用</h1>
</body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值