javaweb

jsp

jsp概念

jsp: java Server Pages: java服务器端页面,也和Servlet一样,用于动态web技术!

最大的特点:

写jsp就像在写html

区别:jsp页面中可以嵌入java代码,为用户提供动态的数据;

jsp原理:

思路:jsp是怎样执行的?

代码层面没有任何问题

服务器内部工作

tomcat中有一个work目录:

idea中使用tomcat的会在Idea的tomcat中生产一个work目录。

jsp页面变成了一个java程序!

浏览器向服务器发送请求,不管访问什么资源,其实都在访问Servlet!

jsp最终也会被转换成为一个java类

jsp本质就是一个Servlet

在jsp页面中:

只有是java代码就会原封不动的输出:

如果是html代码,就会被转换为

out.write("name")

jsp基础语法

需要导入的依赖 servlet,jsp,jstl,standard标签库

  <dependencies>
<!--    Servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
<!--    jsp依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
    </dependency>
<!--    jstl表达式的依赖-->
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>
<!--    standard标签库-->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

说明:任何语言都有自己的语法,java中有,jsp作为java技术的一种应用,他拥有一些自己扩充的语法。

jsp表达式

<%--jsp表达式
作业:用来将程序的输出,输出到客户端
<%= 变量 或者 表达式%>
<%= new java.util.Date()%>
--%>

jsp脚本

<%--jsp脚本片段--%>
<%
    int sum = 0;
    for (int i = 1; i<=100;i++){
        sum+=i;
    }
    out.println("<h1>sum="+sum+"</h1>");
%>

jsp声明

<%--jsp声明--%>
<%!
static {
    System.out.println("loading Servlet");
}
private int globalVar = 0;
public void kuang(){
    System.out.println("进入了方法kuang");
}
%>

jsp声明:会被编译到jsp生成的java的类中!其他的,就会被生成到_jspService方法中!

在jsp,嵌入java代码即可!

jsp注释,不会在客户端显示,html会,除非抓包。

EL表达式

1.获取数据; 2.执行运算; 3.获取web开发的常用对象;

el表达式获取表单的数据 ${param.参数名}

jsp标签
<%--jsp:include--%>
    <%--
    http://loaclhost:8080/jsptag.jsp?name=kuangshen&age=12
    -->
<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="kuangshen"></jsp:param>
    <jsp:param name="age" value="12"></jsp:param> 
</jsp:forward>
jstl表达式

jstl标签库的使用就是为了弥补html标签的不足;它自定义许多标签,可以供我们使用,标签的功能和java代码一样!

jstl使用步骤:

使用前必须导入对应的taglib,使用其中的方法,在tomcat也需要引入jstl的包,否则会报错:jstl解析错误

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

jdbc

jdbc项目步骤

1.创建一个maven项目

2.idea连接数据库

3.导入的依赖

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.28</version>
    </dependency>

4.编写实体类

package com.wyc.test;

import java.sql.*;

public class TestJdbc {
    public static void main (String[] args) throws ClassCastException, SQLException {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8";

        String username = "root";
        String password = "123456";
        //1.加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //2.连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.向数据库发送sql的对象Statement:CRUD
        Statement statement = connection.createStatement();
        //4.编写sql
        String sql = "select * from users";
        //5.执行查询sql,返回一个ResultSet :结果集
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            System.out.println("id"+rs.getObject("id"));
            System.out.println("name"+rs.getObject("name"));
            System.out.println("password"+rs.getObject("password"));
            System.out.println("email"+rs.getObject("email"));
            System.out.println("birthday"+rs.getObject("birthday"));
        }
        //6.关闭连接,释放资源  (一定要做,先开后关)
        rs.close();
        statement.close();
        connection.close();
    }
}

预编译

package com.wyc.test;

import java.sql.*;
//预编译sql
public class Test1Jdbc {

    public static void main (String[] args) throws ClassCastException, SQLException, ClassNotFoundException {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8";

        String username = "root";
        String password = "123456";
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.连接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.编写sql
        String sql ="insert into users (id, NAME, PASSWORD, email, birthday) VALUES (?,?,?,?,?);";

        Statement statement = connection.createStatement();
        //4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,7); //给第一个占位符赋值为1;
        preparedStatement.setString(2,"q");
        preparedStatement.setString(3,"eee");
        preparedStatement.setString(4,"abdqq.com");
        preparedStatement.setDate(5, new Date(new java.util.Date().getTime()));

        //5.执行查询sql,
        int i = preparedStatement.executeUpdate();
        if (i>0){
            System.out.println("插入成功");
        }
        //6.关闭连接,释放资源  (一定要做,先开后关)
        statement.close();
        connection.close();
    }
}

事务

要么都成功,要么都失败!

ACID原则:保证数据的安全。

开启事务
事务提交

超市管理系统

项目搭建步骤:

