JAVA WEB大合集(作业+总结+改正)

由于本人的新网站挂掉了不得已重新回到熟悉的老地方CSDN,一起挂掉的还有没来得及转移的JAVAWEB系列文章,只能凭借记忆再重新写一份了QAQ

 (一)如何让页面灰掉

  先右键打开“检查”

 再在Styles处输入

filter: grayscale(0.95);

结果如下所示:

(二)homework to blog

JavaScript在发送AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?

    在回答这个问题前我们需要了解AJAX、绝对地址和相对地址的基本概念。

 AJAX

       Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

 绝对地址

       绝对地址是包含首页域名的完整的网址,带有http和www的链接,指定某一个网址,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。 

相对地址 

       相对路径指的是不包含网站首页域名的网址,而是使用返回某个文件的命令来让网站进入某个页面或者返回首页;相对URL是不完整的,要从相对URL中获取访问资源所需的全部信息,就必须相对另一个被称为基础的URL进行解析。

解释了相关概念后,给出的结论是:发送AjAX请求时,URL的域名地址是相对地址还是绝对地址都可以,两者在发送请求时,服务器访问的地址都会转化为绝对地址。但如果使用相对地址的话,一定要注意填写正确,不然可能导致服务器访问的地址不是你想要的地址。例如使用"login.java",服务器访问的可能是"http://localhost:8080/keti/login.java"。而"/test/login.java",服务器访问的可能是"http://localhost:8080/test/login.java"。最终访问到的结果不同。

(三)homework to blog 

 什么是浏览器跨域访问操作,js如何实现?

浏览器跨域访问指的是,当请求的URL中的协议、域名、端口三个之中有一个与当前页面的URL不同时,浏览器进行访问,就属于跨域。 

一、JSONP方法

什么是Jsonp? Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

JSONP的原理其实就是利用引入script不限制源的特点,把处理函数名作为参数传入,然后返回执行语句。

在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。

比如,有个a.html页面,它里面的代码需要利用ajax获取一个不同域上的json数据,假设这个json数据地址是http://aaa.com/data.php,那么a.html中的代码就可以这样:

<!-- a.html -->
<script>
    function dealData (data) {
        console.log(data);
    }
</script>
 
<script src='http://aaa.com/data.php?callback=dealData'></script>

我们看到获取数据的地址后面还有一个callback参数,按惯例是用这个参数名,但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的,就得按照提供数据的那一方的规定格式来操作了。

因为是当做一个js文件来引入的,所以http://aaa.com/data.php返回的必须是一个能执行的js文件,所以这个页面的php代码可能是这样的:

<?php
    $callback = $_GET['callback'];//得到回调函数名;
    $data = 'data';//要返回的数据;
    echo $callback.'('.json_encode($data).')';//输出。
?>

如果在jQuery中用JSONP的话就更加简单了:

<script>
$.getJSON(''http://aaa.com/data.php?callback=?', function (data) {
    console.log(data);
});
</script>

 (四)HTML的归纳

一、HTML简介

1.什么是HTML?
HTML 是用来描述网页的一种语言。

HTML 指的是超文本标记语言: HyperText Markup Language
HTML 不是一种编程语言,而是一种标记语言 
标记语言是一套标记标签 (markup tag)
HTML 使用标记标签来描述网页
HTML 文档包含了HTML 标签及文本内容
HTML文档也叫做 web 页面

2.HTML 标签

HTML 标记标签通常被称为 HTML 标签 (HTML tag)。

HTML 标签是由尖括号 包围的关键词,比如 <html>
HTML 标签通常是成对出现 的,比如 <b> 和 </b>
标签对中的第一个标签是开始标签,第二个标签是结束标签
开始和结束标签也被称为开放标签 和 闭合标签
<标签>内容</标签>

(1)HTML标签

整个网页是从<html>这里开始的,然后到</html>

(2)head标签

head标签代表页面的“头”,定义一些特殊内容,这些内容往往都是“不可见内容”(在浏览器不可见)。

(3)body标签

body标签代表页面的“身”,定义网页展示内容,这些内容往往都是“可见内容”(在浏览器可见)。

后续笔记讲解的标签都是在<body>标签内部的各种标签。

二、HTML 元素

"HTML 标签" 和 "HTML 元素" 通常都是描述同样的意思.

但是严格来讲, 一个 HTML 元素包含了开始标签与结束标签,如下实例:

