栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

javaweb

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javaweb

JavaWEB 1.1.基本概念

web开发:

  • web:网页

  • 静态web

    • html,css
    • 提供给所有人看的数据始终不会发生改变
  • 动态web

    • 提供给所有人看的数据始终会发生改变
    • 技术栈:servlet/jsp,asp,php

在Java中,动态web资源开发的技术称为JavaWEB

1.2.web应用程序

web应用程序:可以提供浏览器访问的程序

  • a.html,b.html…多个web资源,这些web能被外部访问
  • 能访问到的任何一个页面或者资源,都存在某一个计算机上
  • url:
  • 这些统一的web资源会被放在同一个文件夹下,web应用程序----->Tomcat:服务器
  • 一个web应用由多部份组成(静态web,动态web)
    • html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)

web应用程序编写完毕后,若想提供给外界访问,需要一个服务器

1.3.静态web
  • *.html网页后缀,如果服务器上一直存在这些东西,我们就可以直接访问

  • 静态web的缺点
    • web页面无法更新,所有用户看到的都是同一个页面
    • 无法和数据库交互,数据无法持久化,用户无法交互
1.4.动态web

页面会动态展示:“web的页面展示的效果因人而异”

缺点:

  • 假如服务器的动态web资源出现错误,我们需要重写编写我们的后台程序,重新发布
    • 停机维护

优点:

  • 可以动态更新
  • 可以与数据库交互(数据持久化)

2.web服务器 2.1技术

asp,

  • 微软:国内最早流行的是asp
  • 在html中嵌入了vb脚本,asp+com;
  • 在asp开发中,基本一个页面都有几千行的业务逻辑代码
  • 维护成本高
  • C#
  • iis服务器

php

  • PHP开发速度快,功能很强大,跨平台,代码简单
  • 无法承载大访问量的情况

jsp/servlet

  • sun公司主推的B/S架构
  • 基于Java语言,所有的大公司和开源的组件都是Java开发
  • 可以承载三高问题带来的影响
2.2web服务器

服务器是一种被动操作,用来处理用户的一些请求和一些响应信息

IIS

微软的:运行asp程序

Tomcat

下载Tomcat:

1.安装

2.了解配置文件及目录结构

3.这个东西的作用

3.Tomcat 3.1安装Tomcat 3.2Tomcat启动和配置

启动,关闭Tomcat

测试连接

localhost:8080

可能遇到的问题:

  1. Java环境变量没有配置
  2. 闪退问题:需要配置兼容性
  3. 乱码问题:配置文件中的设置
3.3配置

可以配置启动的端口号

可以配置主机名称

面试题:

1.输入域名:

2.查找本机的dns缓存

​ 找不到再去找本机的host文件

​ 再找不到就去访问dns服务器

3.4发布一个web网站 4.HTTP 4.1.什么是HTTP

超文本传输协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)

4.2.两个时代
  • http1.0
    • http/1.0:客户端可以与web服务器连接,只能获得一个资源,请求一次就断开连接
  • http2.0
    • http/1.1:客户端可以与web服务器连接,可以获得多个资源
4.3.http请求

客户端–请求–服务器

1.请求行

  • 请求行中的请求方式:GET
  • 请求方式:Get,post
    • get:请求能够携带的参数比较少,大小有限制,会在浏览器的url地址栏显示数据内容,不安全,但高效
    • post:请求能够携带的参数没有限制,大小没有限制,不会会在浏览器的url地址栏显示数据内容,安全,但不高效

2.消息头

4.4.http响应

服务器–响应–服务器

1.响应体

2.响应的状态码

200:请求响应成功

3**:请求重定向

  • 重定向:你重新到我给你的新的位置

4xx:找不到资源 404

  • 资源不存在

5xx:服务器代码错误 500

​ 网关错误:502

常见面试题:

当你的浏览器中地址栏输入地址并回车的一瞬间能够展示回来,经历了什么

5.Maven

为什么要学maven?

1.在Javaweb开发中,需要使用大量的jar包

2.如何能够让一个东西自动帮助我们导入和配置这个jar包

​ 由此,maven诞生

5.1maven项目架构管理工具

我们目前用它来方便导入jar包的

maven的核心思想:约定大于配置

  • 有约束,不要去违反

maven会规定好你如何去编写我们的Java代码,必须按照这个规范来

5.2安装

下载完成后解压即可

5.3环境变量配置

