自定义MVC的初步实现

news2024/11/25 12:44:52

文章目录

  • 前言
  • 一、 工作流程图
  • 二、简单的实现自定义MVC
    • Controller层——Servlet
      • 中央控制器
      • 子控制器
      • 具体Action类
    • view层——JSP
  • 三、初步实现自定义MVC
    • 简单MVC架构中的问题
    • 3.1 配置XML文件
    • 3.2 建模
    • 3.2 Servlet
    • 3.3 jsp

前言

在上一篇博客,我们介绍了MVC的演变过程,以及简单地实现了自定义MVC,在这篇博客中,我们进一步优化代码

一、 工作流程图

在这里插入图片描述

二、简单的实现自定义MVC

  • 创建一个能处理所有前端发送过来请求的Servle,即中央控制器,拿到所有方法的反射代码就在这里,并根据请求的类型调用相应的业务逻辑(去子控制器)
  • 创建一个子控制器,用于处理特定的用户请求或操作,这是真正处理用户请求的Servlet
  • 创建一个定义方法的Servlet,继承子控制器,供子控制器调用方法

Controller层——Servlet

中央控制器

package com.xqx.framework;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/** 中央控制器 即工作流程图中的ActionServlet
 * @author W许潜行
 * 2023年6月29日 下午8:10:04
 */
@WebServlet("*.action")
public class DispatherServlet extends HttpServlet {
	Map<String,Action> mapAction=new HashMap<>();
	/**
	 * 初始化方法
	 */
	public void init() throws ServletException {
		mapAction.put("/book", new BookAction());
		super.init();
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//得到传过来的路径名
		String uri = request.getRequestURI();// /J2EE_MVC/book.action
		//得到请求的类
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));// /book
		//拿到对应的action
		Action action = mapAction.get(uri);
		//调用方法
		action.execute(request, response);
	}

}

当有请求进入时,我们首先获取请求的URI,并从中获取类似"/book"的路径名。然后,我们使用这个路径名作为键在mapAction中查找对应的Action对象。最后,执行该Action的execute方法来处理请求。

这个DispatcherServlet类的目的是根据传入的请求路径来分发请求给不同的Action类处理,通过这种方式实现请求的路由和控制,实现了基本的MVC模式

子控制器

package com.xqx.framework;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 字控制器,真正处理请求的类
 * 
 * 
 * @author W许潜行 2023年6月29日 下午8:17:41
 */