HTML 元素:

<p>这是一个段落。</p>

1. 段落标签

(1)段落与文字标签 

表1 段落与文字标签

标签语义说明
<h1>~<h6>header标题
<p>paragraph段落
<br>break换行
<hr>horizontal rule水平线
<div>division分割(块元素)
<span>span区域(行内元素)

(2)文本格式化标签

 表2 文本格式化标签

标签语义说明
<strong><b>strong(加强)

加粗

<em><i>

emphasized(强调)斜体
<del><s>delete(删除)划过
<ins><u>下划线下划
<cite>cite(引用)斜体
<sup>superscripted(上标)上标
<sub>subscripted(下标)下标

2.自闭合标签

HTML标签分为2种,一种是“一般标签”,另外一种是“自闭合标签”。一般标签有开始符号和结束符号,自闭合标签只有开始符号没有结束符号。

一般标签可以在开始符号和结束符号之间插入其他标签或文字。

自闭合标签由于没有结束符号,不能插入其他标签或文字,只能定义自身的属性。

(1)一般标签

举例:<body></body>

(2)自闭合标签

举例:<br/>、<hr/>

 3.图片标签

在HTML中,我们使用img标签来表示图片。

img标签有两个重要属性:alt和title。

alt属性用于图片描述,这个描述文字是给捜索引擎看的。并且当图片无法显示时,页面 会显示alt中的文字。

title属性也用于图片描述,不过这个描述文字是给用户看的。并且当鼠标指针移到图片 上时,会显示title中的内容。

语法:

<img src="" alt="图片描述(给搜索引擎看)" title="图片描述(给用户看)">

表3  img标签常用属性

属性说明
src图像的文件地址
alt图片显示不出来时的提示文字
title鼠标移到图片上的提示文字

4.超链接标签 

 超链接使用a标签,语法如下:

<a href="链接地址" target="目标窗口的打开方式">

表4  <a>标签target属性

target属性值说明
_self默认方式,即在当前窗口打开链接
_blank在一个全新的空白窗口中打开链接
_top在顶层框架中打开链接
_parent在当前框架的上一层里打开链接

我们只需要掌握“_self”和“_blank”这两个属性值就可以了,其他两个用不到。

超链接根据链接对象的不同分为:

  • 外部链接: 例如 < a href="https://www.csdn.net/ "> CSDN</a >。
  • 内部链接:网站内部页面之间的相互链接. 直接链接内部页面名称即可,例如 < a href="index.html"> 首页 </a >。
  • 空链接: 如果当时没有确定链接目标时,< a href="#"> 首页 </a > 。
  • 下载链接: 如果 href 里面地址是一个文件或者压缩包,会下载这个文件。
  • 网页元素链接: 在网页中的各种网页元素,如文本、图像、表格、音频、视频等都可以添加超链接.
  • 锚点链接: 点我们点击链接,可以快速定位到页面中的某个位置.                                        

在链接文本的 href 属性中,设置属性值为 #名字 的形式,如<a href="#two"> 第2集 </a>

找到目标位置标签,里面添加一个 id 属性 = 刚才的名字 ,如:<h3 id="two">第2集介绍</h3>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>超链接标签</title>
</head>
<body>
    <h4>1.外部链接</h4>
    <a href="https://www.csdn.net/" target="_blank"> CSDN</a>
    target 打开窗口的方式  默认的值是 _self 当前窗口打开页面  _blank 新窗口打开页面
    <a href="http:// www.baidu.com" target="_blank">百度</a>
    <h4>2.内部链接: 网站内部页面之间的相互链接</h4>
    <a href="xuankexitong.html" target="_blank">选课系统</a>
    <h4>3.空链接:#</h4>
    <a href="#">点击此处跳转</a>
    <h4>4.下载链接: 地址链接的是 文件 .exe 或者是 zip 等压缩包形式</h4>
    <a href="img.zip">下载文件</a>
    <h4>5.网页元素的链接</h4>
    <a href="http://www.baidu.com"><img src="img.jpg"/></a>
</body>
</html>

 (五)JavaBean

一、JavaBean是什么?

        JavaBean是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能 ,并可以很容易的被重用。实际上总的来说,JavaBean 便是一种JAVA语言写成的可重用组件。

二、JavaBean编写规范