在我们系统环境变量中进行如下配置

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven的目录
  • 在系统的path中的配置%MAVEN_HOME%BIN
5.4配置镜像
  • 镜像:
    • 作用:加速我们的下载
    • 建议使用阿里云镜像

alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/

*

5.5本地仓库

在本地的仓库,远程仓库

建立一个本地仓库:

/path/to/local/repo

5.6在idea中使用maven

1.启动IDEA

2.创建一个maven web项目

4.观察maven仓库的变化

5.idea中的maven设置

idea项目创建成功后,看一眼maven设置

6.到这里,maven在idea中的配置就完成了

5.7创建一个普通的maven项目

不使用模板直接创建

这个只有在web应用下才会有的

5.8在idea中标记文件夹功能

在使用模板建好的maven项目下我们在建一个Java和resources目录,并指定他们的功能

5.9在idea中配置tomcat

上面warning解决:

为什么会出现这个警告:我们访问呢一个网站,需要指定一个文件夹的名字,所以我么一定要配置

5.10pom文件

pom.xml是maven的核心配置文件

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。





  4.0.0

  
  com.cyz
  javaweb-01-maven
  1.0-SNAPSHOT

  
  war

  javaweb-01-maven Maven Webapp
  
  http://www.example.com

  
  
    
    UTF-8
    
    1.8
    1.8
  

  
  
    
    
      junit
      junit
      4.11
    
  

  
  
    javaweb-01-maven
    
      
        
          maven-clean-plugin
          3.1.0
        
        
        
          maven-resources-plugin
          3.0.2
        
        
          maven-compiler-plugin
          3.8.0
        
        
          maven-surefire-plugin
          2.22.1
        
        
          maven-war-plugin
          3.2.2
        
        
          maven-install-plugin
          2.5.2
        
        
          maven-deploy-plugin
          2.8.2
        
      
    
  


我们在bulid下建立resource

5.13解决遇到的问题

1.maven 3.6.2不能导出项目

2.Tomcat闪退

3.idea中每次都要重复配置maven

4.maven项目中的tomcat无法配置

5.maven导出文件问题

6.servlet 6.1.servlet简介
  • servlet就是sun公司开发动态web的一门技术
  • sun公司在这些api中提供了一个接口叫做:servlet,如果想开发一个servlet程序,只需要完成两个小步骤:
    • 编写一个类,实现servet接口
    • 把开发好的Java类部署到web服务器中

把实现了servlet接口的Java程序叫做servlet

6.2,HelloServlet

GET和POST是什么?HTTP协议中的两种发送请求的方法。

HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。

HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

参考博客:https://www.cnblogs.com/logsharing/p/8448446.html

servlet接口在sun公司有两个默认的实现类:HttpServlet,GenericServlet

步骤:

1.构建一个普通的maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立moudel,这个空的工程就是maven的主工程

2.关于maven父子工程的关系

​ 父项目中会有一个

    
        javaweb-01-moudl-maven
    

​ 子项目中会有一个

    
        javaweb-03-maven
        com.cyz
        1.0-SNAPSHOT
    

父项目中的Java子项目可以使用

3.maven环境优化

​ 【1】修改web.xml为最新的

​ 【2】将maven的结构搭建完整

4.编写一个servlet程序

​ 【1】编写一个普通类

​ 【2】实现servlet接口,我们直接继承HttpServlet

public class HelloServlet extends HttpServlet {
    //由于get或post只是请求的方式不同,所以可以相互调用,业务逻辑一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("hello word");
    }

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

5.编写servlet的映射

为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径

由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用元素和元素完成。
  元素用于注册Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。
一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
————————————————
原文链接:https://blog.csdn.net/honghailiang888/article/details/50585475

    
  
    servlet 
    com.cyz.servlet.HelloServlet
  

  
    servlet 
    
    //this.getServletContext()  servlet上下文
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //在ServletContext中放入数据
        String name = "陈颍州";
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("username", name); //将一个数据保存在servletcontext中 键值对 key:value
    }

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

获取数据的类
    package com.cyz.servlet;

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

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        ServletContext servletContext = this.getServletContext(); //获取ServletContext
        String username = (String) servletContext.getAttribute("username");
        PrintWriter writer = resp.getWriter();
        writer.print("名字:" + username);
    }

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

注册servlet
  
    put
    com.cyz.servlet.PutServlet
  
  
    put
    /put
  

  
    get
    com.cyz.servlet.GetServlet
  
  
    get
    /get
  