public class Action {
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 拿到jsp传来的method
		String method = request.getParameter("method");
		try {
			Method m = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
			m.setAccessible(true);
			m.invoke(this, request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这个Action类的作用是通过反射机制根据传入的method参数值来调用具体的方法进行请求处理。每个实际的Action类都可以继承这个基类,并重写具体的方法来实现自己的业务逻辑。

具体Action类

package com.xqx.framework;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**定义crud方法
 * @author W许潜行
 * 2023年6月29日 下午8:55:46
 */
public class BookAction extends Action{
	public void list(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("list");
	}

	public void upd(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("upd");
	}

	public void del(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("del");
	}

	public void add(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("add");		
	}
}

view层——JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;  charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>极易MVC</h1>
<a href="bookAdd.action">新增</a>
<a href="bookDel.action">删除</a>
<a href="bookUpd.action">修改</a>
<a href="bookList.action">查看</a>
<hr>
<h1>简易MVC</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
<hr>
<h1>普易MVC</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
</body>
<h1>MVC架构初实现</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
</body>
</html>

打印结果:
在这里插入图片描述
简单的MVC架构就基本完成了,但还有很多优化之处,接下来我们来优化。

三、初步实现自定义MVC

简单MVC架构中的问题

既然要做到通用,那里面就不能出现写死的类呀
在这里插入图片描述
怎样可以灵活地拿到所有要初始化的地址/类呢?

答案是:通过反射建模完成,将所需要操作的类,在XML文件中配置即可

3.1 配置XML文件

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<action path="/order" type="com.xqx.framework.OrderAction">
		<forward name="list" path="res.jsp" redirect="false" />
		<forward name="toList" path="res.jsp" redirect="true" />
	</action>
	<action path="/book" type="com.xqx.framework.BookAction">
		<forward name="list" path="res.jsp" redirect="false" />
		<forward name="toList" path="res.jsp" redirect="true" />
	</action>
</config>

3.2 建模

ForwardModel

package com.xqx.framework.model;

public class ForwardModel {
	
	private String name;
	private String path;
	private boolean redirect;
	public ForwardModel() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Forward [name=" + name + ", path=" + path + ", redirect=" + redirect + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public boolean isRedirect() {	
		return redirect;
	}
	public void setRedirect(boolean redirect) {
		this.redirect = redirect;
	}
	public ForwardModel(String name, String path, boolean redirect) {
		super();
		this.name = name;
		this.path = path;
		this.redirect = redirect;
	}
	
	
}

ActionModel

package com.xqx.framework.model;

import java.util.HashMap;
import java.util.Map;

public class ActionModel {

	private String path;
	private String type;
	private Map<String, ForwardModel> fMap = new HashMap<>();

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}
	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Map<String, ForwardModel> getfMap() {
		return fMap;
	}

	public void setfMap(Map<String, ForwardModel> fMap) {
		this.fMap = fMap;
	}

	public void push(ForwardModel fd) {
		fMap.put(fd.getName(), fd);

	}

	public ForwardModel pop(String name) {

		return fMap.get(name);
	}

}

ConfigModel

package com.xqx.framework.model;

import java.util.HashMap;
import java.util.Map;

public class ConfigModel {


	private Map<String, ActionModel> aMap = new HashMap<String, ActionModel>();

	public void push(ActionModel ac) {
		aMap.put(ac.getPath(), ac);

	}

	
	public ActionModel pop(String path) {

		return aMap.get(path);

	}
}

ConfigModelFactory

package com.xqx.framework.model;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ConfigModelFactory {
	public static ConfigModel build() throws Exception {
		String xPath = "/config.xml";
		return build(xPath);

	}

	public static ConfigModel build(String xPath) throws Exception {

		ConfigModel cm = new ConfigModel();
		InputStream is = ConfigModelFactory.class.getResourceAsStream(xPath);
		SAXReader sr = new SAXReader();
		Document doc = sr.read(is);
		List<Element> action = doc.selectNodes("//action");
		for (Element actionEle : action) {
			ActionModel am = new ActionModel();
			am.setPath(actionEle.attributeValue("path"));
			am.setType(actionEle.attributeValue("type"));
			List<Element> forward = actionEle.selectNodes("forward");
			for (Element forwardEle : forward) {
				ForwardModel fm = new ForwardModel();
				fm.setName(forwardEle.attributeValue("name"));
				fm.setPath(forwardEle.attributeValue("path"));
				fm.setRedirect(!"false".equals(forwardEle.attributeValue("redirect")));
				am.push(fm);
			}
			cm.push(am);
		}
		return cm;
	}

建模的详细介绍——>建模详解

3.2 Servlet

中央控制器

package com.xqx.framework;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.xqx.framework.model.ActionModel;
import com.xqx.framework.model.ConfigModel;
import com.xqx.framework.model.ConfigModelFactory;
import com.xqx.framework.model.ForwardModel;

/**
 * 中央控制器 即工作流程图中的ActionServlet
 * 
 * @author W许潜行 2023年6月29日 下午8:10:04
 */
@WebServlet("*.action")
public class DispatherServlet extends HttpServlet {
	// Map<String,Action> mapAction=new HashMap<>();
	// 之前子控制器在Map里,现在xml文件里
	private ConfigModel configModel;

	/**
	 * 初始化方法
	 */
	public void init() throws ServletException {
		// mapAction.put("/book", new BookAction());
		try {
			// 包含所有子控制器
			configModel = ConfigModelFactory.build();
		} catch (Exception e) {
			e.printStackTrace();
		}
		super.init();
	}

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 得到传过来的路径名
		String uri = request.getRequestURI();// /J2EE_MVC/book.action
		// 得到请求的类
		uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));// /book
		// 拿到对应的type
		ActionModel actionModel = configModel.pop(uri);
		if (actionModel == null) {
			throw new RuntimeException("action is null");
		}
		String type = actionModel.getType();
		try {
			// 类实例
			Action action = (Action) Class.forName(type).newInstance();
			if (action instanceof ModelDriver) {
				ModelDriver md=(ModelDriver) action;
				Object model = md.getModel();
				Map<String, String[]> parameterMap = request.getParameterMap();
				BeanUtils.populate(model, parameterMap);
			}
			// 调用方法 list/toList
			String execute = action.execute(request, response);
			// 为了动态配置业务代码执行完毕将会转发/重定向到指定页面
			ForwardModel forwardModel = actionModel.pop(execute);
			if (forwardModel == null) {
				System.out.println("定义跳转一个错误页面...");
				return;
			}
			if (!forwardModel.isRedirect()) {
				response.sendRedirect(request.getContextPath() + "/" + forwardModel.getPath());
			} else {
				request.getRequestDispatcher(forwardModel.getPath()).forward(request, response);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

init()方法用于初始化,在该方法中,从配置文件中构建了一个ConfigModel实例,该实例包含了所有的子控制器的配置信息

在doPost()方法中,首先获取请求的URI,然后从URI中提取出请求的类名,即控制器名称。

根据控制器名称从configModel中获取相应的ActionModel对象,ActionModel对象包含了具体控制器的配置信息,包括控制器类的全名和该控制器的执行结果与转发/重定向的配置

根据ActionModel对象中的控制器类名实例化一个控制器对象,并判断控制器是否实现了ModelDriver接口,如果实现了,将请求参数封装到模型对象中。调用控制器的execute()方法执行具体的业务逻辑,返回执行结果。

根据执行结果从ActionModel对象中获取相应的ForwardModel对象,ForwardModel对象包含了执行结果对应的转发/重定向路径的配置信息

根据ForwardModel对象判断是进行转发还是重定向操作,然后将请求转发或重定向到相应的页面

如果没有找到对应的ActionModel或ForwardModel,则打印错误信息。

子控制器

package com.xqx.framework;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 子控制器,真正处理请求的类
 * 
 * 
 * @author W许潜行 2023年6月29日 下午8:17:41
 */
public class Action {
	public String  execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 拿到jsp传来的method
		String method = request.getParameter("method");
		String res = null;
		try {
			Method m = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
			m.setAccessible(true);
			//拿到方法返回的值 list/toList
			res = (String) m.invoke(this, request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return res;//
	}
}

该Action类的作用是通过动态调用不同的方法来执行不同的业务逻辑,并根据方法的返回值作为执行结果返回给调用者

模型驱动接口

package com.xqx.framework;

/**模型驅動接口
 * @author W许潜行
 * 2023年7月2日 下午7:17:02
 * @param <T>
 */
public interface ModelDriver<T> {
	T getModel();
}

BookAction

package com.xqx.framework;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xqx.entity.Book;

/**
 * 定义crud方法
 * 
 * @author W许潜行 2023年6月29日 下午8:55:46
 */
public class BookAction extends Action implements ModelDriver<Book>{
	Book book=new Book();
	public String list(HttpServletRequest request, HttpServletResponse response) {
		
//		String bid = request.getParameter("bid");
//		String bname = request.getParameter("bname");
//		String price = request.getParameter("price");
//		book.setBid(Integer.valueOf(bid));
//		book.setBname(bname);
//		book.setPrice(Float.valueOf(price));
		//得到所有参数
//		Map<String, String[]> bookMap = request.getParameterMap();
		request.setAttribute("content", "hello");
		System.out.println("BookActionlist");
		return "toList";
	}

	public String upd(HttpServletRequest request, HttpServletResponse response) {
		request.setAttribute("content", "hello");

		System.out.println("BookActionupd");
		return "list";
	}

	public String del(HttpServletRequest request, HttpServletResponse response) {
		request.setAttribute("content", "hello");

		System.out.println("BookActiondel");
		return "list";
	}

	public String add(HttpServletRequest request, HttpServletResponse response) {
		request.setAttribute("content", "hello");

		System.out.println("BookActionadd");
		return "list";
	}

	@Override
	public Book getModel() {
		// TODO Auto-generated method stub
		return book;
	}
}

通过继承Action类和实现ModelDriver接口,BookAction类提供了具体的业务方法,并且通过实现getModel()方法,将创建的Book对象作为模型对象,方便在控制器中使用和操作。

这样,当请求调用BookAction类的方法时,可以进行相应的业务处理,并将结果封装到模型中,方便在JSP中展示或进行后续操作。

3.3 jsp

bookList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;  charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>极易MVC</h1>
<a href="bookAdd.action">新增</a>
<a href="bookDel.action">删除</a>
<a href="bookUpd.action">修改</a>
<a href="bookList.action">查看</a>
<hr>
<h1>简易MVC</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
<hr>
<h1>普易MVC</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
</body>
<h1>MVC架构简单实现</h1>
<a href="book.action?method=add">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
</body>
<h1>MVC架构初实现</h1>
<a href="book.action?method=add&&bid=1&&bname=aa&&price=9.9">新增</a>
<a href="book.action?method=del">删除</a>
<a href="book.action?method=upd">修改</a>
<a href="book.action?method=list">查看</a>
</body>
</html>

res.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;  charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
res页面,参数为:${content}
</body>
</html>

打印结果:
点击新增:
在这里插入图片描述

点击查看:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为、华三、锐捷、飞塔、山石的抓包命令

一、华为的抓包命令 1、基本概念 华为的抓包行为称之为镜像端口&#xff0c;也就是说将需要抓取的接口上&#xff08;称为镜像端口&#xff09;的流量复制一份到另一个接口上&#xff08;工程师进行流量观察的端口&#xff0c;称为观察端口&#xff09;&#xff0c;如下图所示…

23年hadoop单机版+hive

文章目录 说明分享环境信息安装jdkhadoop配置core-site.xml mysqlhive安装配置hive-site.xml配置hive-env初始化mysql数据库启动验证hive命令hiveserver2方式 总结 说明 工作需要研究hive功能&#xff0c;线上环境不能动&#xff0c;搭建单机版hadoophive测试环境&#xff0c;使…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…

搜索团队的技术小结

搜索业务形态 CSDN作为开发者内容中心&#xff0c;主要通过分发博客和商业产品&#xff08;下载资源&#xff09;满足用户碎片化学习需求&#xff1b;产品形态上通过以下3种方式来承接用户需求 1. 站内搜索框 2. 博客相关推荐 3. 下载相…

前端基础知识学习——滑动门(利用背景图像的可层叠性 创造特殊效果)

滑动门&#xff1a;利用背景图像的可层叠性&#xff0c;并允许他们在彼此之上进行滑动&#xff0c;以创造一些特殊的效果。 举例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

Linux快速搭建Java环境

1. 安装JDK运行与调试 搭建Java环境 1. 安装JDK 打开命令行执行 sudo apt install default-jdk 有确定的选项直接y就行 安装拓展: 1 . 有时候vscode会自动弹出消息叫你安装拓展,直接点击全部安装就行了 2 . 未弹出或安装失败解决: 打开拓展搜索,把下面的,全部安装就行 这样就可…

适合小企业的小型CRM软件如何选择

市场上有很多小型CRM软件&#xff0c;但很多企业在选型时不知道如何选择&#xff0c;应该考虑哪些因素&#xff0c;什么样的小型CRM软件好&#xff1f;推荐您选择专为小企业设计的CRM客户管理系统。 1、适合初学者&#xff1a; 适合没有使用过CRM软件的企业或个人&#xff0c…

ApiJson json转sql部分示例

ApiJson json转sql部分示例&#xff08;关于json较多&#xff0c;仅供自己快速回顾&#xff09; 首先提供腾讯的APIJSON文档的网址&#xff0c;内容来自于此&#xff1a;部分示例图片 首先提供腾讯的APIJSON文档的网址&#xff0c;内容来自于此&#xff1a; 链接: APIJSON文档…

Matlab隐藏彩蛋

Matlab中的彩蛋实现与Matlab的版本有着重要关系&#xff0c;像Android一样&#xff0c;不同的版本对应不同的彩蛋。这里以Matlab 2016A为例。 1.最著名的一个&#xff0c;命令行窗口输入“image”&#xff0c;就会出现一张倒置的小孩脸&#xff0c;不知情的使用者很可能会被吓…

Solved: “The unsigned image‘s hash is not allowed (DB)“

Solved: “The unsigned image’s hash is not allowed (DB)” 原因是 Secure Boot 的锅 In Hyper-V Manager, make sure the virtual machine is turned off. Select the virtual machine.Right click and select “Settings”Go to “Security”Uncheck “Enable Secure Boo…

【算法系列】滑动窗口

计算长度为k的连续子数组的最大总和 给定一个整数数组&#xff0c;计算长度为k的连续子数组的最大总和。 输入&#xff1a;arr [] {100,200,300,400} k 2输出&#xff1a;700解释&#xff1a;300 400 700解决思路 暴力解法&#xff1a;从k到n-k1&#xff0c;计算k长度大…

短视频seo矩阵系统+抖音小程序源码开源部署(二)

一、短视频矩阵源码系统开发要则&#xff1a; 1. 需求分析&#xff1a;对短视频平台的需求进行全面分析&#xff0c;确立系统开发目标和方向。 2. 技术选型&#xff1a;选用最适合的技术开发短视频矩阵系统&#xff0c;如前端框架、数据库、服务器等。 3. 系统设计&#xff…

Parseval’s theorem

一、Parseval’s theorem介绍 帕塞瓦尔定理Parseval’s theorem表明了信号的能量在时域和频域相等。 ∫ − ∞ ∞ ∣ f ( t ) ∣ 2 d t 1 2 π ∫ − ∞ ∞ ∣ F ( ω ) ∣ 2 d ω ∫ − ∞ ∞ ∣ F ^ ( f ) ∣ 2 d f \int_{-\infty}^{\infty}|f(t)|^{2} \mathrm{~d} t\frac…

Android Studio实现内容丰富的安卓美食管理发布平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号079 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

web安全php基础_php数据类型

PHP 数据类型 PHP 支持以下几种数据类型: String&#xff08;字符串&#xff09;Integer&#xff08;整型&#xff09;Float&#xff08;浮点型&#xff09;Boolean&#xff08;布尔型&#xff09;Array&#xff08;数组&#xff09;Object&#xff08;对象&#xff09;NULL&…

2023 亚马逊云科技中国峰会:全面加码 AIGC、深耕中国下一个十年

编辑 | 宋慧 出品 | CSDN 云计算 亚马逊云科技每年在中国的顶级会议——2023亚马逊云科技中国峰会如期而至。今年中国峰会回归线下举办&#xff0c;主会场和分论坛几乎全部爆满&#xff0c;技术展区人头攒动&#xff0c;现场技术赛事与开发者大讲堂活动丰富精彩&#xff0c;可…

基于SSM的高校专业信息管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【UE】通过滑条放大子画面

在文章&#xff08;【UE4 第一人称射击游戏】33-创建一个小地图&#xff09; 基础上实现通过滑条放大子画面 效果 步骤 在控件蓝图中拖入滑条组件 主要的思想就是当滑条的值变更时去改变摄像机相对位置

图片框架Glide学习总结及插件实现

一.前言 图片加载框架个人选择的是Glide&#xff0c;该框架非常优秀&#xff0c;其知识体系很庞大&#xff0c;个人就对Glide部分知识的学习做一下总结&#xff0c;同时对框架的使用做一下封装&#xff0c;做成插件。 二.知识主干 知识主干如下&#xff0c;每一部分的知识会…

Selenium基础 — Selenium自动化测试框架介绍

1、什么是selenium Selenium是一个用于Web应用程序测试的工具。只要在测试用例中把预期的用户行为与结果都描述出来&#xff0c;我们就得到了一个可以自动化运行的功能测试套件。Selenium测试套件直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。Selenium也是…