1.属性私有,建议采用包装类型
2.访问器公有,标准的setter/getter驼峰命名形式,故属性名应大于2个字母,不应出现首2字母为大写的情况
3.有无参构造方法
4.实现Serializable接口
5.可以有多参或全参构造方法
6.可以有toString等对象信息展示方法

public class Product implements Serializable {
	private static final long serialVersionUID = 1L;
	private String id;				//商品标识
	private String name;			//商品名称
	private String description;		//商品描述
	private double price;			//商品价格
	private int num;				//商品数量
	
	public Product(){ }
	
	public Product(
			String id,
			String name,
			String description,
			double price,
			int num){
		this.id=id;
		this.name=name;
		this.description=description;
		this.price=price;
		this.num=num;
	}
	
	public String getId() {
		return (this.id);
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return (this.name);
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return (this.description);
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public double getPrice() {
		return (this.price);
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public int getNum() {
		return (this.num);
	}
	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return "Product [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", num="
				+ num + "]";
	}
}

 三、Java Bean在JSP中的应用

在前面我们学习了Java Bean的编写,由于JavaBean是为了重复使用的程序段落具有“Writeonce, run anywhere, reuse everywhere”,即“一次性编写,任何地方执行,所有地方可重用”的特点,所以可以为JSP平台提供一个简单的、紧凑的和优秀的问题解决方案,能大幅度提高系统的功能上限、加快执行速度,而且不需要牺牲系统的性能。同时,采用JavaBean技术可以使系统更易于维护,因此极大地提高了JSP的应用范围。
对Java程序进行打包编译:javac -d . TestBean,JavaBean 开发之后,在jsp中的调用过程:

1.使用〈%@page import=“whc.java.test.*”%〉

2.使用jsp标签指令:

3.jsp设置属性:参数名称必须与Bean中的属性名称一致

4.jsp取得属性

page范围:属性只有在当前页有效,如果跳转到其他页面,则需要重新实例化,适用于:jsp页面操作资源时使用

request范围:属性只保存在一次服务器跳转中

前提:使用跳转才行

session范围:属于保存在一次会话之中,可以使用任意方式连接其他页面,则此对象只实例化一次,适用于:使用jsp直接开发购物车

application范围:属性公有,此对象在整个服务器上只实例化一次;尽量少用,因为application会占用资源
 

<jsp:useBean id=“person” class=“gacl.javabean.study.Person” scope=“page”/>

上面实例化了一个gacl.javabean.study.Person类的对象,那么这个peson对象是怎么实例化出来的呢?index.jsp在执行的过程中首先会翻译成一个servlet,因此我们可以通过查看index.jsp页面生成的servlet的java代码来查看peson对象的实例化过程。
我们通过标记中的id属性标记Bean,以使JSP页面的其余部分可以正确的识别该Bean。使用scope属性来确定该Bean的使用范围。scope属性所决定的使用范围。class属性通知JSP页面从何处查找Bean,即找到Bean的.class文件。在此我们必须同时指定JavaBean的包(package)名和类(class)名,即class=“package.class”,否则JSP引擎将无法找到相应的Bean。

四、举例

1.jsp:useBean 创建javabean

<jsp:useBean id="实例化对象名称" scope="保存范围" class="类完整名称"/>


其中的scope属性一共有page,request,session 和application 4 个属性范围,默认是page;
比如:

<jsp:useBean id="student" scope="session" class="com.model.Student"/> 

则定义了一个session属性


3、:jsp:setProperty 设置javabean 属性值

<jsp:setProperty property="属性名称" name="实例化对象的名称" value="属性值" param="参数名称"/>

比如:

<jsp:useBean id="student" scope="request" class="com.model.Student"/>
<jsp:setProperty property="name" name="student"/>
<jsp:setProperty property="age" name="student" value="100"/>

备注:Property=”*” 自动匹配所有
4、jsp:getProperty 获取javabean 属性值

<jsp:getProperty property="属性名称" name="实例化对象的名称"/>


比如:

<jsp:useBean id="student" scope="request" class="com.model.Student"/>
<h1>姓名:<jsp:getProperty property="name" name="student"/></h1>
<h1>年龄:<jsp:getProperty property="age" name="student"/></h1>

5、javabean 的保存范围

Javabean 的保存范围有page,request,session.application,默认是page;
其中 sesssion是保存到浏览器的缓存中,但是换了另一个浏览器会失效

application是保存到服务器中,不受浏览器影响

6、javabean 删除

Page 范围:

pageContext.removeAttribute(“javaBean Name”);


request 范围:

request.removeAttribute(“javaBean Name”);


session 范围:

session.removeAttribute(“javaBean Name”);


application 范围:

application.removeAttribute(“javaBean Name”);