2.获取初始化参数
  
  
    url
    jdbc:mysql://localhost:3306/grils
  
获取配置信息
String url = servletContext.getInitParameter("url");
resp.getWriter().print(url);
3.请求转发

        //请求转发
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/hello");
        requestDispatcher.forward(req,resp);
4.读取资源文件
  • 在Java目录下新建properties
  • 在resources目录下新建的properties

发现:都被打包到了同一个路径下:classes,我们俗称这个路径为 classpath

思路:需要获得文件流

name=cyz
pwd=cyz
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //把配置文件转换成流,然后通过工具类,来获取里面的内容
        //通过servletcontext来进行转换
        /代表当前web程序
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/d1.properties");
        Properties properties = new Properties();
        properties.load(in);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.getWriter().print(username + ":" + password);
    }

测试即可

6.6HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse
1.简单分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);

响应的状态码

int SC_ConTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_ConTENT = 204;
    int SC_RESET_ConTENT = 205;
    int SC_PARTIAL_ConTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_ConFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
	int SC_GATEWAY_TIMEOUT = 504;
	int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2.下载文件
  1. 向浏览器输出消息
  2. 下载文件
    1. 要获取下载文件的路径
    2. 下载的文件名是啥
    3. 设置想办法让浏览器支持下载我们需要的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FileOutputStream流写入buffer缓冲区
    8. 将OututStream将缓冲区中的数据输出到客户端
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//        1. 要获取下载文件的路径
        //String realPath = this.getServletContext().getRealPath("/陈颍州.txt");因为servlet被部署到tomcat上了,所以/是从tomcat开始
        String realPath = "D:\Java项目\javaweb\javaweb-03-maven\response\src\main\resource\陈颍州.txt";
//        2. 下载的文件名是啥
        int charlast = realPath.lastIndexOf("\");
        int length = realPath.length();
        String filename = realPath.substring(charlast + 1, length);
//        3. 设置想办法让浏览器支持下载我们需要的东西  URLEncoder.encode(filename,"UTF-8")--->url编码器
        resp.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));
//        4. 获取下载文件的输入流
        FileInputStream fin = new FileInputStream(realPath);
//        5. 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//        6. 获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
//        7. 将FileOutputStream流写入buffer缓冲区,将OututStream将缓冲区中的数据输出到客户端
        while((len=fin.read())!=-1){
            out.write(buffer,0,len);
        }
        fin.close();
        out.close();
    }
3.验证码功能

验证码怎么来的?

  • 前端实现
  • 后端实现,需要用到Java的图片类,生成一个图片
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //验证码
        //如何让浏览器3秒后自动刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //画出图片
        Graphics2D g = (Graphics2D) image.createGraphics();
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font("宋体",Font.BOLD,20));
        g.drawString(MakeRandom(),0,20);
        //告诉浏览器,这个响应是用图片打开的
        resp.setContentType("image/png");
        //网站存在缓存,不让浏览器缓存
//        没有缓存:
//        response.setHeader("Pragma", "No-cache");
//        response.setHeader("Cache-Control", "no-cache");
//        设置过期的时间期限
//        response.setDateHeader("Expires", System.currentTimeMillis()+自己设置的时间期限);
        resp.setHeader("Pragma","No-cache");
        resp.setHeader("Cache-Control","no-cache");
        //        设置过期的时间期限
        resp.setDateHeader("Expires",-1);
        ImageIO.write(image,"png",resp.getOutputStream());
    }

    private String MakeRandom(){
        Random random = new Random();
        String s = random.nextInt(9999999) + "";
        StringBuilder sb = new StringBuilder();//创建一个空的线程不安全的可变字符串
        //因为随机生成的数字是7位数,所以,当不够7位的时候就用0来填充
        for (int i = 0; i < 7 - s.length() ; i++) {
            sb.append("0");
        }
        s = s + s6.b.toString();
        return s;
    }

4.实现重定向

一个web资源收到客户端请求后,他会通知客户端去访问另外一个web资源:重定向

常见场景:

  • 用户登录

     resp.sendRedirect("/cyz/yzm");
    重定向原理:
                  resp.setHeader("location","/cyz/yzm");
                  resp.setStatus(302);
    

    面试题:请你聊聊重定向与转发的区别?

    相同点

    • 页面都会跳转

    不同点

    • 请求转发的时候,url不会发生改变
    • 重定向的时候url会发生改变