第一步:导包

web.xml导入这个配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0" metadata-complete="true">
</web-app>

第二步:main文件创建java和resource。

第三步:配置tomcat。测试能不能跑起来。

第四步:导入项目中需要的jar包。 pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>smbms</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

<dependencies>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
  </dependency>
  <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
  </dependency>
</dependencies>
</project>

第五步:创建项目包结构

com.xxx

image-20220521175531982

第六步:编写实体公共类

ORM映射:表-类映射

pojo编写实体类

7.编写基础公共类

1.数据库配置文件

dp.properities

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456

dao层编写操作数据库的公共类

BaseDao

package com.wyc.dao;

import java.io.*;
import java.sql.*;
import java.util.Properties;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 86177
 * \* Date: 2021/12/18
 * \* Time: 17:04
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class BaseDao {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    //---------------------------------------------------------------------------------------
    //静态代码块,类加载的时候就初始化了
    static {
        Properties properties = new Properties();
        //通过类加载器读取对应的资源

//
        try {
            InputStream in = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(in);

        } catch (Exception e) {
            e.printStackTrace();
        }
        driver = properties.getProperty("driver");
        url = properties.getProperty("url");
        username = properties.getProperty("username");
        password = properties.getProperty("password");

    }


//---------------------------------------------------------------------------------------

    //获取数据库的连接
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //------------------------------------------------------------------------------------------------------------
    //编写查询公共类
    public static ResultSet execute(Connection conn, PreparedStatement preparedStatement, ResultSet resultSet, String sql, Object[] params) throws Exception {
        preparedStatement = conn.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            //setObject,站位符从1开始,但是我们的数组是从0开始!
            preparedStatement.setObject(i + 1, params[i]);
        }

        resultSet = preparedStatement.executeQuery();
        return resultSet;

    }


    //------------------------------------------------------------------------------------------------------------
    //编写增删改公共方法
    public static int execute(Connection conn, String sql, Object[] params, PreparedStatement preparedStatement) throws Exception {
        preparedStatement = conn.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            //setObject,站位符从1开始,但是我们的数组是从0开始!
            preparedStatement.setObject(i + 1, params[i]);
        }

        int updateRows = preparedStatement.executeUpdate();
        return updateRows;
    }

    //------------------------------------------------------------------------------------------------------------
    //释放资源、
    public static boolean closeResource(Connection conn, PreparedStatement preparedStatement, ResultSet resultSet) {
        boolean flag = true;
        if (resultSet != null) {
            try {
                resultSet.close();
                resultSet = null;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
                preparedStatement = null;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            }
        }
        if (conn != null) {
            try {
                conn.close();
                conn = null;
            } catch (Exception e) {
                e.printStackTrace();
                flag = false;
            }
        }
        return flag;
    }
}

编写字符编码过滤器

filter层创建CharacterEncodingFilter实现filter接口

package com.wyc.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        filterChain.doFilter(request, response);
    }

    public void destroy() {

    }
}

并在web.xml配置

    <!--字符编码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.wyc.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

登录功能

第一步:编写前端页面:

步骤1.在WEB-INF文件夹下创建login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="false"
         pageEncoding="UTF-8" %>

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>系统登录 - 超市订单管理系统</title>
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/css/style.css"/>
    <script type="text/javascript">
        /* if(top.location!=self.location){
              top.location=self.location;
         } */
    </script>
</head>
<body class="login_bg">
<section class="loginBox">
    <header class="loginHeader">
        <h1>超市订单管理系统</h1>
    </header>
    <section class="loginCont">
        <form class="loginForm" action="${pageContext.request.contextPath }/login.do" name="actionForm" id="actionForm"
              method="post">
            <div class="info">${error}</div>
            <div class="inputbox">
                <label for="userCode">用户名:</label>
                <input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名" required/>
            </div>
            <div class="inputbox">
                <label for="userPassword">密码:</label>
                <input type="password" id="userPassword" name="userPassword" placeholder="请输入密码" required/>
            </div>
            <div class="subBtn">

                <input type="submit" value="登录"/>
                <input type="reset" value="重置"/>
            </div>
        </form>
    </section>
</section>
</body>
</html>

在web.xml配置

    <!--设置欢迎页面-->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

3.编写dao层登录用户的接口

package com.wyc.dao.user;

import com.wyc.pojo.Role;
import com.wyc.pojo.User;

import java.sql.Connection;
import java.util.List;

public interface UserDao {