 (六)Java Servlet

 一、什么是Servlet

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Servlet其实就是一个遵循Servlet开发的java类,由服务器调用的,运行在服务器端。
Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。

二、一个Http请求是怎样流转的

Tomcat将浏览器提交的请求封装成HttpServletRequest对象,同时将输出流封装成HttpServletResponse对象。
浏览器 --网络请求--> Web容器 --> 我们自己的程序(Servlet、JSP、业务逻辑代码)--> Web容器 --网络响应-->浏览器。

三、Java Web的演变过程

(1).Servlet + jdbc + jsp
(2).Spring + Struts2+ Hibernate(SSH)
(3).Spring + SpringMVC + Mybatis(SSM)
(4).微服务阶段

四、Servlet的生命周期

创建(加载Servlet):当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁。

五、常用的 ServletAPI 说明

(1).HttpServlet (Servlet 类,就是用于定义接收页面请求,然后处理业务代码的一个 servlet 的父类)
(2).HttpServletRequest ,请求,用于获得请求信息(如:路径、端口、数据等)
(3).HttpServletResponse,响应,用于输出动态页面,输出流、重定向等。
(4).ServletConfig,Servlet 初始化参数配置接口,用于获得 web.xml 的初始化参数

HttpServletRequest 常用方法:
String getContextPath()  获取上下文路径
String getHeader(String headName)  根据指定的请求头获取对应的请求头的值.
String getRequestURI()  返回当期请求的资源名称. 上下文路径/资源名
StringBuffer getRequestURL()  返回浏览器地址栏的内容
String getRemoteAddr()  返回请求服务器的客户端的IP

获取请求参数的方法:
String getParameter(String name)  根据参数名称,获取对应参数的值.
String[] getParameterValues(String name)  根据参数名称,获取该参数的多个值.
Enumeration getParameterNames()  获取所有请求参数的名字
Map getParameterMap()  返回请求参数组成的Map集合.

HttpServletResponse 常用方法:
OutputStream getOutputStream():  获取字节输出流:文件下载
Writer getWriter()  获取字符输出流:输出内容
resp.setContentType("text/html;charset=utf-8")  设置文件输出的编码格式和内容类型
resp.sendRedirect()  302重定向,临时跳转

六、使用

pom.xml加上 Servlet-api 依赖
新建一个XxxServelt 继承于 HttpServlet
resp.getWriter().println()
web.xml 增加 servlet servlet-mapping
httpServletRequest(输入) 和 httpServletResponse(输出)
重定向 Redirect,转发 forward。
Redirect 通过 httpServletResponse 下发,返回http status Code 302 和 新地址,浏览器地址栏会发生变化。2次(独立)请求。可以跳外部
forwared 通过 httpServletRequest 完成,浏览器地址不发生变化,一次请求。只能是本应用内。

七、三种作用域范围(Attitude)

Request 请求域 作用范围->单次请求(包括了forward)
Session 会话域。Cookie:session-id。
Application 应用域。重启失效。

(七) 会话跟踪技术 

何为会话跟踪技术?会话跟踪技术是对同一个用户对服务器的连续请求和接收响应的监视。简单来说就是为了数据共享,将用户与同一用户发出的不同请求之间关联起来。

一、会话跟踪技术为何存在?

进行Web应用程序开发时,时常需要能够进行数据共享或者在不同页面之间可以传递参数,除此外,一个会话的数据可能会在不同的地方使用。故而就需要有专门的机制来传递和保存这些数据。 
我们知道,客户端与服务器端之间是通过HTTP进行通信的,但HTTP是无状态的,不能保存客户的信息,那么会话信息如何跟踪保存呢?为了让会话的过程受到监控,便有了会话跟踪技术。 

二、常见的会话跟踪技术

常见的会话跟踪技术主要有4种,但课上只强调了前三种,故仅列出3种:

1.Cookie(本地):键值对

一个 Cookie 是一个小的,已命名数据元素。Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。
对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在客户端内存中,称为临时Cookie,浏览器关闭后,这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。此后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内。 这样就实现了对客户的跟踪。 