6.7 HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息:

1.获取前端传递的参数以及请求转发

方法:

面试题:请你聊聊重定向与转发的区别?

相同点

  • 页面都会跳转

不同点

  • 请求转发的时候,url不会发生改变:状态码 307
  • 重定向的时候url会发生改变:状态码 302
public class getInfoservlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //中文乱码,解决
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //获得表单里面的信息
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        String[] likes = req.getParameterValues("like");
        System.out.println(name);
        System.out.println(password);
        System.out.println(Arrays.toString(likes));
        //重新定向到login
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }
7.cookie,Session 7.1 会话

**会话:**用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话

**有状态会话:**一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话

你怎么证明你是一个学校的学生?

  • 发票 学校给你发票
  • 学校登记 学校标记你来过了

一个网站怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:这个信件在网站中就是cookies
  2. 服务器登记你来过了,下次来的时候我来匹配你:session
7.2 保存会话的两种技术

cookie

  • 客户端技术(通过响应 请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中

常见场景:网站登录之后,下才不要再登录,第二次直接进去

7.3 cookie

1.从请求中拿到cookie信息

2.服务器响应给客户端cookie

cookie[] cookies = req.getcookies(); //获得cookie
co.getName()//获得cookie键
co.getValue();//获得cookie值
cookie resc = new cookie("lastDate",time+"");//新建cookie
resc.setMaxAge(24*60*60);//设置cookie有效期
resp.addcookie(resc);//给客户端响应cookie

cookie:一般会保存再本地的用户目录下appdata

一个网站cookie是否存在上限,细节问题

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,浏览器上限300个,每个站点最多存放20个
  • cookie大小限制4kb

删除cookie

  • 不设置有效期,关闭浏览器,自动失效
  • 设置有效期为0

中文乱码:

使用URLEncoder.encode("",“utf8”);进行编码

使用URLDecoder.decode("","");进行编码

7.4 Session(重点)

什么是session:

  • 服务器会给每一个用户(浏览器)创建一个session对象
  • 一个session独占一个浏览器,只要浏览器没关,这个session就存在
  • 用户登录之后,整个网站它都可以访问,保存用户的信息,保存购物车的信息

session方法:

session和cookie的区别:

  • cookie是把用户的数据写给用户的浏览器保存(可以保存多个)
  • sesscion把用户的数据写到独占session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • session对象由服务器创建

使用场景:

  • 保存一个登录用户信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将他保存再session中

使用session

使用session并添加数据

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到session
        HttpSession session = req.getSession();
        //给session中存东西
        session.setAttribute("name","陈颍州");
        //获取session的ID
        String id = session.getId();
        //判断session是不是新创建
        if(session.isNew()){
            resp.getWriter().write("session创建成功,ID:" + id);
        }else {
            resp.getWriter().write("session已经存在,ID:" + id);
        }
        //session创建的时候做了什么事情
//        cookie cookie = new cookie("JSESSIONID",id);
//        resp.addcookie(cookie);
    }

获取session中的内容

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获得session
        HttpSession session = req.getSession();
        //获取里面的元素
        String name = (String) session.getAttribute("name");
        if(name==null){
            resp.getWriter().write("没有数据");
        }
        //在控制台输出结果
//        System.out.println(name);
        //在页面上输出结果
        resp.getWriter().write(name);
    }
--------------------------------------------------------------------------
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取session
        HttpSession session = req.getSession();
        //手动注销session
        session.invalidate();

    }

会话自动过期

  
  
    
    15
  
8.JSP 8.1 什么是JSP

Java server pages :Java 服务器页面,也和servlet一样用于开发动态web的技术

最大的特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • jsp页面中可以嵌入Java代码,为用户提供动态数据

JSP的生命周期:

理解JSP底层功能的关键就是去理解它们所遵守的生命周期。

JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。

以下是JSP生命周期中所走过的几个阶段:

  • 编译阶段:

    servlet容器编译servlet源文件,生成servlet类

  • 初始化阶段:

    和servlet一样当容器接收到一个请求时,初始化一次,之后再销毁之前不会再被初始化

    加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法

  • 执行阶段:

    调用与JSP对应的servlet实例的服务方法

  • 销毁阶段:

    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

很明显,JSP生命周期的四个主要阶段和servlet生命周期非常相似,下面给出图示:

8.2 JSP原理