    //得到要登陆的用户
    public User getLoginUser(Connection conn, String userCode) throws Exception;


4.编写dao接口的实现类

package com.wyc.dao.user;

import com.wyc.dao.BaseDao;
import com.wyc.pojo.Role;
import com.wyc.pojo.User;
//import com.wyc.cj.util.StringUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 86177
 * \* Date: 2021/12/19
 * \* Time: 9:55
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class UserDaoImpl implements UserDao {
    //获取登录用户
    public User getLoginUser(Connection conn, String userCode) throws Exception {
        PreparedStatement pst = null;
        ResultSet res = null;
        User user = null;

        if (conn != null) {
            String sql = "select * from smbms_user where userCode =?";
            Object[] params = {userCode};

            res = BaseDao.execute(conn, pst, res, sql, params);
            if (res.next()) {
                user = new User();
                user.setId(res.getInt("id"));
                user.setUserCode(res.getString("userCode"));
                user.setUserName(res.getString("userName"));
                user.setUserPassword(res.getString("userPassword"));
                user.setGender(res.getInt("gender"));
                user.setBirthday(res.getDate("birthday"));
                user.setPhone(res.getString("phone"));
                user.setAddress(res.getString("address"));
                user.setUserRole(res.getInt("userRole"));
                user.setCreatedBy(res.getInt("createdBy"));
                user.setCreationDate(res.getDate("creationDate"));
                user.setModifyBy(res.getInt("modifyBy"));
                user.setModifyDate(res.getDate("modifyDate"));
                return user;
            }
            BaseDao.closeResource(null, pst, res);
        }
        return null;
    }
}

5.业务层的接口

package com.wyc.service.user;

import com.wyc.pojo.Role;
import com.wyc.pojo.User;

import java.sql.Connection;
import java.util.List;

public interface  UserService {
    //用户登陆
    public User login(String userCode, String password);
}

6.业务层实现类

package com.wyc.service.user;

import com.wyc.dao.BaseDao;
import com.wyc.dao.user.UserDao;
import com.wyc.dao.user.UserDaoImpl;
import com.wyc.pojo.User;
import com.wyc.service.user.UserService;


import java.sql.Connection;
import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 86177
 * \* Date: 2021/12/19
 * \* Time: 10:18
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class UserServiceImpl implements UserService {

    //业务层都会调用dao层,所以我们要引入dao层
    private UserDao userDao;

    public UserServiceImpl() {
        userDao = new UserDaoImpl();
    }

    public User login(String userCode, String password) {
        Connection conn = null;
        User user = null;


        try {
            conn = BaseDao.getConnection();
            //通过业务层调用对应的具体的数据库操作
            user = userDao.getLoginUser(conn, userCode);
            return user;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            BaseDao.closeResource(conn, null, null);
        }
        return user;
    }
}

7.编写Servlet

package com.wyc.servlet.user;

import com.wyc.pojo.User;
import com.wyc.service.user.UserServiceImpl;
import com.wyc.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 86177
 * \* Date: 2021/12/19
 * \* Time: 13:36
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class LoginServlet extends HttpServlet {
    //Servlet:控制层,调用业务层代码


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("LoginServlet--start...");

        //获取用户的用户名和密码
        String userCode = req.getParameter("userCode");
        String userPassword = req.getParameter("userPassword");

        //和数据库中的密码进行对比,调用业务层
        UserServiceImpl userService = new UserServiceImpl();
        User user = userService.login(userCode, userPassword);

        if (user != null && userPassword.equals(user.getUserPassword())) {
            //查有此人
            //将用户的信息放到Session中;
            req.getSession().setAttribute(Constants.USER_SESSION, user);
            //跳转到主页
            resp.sendRedirect("jsp/frame.jsp");
        } else {
            //查无此人
            //转发会登录页面,顺带提示他,用户名或密码错误
            req.setAttribute("error", "用户名或密码不正确");
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8.注册servlet

web.xml

    <!--Servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.wyc.servlet.user.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
    </servlet-mapping>

登录功能优化

注销功能

在servlet/user/LoginoutServlet 编写代码,注销session,并在web.xml配置路径

第一步:注销session

public class LoginoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //移除用户的Constants.USER_SESSION
        req.getSession().removeAttribute(Constants.USER_SESSION);
        //返回登陆页面
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

第二步:配置路径

image-20220609154114906

登录拦截优化

在wyc目录下新建filter文件夹,编写SysFilter

package com.wyc.filter;

import com.wyc.pojo.User;
import com.wyc.util.Constants;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: 86177
 * \* Date: 2021/12/19
 * \* Time: 14:54
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //过滤器,从Session中获取用户;
        User user = (User) req.getSession().getAttribute(Constants.USER_SESSION);
        if (user == null) {
            //说明用户已经被注销或者被移除
            resp.sendRedirect("/smbms/error.jsp");
        } else {
            filterChain.doFilter(req, resp);
        }
    }

    @Override
    public void destroy() {

    }
}

在web.xml注册

    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.wyc.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/jsp/*</url-pattern>
    </filter-mapping>
密码修改

解决乱码问题,文件保存为带bomUtf-8.

posted on 2022-08-09 15:14  super-brother  阅读(30)  评论(0编辑  收藏  举报