     //如果cookie中有customer信息,就放到session中
     boolean checkCustomerCookie(HttpServletRequest request) throws UnsupportedEncodingException {
        Cookie[] cookies = request.getCookies();
         if (cookies != null) {
            for (Cookie cookie : cookies) {
                String cookieName = cookie.getName();
                //如果有,解密后拿cookie中的值和数据库中的值进行比较
                if (Constant.cookieCustomerKey.getName().equals(cookieName)){
                    String cookieValue = cookie.getValue();
                    String decry = EncrypUtils.Base64Util.decry(cookieValue);
                    Customer customer1 = JsonUtils.stringToObject(decry, Customer.class);
                    Customer customer2 = customerService.checkLogin(customer1.getPhoneNumber(), customer1.getPassword());
                    if (customer2 != null){
                        //放入到session中,放行
                        request.getSession().setAttribute("customer",customer2);
                        //自动登录时,更新用户的在线状态
                        Customer onlineCustomer = new Customer();
                        onlineCustomer.setId(customer2.getId());
                        onlineCustomer.setOnlineStatus(String.valueOf(Constant.ONLINESTATUS.getCode()));
                        customerService.updateById(onlineCustomer);
                        return true;
                    }
                }
            }
         }
        return false;
    }

2.Session技术(服务器):键值对

代表与用于某个web客户端的一个用户体验相关的对象和属性。是最常用的一种会话跟踪技术

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象。

session.setMaxInactiveInterval(2*3600);//session 保存俩小时
 
Cookie cookie=new Cookie("JSESSIONID",session.getId());//sessionid放到cookie中
 
cookie.setMaxAge(2*3600);//客户端的cookie也保存俩小时
 
cookie.setPath("/");//cookie作用范围设为整个项目
 
response.addCookie(cookie);//给浏览器返回该Cookie

3.URL 重写(传参):

URL 可以在后面附加参数,和服务器的请求一起发送。

package edu.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class EncodeURL extends HttpServlet {
 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        request.getSession();  //创建session
        //调用response的encodeURL方法,将自动将JSESSION追加到url后面,如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4
        String buyurl = response.encodeURL("/CookieAndSession/servlet/buy");
        String payurl = response.encodeURL("/CookieAndSession/servlet/pay");
        out.print("<a href='"+buyurl+"'>购买</a><br/>");
        out.print("<a href='"+payurl+"'>结账</a><br/>");
        
	}
 
}

(八)过滤器

 一、基本介绍

1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
2、Filter 过滤器它是 JavaEE 的规范。也就是接口
3、Filter 过滤器它的作用是:拦截请求,过滤响应

拦截请求常见的应用场景有: 权限检查 、日记操作 和事务管理等

二、使用步骤

Filter 过滤器的使用步骤:
1、编写一个类去实现 Filter 接口
2、实现过滤方法 doFilter()
3、到 web.xml 中去配置 Filter 的拦截路径(springboot不用配)
使用springboot一个配置类(加上@Configuration),实现Filter接口(javax.servlet包下,别引错包),实现3个方法,
init、doFilter、destroy。分别是初始化,过滤拦截,销毁

三、Filter的生命周期

Filter 的生命周期包含几个方法
1、构造器方法
2、init 初始化方法 在第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
3、doFilter 过滤方法 每次拦截到请求,就会执行
4、destroy 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

四、FilterConfig 的含义

在重写init方法后

 @Override
    public void init(FilterConfig filterConfig) throws ServletException {
}

这里的参数FilterConfig 类,它是 Filter 过滤器的配置文件类,Tomcat 每次创建 Filter的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
1、获取 Filter 的名称 filter-name 的内容(在web.xml中的filter-name里指定,springboot是在@WebFilter(filterName = "myFilter")
2、获取在 Filter 中配置的 init-param 初始化参数 (web.xml是在/init-param指定,springboot是在initParams = @WebInitParam(name = “key”,value = “中国”)指定)
3、获取 ServletContext 对象
以下是springboot使用Filter并获取初始数据的示例:

@WebFilter(filterName = "myFilter",urlPatterns = "/**",initParams = @WebInitParam(name = "key",value = "中国"))
public class IdsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String filterName = filterConfig.getFilterName();
        String initParameter = filterConfig.getInitParameter("key");
        System.out.println("初始化………………");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("doFilter………………");
        chain.doFilter(request,response);
    }
    @Override
    public void destroy() {
        System.out.println("销毁………………");
    }
}

 注意这样指定必须在启动类上加上扫描范围:@ServletComponentScan