思路:jsp怎么执行的

  • 代码层面没有疑问

  • 服务器内部工作

    tomcat中有一个work目录

    IDEA中使用tomcat的会在IDEA的tomcat中生成一个work目录

C:Users陈颍州.IntelliJIdea2018.2systemtomcatUnnamed_javaweb-session-cookieworkCatalinalocalhostROOTorgapachejsp

jsp文件变成了Java程序

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

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

jsp本质上就是一个servlet

  public void _jspInit() {  //初始化
  }
//销毁
  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(HttpServletRequest request,HttpServletResponse response)

1.判断请求

2.内置一些对象

final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null;//session
final javax.servlet.ServletContext application;//applicationContext
final javax.servlet.ServletConfig config;//config
javax.servlet.jsp.JspWriter out = null;//out
final java.lang.Object page = this;//page:当前页
HttpServletRequest request//请求
HttpServletResponse response//响应

3.输出页面前增加的代码

response.setContentType("text/html");//设置响应的页面类型
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;

4.以上的这些对象我们可以在jsp中直接使用

在jsp页面中:

只要是Java代码就会原封不动的输出

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

out.write("")

这样的格式输出到前端,jsp就是简化页面的编写

8.3 JSP的基础语法

jsp获取项目绝对路径:${pageContext.request.contextPath}

jsp作为Java技术的一种应用,它拥有一些自己扩充的语法(了解)

Java语法它都支持

jsp表达式
<%--JSP表达式--%>
作用:用来将程序的输出,输出到客户端
语法:<%= 变量或者表达式%>
会被转换成out.print()
<%= new java.util.Date()%>
jsp脚本片段
<%
    int sum = 0;
    for (int i = 0; i <10 ; i++) {
        sum+=i;
    }
    out.println("sum="+sum+"");
%>
脚本片段的在实现

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脚本片段

<%= %> JSP表达式 会被转换成 out.print( a);

<%!%> jsp声明

E L 表 达 式 " ∗ ∗ {} EL表达式 "** EL表达式"∗∗{标识符}**"

原理:会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象(由小到大),找到则返回相应对象,找不到则返回””空字符串而不是null

<%----%> 注释

jsp的注释不会在客户端显示,HTML会

8.4 jsp指令
<%@page args.... %>
<%@include file=""%> 

jsp标签


8.5 9大内置对象
  • pageContext用来存东西
  • Request用来存东西
  • Response
  • Session 用来存东西
  • Application【ServletContext】用来存东西
  • config【ServletConfig】
  • out
  • page 几乎不用
  • exception
pageContext.setAttribute("name1","cyz1号");//保存的数据只在一个页面中有效
request.setAttribute("name2","cyz2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cyz3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cyz4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
拓展
    <%

//    通过pageContext取出我们保留的值
    //从底层到高层(作用域)page->request->session->application
    //jvm:双亲委派:加载类的请求一直向上递交  应用-》拓展类-》根加载器
    //下面通过寻找的方式取值finAttribute("name1");
    String name1 = (String) pageContext.finAttribute("name1");
    String name2 = (String) pageContext.finAttribute("name2");
    String name3 = (String) pageContext.finAttribute("name3");
    String name4 = (String) pageContext.finAttribute("name4");
    String name5 = (String) pageContext.finAttribute("name5");
%>
<%--使用EL表达式输出 ${} == <%=%>>--%>

取出的值为:

${name1}

${name2}

${name3}

${name4}

${name5}

<%=name5%> <%--使用<%=name5%>--%> <% //服务器后端请求转发和前端请求转发 //前端: pageContext.forward("/url"); //后端 request.getRequestDispatcher("url").forward(request,response); %>

场景:

  • request: 客户端向服务器发送请求,产生数据,用户看完就没用了,比如新闻,用户看完就没用了
  • session:客户端向服务器发送请求,产生数据,用户用完一会还有用,比如购物车
  • aplication:客户端向服务器发送请求,产生数据,一个用户用完了,另一个用户还能用,比如聊天记录
8.6 jsp标签,jstl标签,EL表达式
需要导包,(maven自动导入依赖)

EL表达式:${}

​ 作用:

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用web开发的常用对象

JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。

EL语法:${表达式}

  • El允许表达式表示一个属性,不指定域查找的时候,分别从page、request、session、application四个域中查找相应的对象

  • .与 [ ] 运算符EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:

    s e s s i o n S c o p e . u s e r . s e x 等 于 {sessionScope.user.sex}等于 sessionScope.user.sex等于{sessionScope.user[“sex”]}

    . 和 [ ] 也可以同时混合使用,如下:

    ${sessionScope.shoppingCart[0].price}

    回传结果为shoppingCart中第一项物品的价格。

    不过,以下两种情况,两者会有差异:

    (1) 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ],

    例如:${user.My-Name }

    上述是不正确的方式,应当改为:${user[“My-Name”] }

    (2) 我们来考虑下列情况:

    ${sessionScope.user[data]}

    此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};

    假若data 的值为"name"时,它就等于${sessionScope.user.name}。

    因此,如果要动态取值时,就可以用上述的方法来做,但无法做到动态取值。

jsp标签:

<%--jsp:include--%>
<%--下面的标签的作用就是转发并携带参数
类似:localhost:8080/jspLable.jsp?name=cyz&age=12
--%>

    
    

JSTL表达式

JSPTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签

,可供我们使用,标签的功能和Java代码一样

格式化标签

SQL标签

XML标签

核心标签(掌握部分)

<%--引入JSPTL核心标签库,我们才能使用JSPTL标签  c代表core--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSTL标签库使用步骤

  • 引入对应的taglib
  • 使用其中的方法
  • 在tomcat中也要导报,否则会报错

c:if

<%--判断如果提交的用户名是管理员,则登录成功--%> <%--Java代码实现--%> <%--<% if(request.getParameter("username").equals("admin")) { out.print("登录成功"); }else { out.print("你不是管理员,无法登录"); } %>--%> <%--jstl标签实现--%> <%--var="isAdmin是用来接收返回值的(true或flase)"--%>
c:choose
<%--定义一个变量score,值为85--%>


    
        你的成绩为优秀
    
    
        你的成绩为一般
    
    
        你的成绩为良好
    
    
        你的成绩不及格
    

<%--for-each遍历--%>
<%
    ArrayList arrayList = new ArrayList<>();
    arrayList.add("张三");
    arrayList.add("张4");
    arrayList.add("张5");
    arrayList.add("张6");
    arrayList.add("张7");
    arrayList.add("张8");
    request.setAttribute("list",arrayList);
%>
<%--
    var,每一次遍历出来的变量
    items,要遍历的对象
    和Java中的for-each一样 for(String name : arrayList)
--%>

     
<%
    ArrayList arrayList = new ArrayList<>();
    arrayList.add("张三");
    arrayList.add("张4");
    arrayList.add("张5");
    arrayList.add("张6");
    arrayList.add("张7");
    arrayList.add("张8");
    request.setAttribute("list",arrayList);
%>
<%--
    var,每一次遍历出来的变量
    items,要遍历的对象
    和Java中的for-each一样 for(String name : arrayList)
--%>

     
<%-- for(int i = 0; i < 10; i++) begin end step 这三个属性和for上面的i对应 --%>
9.JavaBean

实体类 我们一般都是和数据库中的表的结构一一对应

JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般用来和数据库的字段做映射 ORM

ORM:对象关系映射

  • 表—>类
  • 字段—>属性
  • 行记录—>对象

people表

idnameageaddress
1陈颍州1号3安徽
2陈颍州2号18安徽
3陈颍州3号100安徽
class People{
    private int id;
    private String name;
    private int id;
    private String address;
}
class A{
    new People(1,"陈颍州1号","安徽");
    new People(1,"陈颍州1号","安徽");
    new People(1,"陈颍州1号","安徽");
    new People(1,"陈颍州1号","安徽");
    new People(1,"陈颍州1号","安徽");
}
jsp获取赋值类
<%--在Java中使用一个类需要new对象,但是在jstl标签中,可以不用new,使用下面的标签--%>

<%--他的原型是
    People people = new People();
    id--->对象名
    class--->就是类
    scop--->作用域
--%>

<%--给对象进行赋值--%>

<%--
    name--->对象名
    prperty--->对象的属性
    value--->属性值
--%>




<%--上面的赋值等价于用对象调用set方法--%>

<%--获取属性值--%>




10,MVC三层架构

什么是MVC:model view Controller 模型 视图 控制器

10.1 早些年

用户直接访问控制层,控制层就可以直接操作数据库

servlet--CRUD(增删改查)-->数据库
弊端:程序异常臃肿,不利于维护    servlet的代码中:处理请求,响应,视图跳转,处理JDBC,处理业务代码,处理逻辑代码
    