@SpringBootApplication
@ServletComponentScan(basePackages = "com.atpingan.idsparent.config")
public class IdsParentApplication {
    public static void main(String[] args) {
        SpringApplication.run(IdsParentApplication.class, args);
    }
}

如果不加@ServletComponentScan,那就在配置类使用@Configuration,不传参。cas-client就是这个套路,初始化用来加载cas-config.properties文件内容。

@WebFilter注解详解
@WebFilter注解用于将一个类声明为过滤器,该注解在部署时被容器处理,容器根据具体的配置将相应的类部署为过滤器。
常见参数:
filterName:指定过滤器的名称,等价于web.xml中的<filter-name>元素,如果没有显示指定,那么,使用Filter的完全限定名作为名称。
urlPatterns:指定一组过滤器的URL匹配模式,等价于web.xml中的<url-pattern>
value:等价于urlPatterns。这两个属性不能同时使用
servletNames:指定过滤器用于哪些Servlet,等价于web.xml中的<servlet-name>
initParams:指定一组过滤器参数(每一个参数用@WenInitParam标识),等价于web.xml中的<init-param>
例如:

@WebFilter( filterName="authorityFilter", urlPatterns={"/*"}, initParams={ @WebInitParam(name="encoding",value="UTF-8"), @WebInitParam(name="loginPage",value="login.jsp") } )

(八)Ajax技术

一、传统网站存在的问题

  1. 网速慢的情况下,页面加载时间长,用户只能等待
  2. 表单提交后,如果一项内容不合适,需要重新填写所有的表单内容,使用效果差。
  3. 页面跳转,就会重新加载页面,造成资源浪费,增加用户等待时间。

 二、Ajax的应用场景

  1. 页面上拉加载更多数据
  2. 列表数据无刷新分页
  3. 表单项离开焦点数据验证
  4. 搜索框提示文字下拉列表

三、 Ajax的基本使用步骤

 1.创建Ajax对象

var xhr = new XMLHttpRequest();

2.告诉Ajax请求地址以及请求方式

xhr.open('get','http://www.example.com');

3.发送请求

xhr.send();

4.获取服务器端与客户端的响应数据

//设置监听器,等到服务器发送响应之后便执行下面的函数
xhr.onload = function () {
	console.log(xhr.requestText);
}

四、请求参数传递

GET请求方式

xhr.open('get','http://www.baidu.com?name=wanying&age=20')

POST请求方式

//设置请求头Content-Type,告诉服务器当前请求参数的格式是字符串
xhr.setRequestHeader('content-Type',
	'application/x-www-form-urlencoded');
xhr.send('name=wanying&age=20')

五、请求参数的格式
1.application/x-www-form-urlencoded

name=wanying&age=20

2.application/json

{name:'wanying',age:'20',sex:'女'}

服务器一般是以JSON对象传输数据,以下是JSON对象的两个重要方法:

parse() 将字符串转换成json对象
stringify() 将json对象转换成json字符串
注意:get请求不能提交json对象数据格式,传统网站的表单提交也不支持json对象数据格式的。

六、获取服务器端的响应

Ajax状态码

在创建ajax对象,配置ajax对象,发送请求,以及接收服务器端的响应数据,这个过程中的每一个步骤都会对应一个数值,这个就是ajax状态码。
0:请求未初始化(还没有调用open())
1:请求已经建立,但是还没有发送(还没有调用send())
2:请求已经发送
3:请求正在处理中,通常响应中已经有部分数据可以用了
4:响应已经完成,可以获取并使用服务器的响应了

xhr.readyState //获取Ajax状态码
var xhr = new XMLHttpRequest();
//0 已经创建了还没有初始化
console.log(xhr.readyState);
xhr.open('get','http://www.baidu.com');
//1 请求已经建立,但还没发送
console.log(xhr.readyState);
//当Ajax状态码改变后触发,必须要写在send之前
xhr.onreadyStateChange = function (){
	//2 请求已经发送
	//3:请求正在处理中,通常响应中已经有部分数据可以用了
	//4:响应已经完成,可以获取并使用服务器的响应了
	console.log(xhr.readyState);
}
xhr.send();