架构:没有什么是加一层解决不了的
如程序员可以通过JDBC来统一操作一些数据库
10.2 MVC三层架构

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD (Dao)

View

  • 展示层
  • 提供链接发起Servlet请求

Controller(Servlet)

  • 接收用户的请求:(req:请求参数,Session信息…)
  • 交给业务层处理相应的代码
  • 控制视图的跳转
登录---->接收用户的登录请求---->处理用户的请求(获取用户登录的参数)---->交给业务层处理登录业务(判断用户名密码是否正确)---->Dao层查询用户名和密码是否正确--->数据库
11.Fillter(重点)

Shiro安全框架

Fillter:过滤器,用来过滤网站的数据

  • 处理中文乱码
  • 登录验证

Fillter开发步骤:

  1. 导包
  2. 编写过滤器
    1. 实现过滤器接口,重写方法
public class CharacterEncordingFillter implements Filter {
    //初始化:web服务器启动,就已经初始化了,随时等待过滤对象出现
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("已经初始化");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        System.out.println("CharacterEncordingFillter执行前");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
        System.out.println("CharacterEncordingFillter执行后");
    }

    //销毁:web服务器关闭的时候会被销毁
    public void destroy() {
        System.out.println("已经销毁");
    }

3.在web.xml中配置Filter

   
    
        filter
        com.cyz.fillter.CharacterEncordingFillter
    

    filter
    /servlet

2.web.xml注册监听器

    
    
        com.cyz.fillter.listener.OnlineCountListener
    
13.过滤器,监听器的常见应用

用户登录之后才能进入主页,用户注销后就不能静茹主页

  1. 用户登录之后,向Session中放入数据
  2. 进入主页的时候要判断用户是否已经登录,要求:在过滤器中实现

14.JDBC

什么是JDBC:Java连接数据库

需要jar包的支持:

  • java.sql
  • javax.sql
  • mysql-java-connection 连接驱动(必须创建)
Junit单元测试

依赖


    junit
    junit
    4.13.2
    test


简单使用

@Test注解只有在方法上有效,只要加了这个注解的方法就可以直接运行

@Test
public void test(){
    System.out.println("hello");
}

失败的时候是红色的

搭建一个环境测试一个事物


项目SMBMS超市订单管理系统

架构

数据库

项目如何搭建?

考虑使不使用maven

项目搭建准备工作

1.搭建一个maven项目

2.配置Tomcat

3.测试项目是否能跑起来

4.导入项目所依赖的jar包

5.创建项目包结构

6.编写实体类:

ORM映射:表和类映射

7.编写基础公共类

  1. 数据库配置文件
  2. 读取配置文件
dirver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8
username=root
passwd=root

3.编写公共类

public class baseDao {
    //定义全局变量存放properties文件里的值
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    //为了让类加载的时候就开始加载数据库驱动,我们用静态代码块
    static {
        try {
        //获取properties文件
         //使用类加载器,把配置文件加载到流中
        InputStream in = baseDao.class.getClassLoader().getResourceAsStream("D:\Java项目\javaweb\smbms\src\main\rescurces\db.properties");
         //使用properties工具类来加载配置文件
        Properties properties = new Properties();
            properties.load(in);//使用load方法进行加载
            //获取配置文件里的属性值
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            //加载jdbc驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //进行数据库的连接
    public Connection Getconnection(){
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            return connection;
        }
    }

    //编写查询公共类
    //要获得执行sql的对象
    public static ResultSet Select(Connection connection,String sql,Object[] params,ResultSet resultSet ,PreparedStatement preparedStatement) throws SQLException {

        //获得执行sql的对象
        preparedStatement = connection.prepareStatement(sql);
        //然后因为这是properStatment可以防止sql注入,所以我们使用占位符,所以我们要进行设置值
        //因为对象类型未知所以使用object
        for (int i = 0; i < params.length; i++) {
            //因为设置值是从1开始
            preparedStatement.setObject(i+1,params[i]);
        }
        //然后进行执行sql
         resultSet = preparedStatement.executeQuery();
        //返回结果集
        return  resultSet;
    }

    //编写增删改公共方法
    public static int Updata(Connection connection,String sql,Object[] params) throws SQLException {
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            preparedStatement.setObject(i+1,params[i+1]);
        }
        int i = preparedStatement.executeUpdate();
        return i;
    }
    //释放连接
    //原则:先建立的后释放
    public static boolean release(Connection connection,PreparedStatement pstatement, ResultSet resultSet){
       boolean flag = true;
        if(resultSet!=null){
            try {
                resultSet.close();
                //GC回收
                resultSet = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = true;
            }
        }
        if(pstatement!=null){
            try {
                pstatement.close();
                resultSet = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = true;
            }
        }
        if(connection!=null){
            try {
                connection.close();
                resultSet = null;
            } catch (SQLException e) {
                e.printStackTrace();
                flag = true;
            }
        }
        return flag;

    }

4.字符编码过滤器

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

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        chain.doFilter(req,resp);

    }

    public void destroy() {

    }
}
  
  
    charfilter
    com.cyz.filter.CharsetFilter
  
  
    charfilter
    /*
  

8.导入静态资源

登录功能实现

1.编写前端页面

2.设置登录页面

  
  
    login.jsp
  

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

public abstract smbms_user getLoginUset(Connection connection, Object[] parms, String UserCode) throws SQLException;

5.编写接口的实现类

public class UserDaoIm implements UserDao {
    public smbms_user getLoginUset(Connection connection, Object[] parms, String UserCode) throws SQLException {

        PreparedStatement ps = null;
        ResultSet resultSet = null;
        smbms_user user = null;
        //判断连接非空
        if(connection!=null) {
            String sql = "select * from smbms_user where userCode=?";
            parms = new Object[]{UserCode};


                 resultSet = baseDao.Select(connection, sql, parms, resultSet, ps);
                if(resultSet.next()){
                    user.setAddress(resultSet.getString("address"));
                    user.setBirthdy(resultSet.getDate("birthdy"));
                    user.setCreatedBy((Integer) resultSet.getObject("creatyBy"));
                    user.setCreationDate(resultSet.getDate("creationDate"));
                    user.setGender(resultSet.getInt("gender"));
                    user.setModifuBy((Integer) resultSet.getObject("modifyBy"));
                    user.setModifyDate(resultSet.getDate("modifyDate"));
                    user.setPhone(resultSet.getString("phone"));
                    user.setUserCode(resultSet.getString("userCode"));
                    user.setUserNmae(resultSet.getString("userName"));
                    user.setUserPassword(resultSet.getString("userPassword"));
                    user.setUserRole(resultSet.getInt("userRole"));
                }
                baseDao.release(null,ps,resultSet);


        }
        return user;
    }

5.编写业务层接口

public interface UserService {

    //用户登录
    public User login(String userCode, String password);
}

6.业务层实现类

dao层:dao层叫数据访问层

public class UserServiceImpl implements UserService {
    //业务层都会调用dao层,所以要引入dao层
    private UserDao userDao;
    public UserServiceImpl(){
        userDao = new UserDaoIm();
    }

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

        //调用业务层,获得user实体类对象
        try {
            connection = baseDao.Getconnection();
            user = userDao.getLoginUset(connection, userCode);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            baseDao.release(connection,null,null);
        }
        return user;
    }
}

逻辑图:

7.编写Servlet

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");

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

        if(login!=null){
            //将此用户的信息放到Session中
            req.setAttribute(contents.SESSION_NAME,login);
            //跳转网页,重定向
            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);
    }
}

9.测试访问,确保以上成功

上面登录功能各个层之间的关系:

上面代码有问题未解决_________

登录功能优化

注销功能:

思路:移除session,返回登陆页面

package com.cyz.servlet.user;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.cyz.Contents.contents;

public class LoginOutServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //删除session
        req.getSession().removeAttribute(contents.userSession);
        //重定向到登陆页面
        resp.sendRedirect(req.getContextPath()+"/login.jsp");
    }

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

 

  loginout
  com.cyz.servlet.user.LoginOutServlet

  
    loginout
    /jsp/logout.do
  

登录拦截优化

package com.cyz.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.cyz.Contents.contents;
public class loginFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
            //ServletRequest,ServletResponse
        //把上面的两个接口进行向下转型
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse respon = (HttpServletResponse) resp;
        //判断session的值是不是空的
        if(request.getSession().getAttribute(contents.userSession) == null){
            respon.sendRedirect(request.getContextPath() + "/error.jsp");
        }else {
            //让程序继续执行
          filterChain.doFilter(req, resp);
        }
    }

    public void destroy() {
//销毁
    }
}

  
    loginfilter
    com.cyz.filter.loginFilter
  
  
    loginfilter
    /jsp/*
  

测试,登录,权限,拦截

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号