七、获取服务端响应的两种方法

1.利用onload

xhr.send();
xhr.onload = function () {
	console.log(xhr.requestText);
}

2.通过readyState状态码

xhr.onreadyStateChange = function (){
	if(xhr.readyState == 4) {
		console.log(xhr.responseText);
	}
}
xhr.send();

(八)Json 

一、什么是json?   

JSON全称是JavaScript Object Notation,是一种轻量级的数据交换格式。JSON 与XML具有相同的特性,是一种数据存储格式,但是JSON相比XML 更易于人编写和阅读,更易于生成和解析。

二、JSON的语法规则: 

1.数据以名称/值对的形式保存,名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值,如 :"firstName" : "John"。JSON的值可以是数字、字符串、null、true、false、数组或对象。
2.数据有都好分隔。
3.花括号保存对象,对象可以包含多个名/值对。
4.方括号保存数组,数组可以包含多个对象。
5.JSON文件:

JSON 文件的文件类型是 ".json"

JSON 文本的 MIME 类型是 "application/json"

三、JSON 的两种结构:

1。键值对形式,即Name-Value对的结构结构集合(无序的 )。如:

{name1:value1.name2:value2,...};
{"name":"小明","age":"12"}


2.Array(有序的):一组有序的数据列表。例如:[value1,value2,value3,.....],其中,值可以是双引号引起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(Array),这些结构都是可以嵌套的。如:
例一:对象中可以包含数组

{"root":[{"id":"001","name":"小红"},{"id":"002","name":"小明"},{"id":"003","name":"小丽"}],"total":3,"success":true}


例二:也可以对象嵌套子对象,子对象再嵌套数组:

{"memberList":{"lists":[{"id":"001","name":"小红"},{"id":"002","name":"小明"},{"id":"003","name":"小丽"}]}}

例三:数组中可以包含对象:
 

[{"id":"001","name":"小红"},{"id":"002","name":"小明"},{"id":"003","name":"小丽"},........]


4.JSON 的取值方式和修改方式:
如:

var employees = [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName": "Carter" } ];

取值:

employees[0].lastName

修改数据:

employees[0].lastName="Jobs"


五、JSON与字符串之间的转化方法:

JSON转换为字符串(string)格式

var string=JSON.stringify(obj);


将Json字符串转换为JSON:
1.

var data=JSON.parse(string);
    function strToJson(){
      return JSON.parse(str);
    }
    使用JSON.parse需严格遵守JSON规范,如属性都需要用引号引起来,否则会出错,如下:
      var str = '{name:"jack"}';
      var obj = JSON.parse(str); // --> parse error

name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。(下面这两种方式则没有问题)
2.eval(string);               
例如:

function myEval(){
          var str='{"id":"001","name":"小明","age":10}';
          var obj=eval('('+str+')');
          alert(obj.toJSONString());
      }

3.new Function形式

 function strToJson(str){
        var json=(new Function("return"+str))();
      }

(九) Web系统开发实习总结

一、前后端代码同步的问题

本次实习任务由队长负责前端和数据库,另一名成员负责后端设计。由于上机时间较短,两名成员并不能时刻线下沟通,这就造成了代码难以同步的问题,由此,我们使用了IDEA中gitee的代码同步功能,每位成语手上都有一个副本,成员可以随时修改手上的副本并push到gitee代码仓库,其他成员也可以将这位成员的修改的部分进行update。且gitee还支持代码回退的功能,当某位成员的修改导致程序出现问题时,便可以使用此功能进行代码的回退,返回到任意历史版本。

gitee我的主页

git 的log日志(部分)

二、navicat版本过高问题

本人在检查页面显示的时候发现前端显示数据接口请求异常。

 

 在IDEA查看其报错时发现,使用group by语句使其出现报错,对报错原因进行百度发现,在高于5.4版本的MySQL使用group by就会出问题:

查找得到的原因

解决方法:在数据库中使用这两条语句进行修改即可。

解决方法

 修改后成功界面: 

成功界面

 这里是结尾~~

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 总体介绍 本次项目主要以本学期所学内容为基础,采用servlet+jsp+jdbc的技术以及mvc模式进行项目开发,本次开发的内容主要以实现CRUD核心功能为主的教务管理系统,分为学生端和教师端,前端采用jquery进行数据传输以及处理,bootstap写界面。 2. 技术架构 运行环境:tomcat9+mysql5+maven3.8+jdk8 前端技术:jquery 用以数据处理以及前端验证以及生成验证码等等 Bootstrap 前端界面处理 后端技术:servelt+jsp maven进行jar包和第三方库管理 采用jspsmart进行文件的操作处理 数据库:mysql5 基于MVC的分层思想及采用jsp+servelt技术的B/S结构的应用系统,系统主要开发语言为JAVA,JSP。数据库要求使用MySQL8.0,应用服务器选用Tomcat服务器 3. 功能介绍 系统能够提供用户有好的界面 系统具有良好的允许效率 系统具有良好的扩充性,灵活性 系统管理操作简单易懂 3.1 总体结构 3.2 模块详情 学生模块: 注册: 1. 用户点击注册,进行注册; 2. 用户输入注册信息; 3. 校验数据:如果用户名重复或者两次密码校验不合格或者密码规格不符合,则提示错误信息; 4. 若信息无错误,提示注册成功,跳转到登录页。 登录: 1. 用户进入系统未进行登录则自行跳转登录页面; 2. 点击忘记密码可进行密码找回; 3. 提交信息进行校验,查看用户名密码是否为空以及是否符合格式,随后在后台进行校验,合格则进行登录跳转到用户界面; 4. 若登录信息不正确,则提示登录错误信息。 查看成绩: 1. 点击查看成绩,打印成绩列表; 2. 支持到处成绩单为pdf格式。 导出成绩: 1. 点击到处按钮; 2. 系统自动处理并到处成pdf。 个人信息管理: 1. 选择上传头像 2. 修改个人信息:按需填写个人信息,随后进行保存则覆盖修改以往的个人信息。 退出登录: 1. 点击退出登录,自动退出到首页并删除本地和服务器缓存。 教师模块: 注册: 1用户点击注册,进行注册; 2用户输入注册信息; 3校验数据:如果用户名重复或者两次密码校验不合格或者密码规格不符合,则提示错误信息; 4若信息无错误,提示注册成功,跳转到登录页。 登录: 1用户进入系统未进行登录则自行跳转登录页面; 2点击忘记密码可进行密码找回; 3提交信息进行校验,查看用户名密码是否为空以及是否符合格式,随后在后台进行校验,合格则进行登录跳转到用户界面; 4若登录信息不正确,则提示登录错误信息。 个人信息管理: 1选择上传头像 2修改个人信息:按需填写个人信息,随后进行保存则覆盖修改以往的个人信息。 学生管理: 1. 点击添加学生,填写学生信息进行添加; 2. 修改学生信息,点击修改,按需填写要修改的学生信息,进行保存覆盖修改; 3. 点击删除学生数据,提示是否删除,确定则删除,取消则不删除; 4. 查看成绩,点击查看学生成绩,单独列出学生成绩列表; 成绩管理: 1. 点击成绩管理,列出所有学生成绩; 2. 点击修改,勾选需要修改的学生,按需填写修改信息,保存覆盖修改学生信息。 退出登录: 1点击退出登录,自动退出到首页并删除本地和服务器缓存。 4. 页面设计 静态jsp页面和jquery和bootstrap 5. 数据库设计 权限对照表: 表名: role 名称 类型 长度 允许空值 是否主键 注释 uid 整型 11 否 是 权限等级 utype 字符 255 否 否 用户等级名称 分数表: 表名: score 名称 类型 长度 允许空值 是否主键 注释 id 整型 200 否 是 学号 dat 字符 255 否 否 课程1分数 Android 字符 255 否 否 课程2分数 Jsp 字符 255 是 否 课程3分数 学生表: 表名: student 名称 类型 长度 允许空值 是否主键 注释 id 整型 59 否 是 学号 password 字符 255 否 否 登陆密码 Name 字符 255 否 否 学生姓名 Sex 字符 255 是 否 性别 School_date 字符 255 是 否 入学时间 Major 字符 255 是 否 专业 email 字符 255 是 否 邮箱 教师表: 表名: student 名称 类型 长度 允许空值 是否主键 注释 id 整型 59 否 是 教师工号 password 字符 255 否 否 登陆密码 Name 字符 255 否 否 教师姓名 Sex 字符 255 是 否 性别 email 字符 255 是 否 邮箱

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值