如何构建积木式Web应用

上下文
基本上我们在儿童时代都玩过积木玩具。通过一块块的积木,再加上我们的想象力,就可以构造出非常多不同的风格的建筑。那么, 我们可不可以把这种搭积木的方式应用到我们的web应用上呢。
问题
web应用通过提供给用户一整套组件(相当于积木),以及一套已经成型的方案(相当于图纸)。用户可以采用类似搭建积木的方式来根据自己的需要制作界面和应用。
环境
采用asp.net 1.0或asp.net 1.1
预备知识
C#,asp.net的服务器控件编程,asp.net服务器控件生命周期
最好具备以下知识
Page Controller,Front Controller
解决方案
1.建立目录结构 为了了解如何采用积木块式应用,我们首先建立如下的主题目录结构:
77-1.JPG
在Sheme目录下保存所有的主题,每个主题都采用相同的目录结构。UserControl目录保存最基本的积木块(UserControl),Page目录是积木块组成的页面所形成的UserControl,Css目录保存与积木块同名的css文件来控制UserControl的界面。 PageTeamplate.ascx是页面布局框架,根据所请求的页面不同,在PageTemplate的主体位置载入不同Page目录下的ascx文件。2.划分自己的web积木——UserControl 将web应用分成一块块的积木,每一块积木形成一个UserControl,并且每一个UserControl有一个同名的css文件用来控制界面。最基本的积木块要放在UserControl目录下,而由最基本积木块组成的页面文件放在Page目录下。 提示:在一般的web应用中,都会有Header,Footer,Login等等这样的模块,这些模块就可以形成UserControl组成web应用的积木。具体积木块应该根据你的web应用功能来划分,一般来说我们可以把某个功能就划分成一个积木。 3.构建载入积木块的容器——MyPlaceHolder 有了UserControl这些积木块之后,就需要有能够自动在应用中载入这些UserControl积木的容器,这就是PlaceHolder。不过,我们需要扩展PlaceHolder的功能达到自动载入UserControl的目的。
public class MyPlaceHolder : PlaceHolder
{
private string userControl;  // 要载入的UserControl目录下的.ascx
private string pageControl;  // 要载入的Page目录下的.ascx
public MyPlaceHolder()
{
userControl = "";
pageControl = "";
}
public string UserControl
{
get
{
return userControl;
}
set
{
userControl = value;
}
}
public string PageControl
{
get
{
return pageControl;
}
set
{
pageControl = value;
}
}
// 当需要载入多个UserControl时,可以直接调用LoadUserControl
// 当只需要载入一个UserControl时,可以调用Clear清除载入过的内容
public void Clear()
{
this.Controls.Clear();
}
// 载入UserControl目录下的.ascx
// 以及导入对应的css文件
public void LoadUserControl(string UserControl)
{
this.userControl = UserControl;
BasePage page = (BasePage)this.Page;
// 请参考后面的BasePage的代码
Control control = this.Page.LoadControl(
page.Scheme + "usercontrol/" + userControl + ".ascx");
string css = "css/" + userControl + ".css";
// 对应的css文件
if(File.Exists(this.Page.MapPath(page.Scheme+css)))
{
page.AddCss(page.Scheme + css);
}
this.Controls.Add(control);
}
// 载入Page目录下的.ascx
// LoadPage与LoadUserControl的区别是两者载入的.ascx所在的目录不同
// Page目录下的.ascx可以看成是一些搭建主体结构的.ascx,其使用MyPlaceHolder
// 来包含最基础的积木块.ascx(在UserControl目录下)
public void LoadPage(string PageControl)
{
this.PageControl = PageControl;
BasePage page = (BasePage)this.Page;
Control control = this.Page.LoadControl(
page.Scheme + "page/" + pageControl + ".ascx");
string css = "css/" + pageControl + ".css";
if(File.Exists(this.Page.MapPath(page.Scheme+css)))
{
page.AddCss(page.Scheme + css);
}
this.Controls.Add(control);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!userControl.Equals(string.Empty))
{
LoadUserControl(userControl);
}
}
}
public class MyPlaceHolder : PlaceHolder
{
private string userControl;  // 要载入的UserControl目录下的.ascx
private string pageControl;  // 要载入的Page目录下的.ascx
public MyPlaceHolder()
{
userControl = "";
pageControl = "";
}
public string UserControl
{
get
{
return userControl;
}
set
{
userControl = value;
}
}
public string PageControl
{
get
{
return pageControl;
}
set
{
pageControl = value;
}
}
// 当需要载入多个UserControl时,可以直接调用LoadUserControl
// 当只需要载入一个UserControl时,可以调用Clear清除载入过的内容
public void Clear()
{
this.Controls.Clear();
}
// 载入UserControl目录下的.ascx
// 以及导入对应的css文件
public void LoadUserControl(string UserControl)
{
this.userControl = UserControl;
BasePage page = (BasePage)this.Page;
// 请参考后面的BasePage的代码
Control control = this.Page.LoadControl(
page.Scheme + "usercontrol/" + userControl + ".ascx");
string css = "css/" + userControl + ".css";
// 对应的css文件
if(File.Exists(this.Page.MapPath(page.Scheme+css)))
{
page.AddCss(page.Scheme + css);
}
this.Controls.Add(control);
}
// 载入Page目录下的.ascx
// LoadPage与LoadUserControl的区别是两者载入的.ascx所在的目录不同
// Page目录下的.ascx可以看成是一些搭建主体结构的.ascx,其使用MyPlaceHolder
// 来包含最基础的积木块.ascx(在UserControl目录下)
public void LoadPage(string PageControl)
{
this.PageControl = PageControl;
BasePage page = (BasePage)this.Page;
Control control = this.Page.LoadControl(
page.Scheme + "page/" + pageControl + ".ascx");
string css = "css/" + pageControl + ".css";
if(File.Exists(this.Page.MapPath(page.Scheme+css)))
{
page.AddCss(page.Scheme + css);
}
this.Controls.Add(control);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!userControl.Equals(string.Empty))
{
LoadUserControl(userControl);
}
}
}
使用方法:
<HomeOffice:MyPlaceHolder
id="Myplaceholder1"
runat="server"
UserControl="Header">
</HomeOffice:MyPlaceHolder>
// 这里的Header是位于UserControl目录下的Header.ascx
4.构建主要的建筑结构——PageTemplate.ascx PageTemplate其实也是一个UserControl,只不过其功能是用来包含其他的UserControl积木,在PageTemplate里,可以定义页面的整体布局。比如:Header、Footer在整个页面中的位置,页面主体区域的位置等等。 更重要的是,PageTemplate中应该包含Form的定义,这是asp.net所需要的不可缺少的服务器控件。
<%@ Register TagPrefix="HomeOffice"
Namespace="HomeOffice.Web.UI.WebControl"
Assembly = "HomeOffice.Web.UI" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>构建积木式应用程序</title>
<asp:Literal ID="CssHolder" runat="server"></asp:Literal>
<asp:Literal ID="ScriptHolder" Runat="server"></asp:Literal>
<style>
BODY { margin-left : 0px; margin-right : 0px; }
</style>
</HEAD>
<body bgcolor="#e6e6e6">
<form id="Form1" method="post" runat="server"
enctype="multipart/form-data">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td>&nbsp;</td>
<td width="800">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td>
<HomeOffice:MyPlaceHolder id="PlaceHolder1"
runat="server" UserControl="Header">
</HomeOffice:MyPlaceHolder>
</td>
</tr>
<tr>
<td>
<HomeOffice:MyPlaceHolder id="Myplaceholder1"
runat="server" UserControl="MainMenu">
</HomeOffice:MyPlaceHolder>
</td>
</tr>
<tr>
<td style="height:6px;background:#f6f6f6;font-size:1px;
border-top:1px solid white;">&nbsp;
</td>
</tr>
<tr>
<td style="height:4px;background:#e1e1e1;font-size:1px;
border-top:1px solid #e6e6e6; ">&nbsp;
</td>
</tr>
<tr>
<td style="background:white;border-bottom:1px solid #bbbbbb">
<HomeOffice:MyPlaceHolder id="PageBody" runat="server">
</HomeOffice:MyPlaceHolder>
</td>
</tr>
<tr>
<td style="padding-top:20px">
<HomeOffice:MyPlaceHolder id="Myplaceholder2"
runat="server" UserControl="Footer">
</HomeOffice:MyPlaceHolder>
</td>
</tr>
</table>
</td>
<td>&nbsp;</td>
</tr>
</table>
</form>
</body>
</HTML>
在这个PageTemplate中,我们可以看到使用了4个MyPlaceHolder来载入积木块,除了PageBody这个外,其他的都载入了位于UserControl目录下最基本的积木块。而PageBody的作用则是根据http所请求的页面不同载入Page目录下不同的页面。 这些其对应的cs代码在BasePage中处理。
public class BasePage : Page
{
public string Scheme = "/Scheme/blue/";  // 所采用的主题
public AppSetting Setting;
// 环境配置,在Init中分析,其内容包括解析http请求到正确的Page目录下的
// 文件,建立当前登陆用户的信息
public Control focusControl;  // 当页面载入后,首先获得焦点的控件
private Literal CssHolder;    // 要导入的css
private Literal ScriptHolder; // 要导入的script文件
public BasePage()
{
focusControl = null;
}
// 导入css文件引用
public void AddScript(string script)
{
// 进行IsPostBack判断的原因是
// 防止重复导入
if(!this.IsPostBack)
{
ScriptHolder.Text += string.Format("<script src=\"{0}\"
type=\"text/javascript\"></script>\n", script);
}
}
// 导入script文件引用
public void AddCss(string css)
{
if(!this.IsPostBack)
{
CssHolder.Text += "<link rel=\"stylesheet\"
type=\"text/css\" href=\"" + css + "\">\n";
}
}
// 载入http请求分析后的Page目录下的所请求的文件
public void LoadPageTemplate()
{
Control control = (Control)this.LoadControl
(this.Scheme+"PageTemplate.ascx");
CssHolder = (Literal)control.FindControl("CssHolder");
ScriptHolder = (Literal)control.FindControl("ScriptHolder");
this.Controls.Add(control);
MyPlaceHolder body = (MyPlaceHolder)
control.FindControl("PageBody");
body.LoadPage(this.Setting.TargetPage);
// 调用MyPlaceHolder的LoadPage方法
// TargetPage记录了请求的页面
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// 分析http请求
Setting = new AppSetting(this.Request.Path);
// 设置用户信息
if(this.Request.IsAuthenticated)
{
Setting.SetUser(User.Identity.Name);
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.LoadPageTemplate();
}
// 当页面显示后,初始获得焦点的控件
protected void SetFocusControl()
{
if(this.focusControl==null) return;
string template = @"<script language='jscript'>
document.all.{0}.focus();</script>";
string script = string.Format(template,
this.focusControl.ClientID);
this.RegisterStartupScript("FocusControl", script);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
SetFocusControl();
}
// 修复了asp.net 1.1的一个bug
// 没有这段代码,LinkButton等某些服务器将无法使用
protected override void Render(HtmlTextWriter writer)
{
StringBuilder stringBuilder = new StringBuilder();
StringWriter stringWriter = new StringWriter(stringBuilder);
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
base.Render(htmlWriter);
string html = stringBuilder.ToString();
int start = html.IndexOf("<form name=\"") + 12;
int end = html.IndexOf("\"", start);
string formID = html.Substring(start, end - start);
string replace = formID.Replace(":", "_");
html = html.Replace("document."+formID,"document."+replace);
writer.Write(html);
}
}
BasePage中的一个非常重要的成员变量Setting,其作用是保存分析http请求后的结果。由于采用积木式应用,用户所请求的aspx文件在硬盘上并不存在,需要把用户的这种http请求解析成Page目录下的某个ascx文件,让BasePage载入。 5. 采用HttpHandler截获http请求 有了这些基础性的东西之后,我们就应该使用Front Contrller模式来控制所请求的aspx文件,再把这些请求的文件导向正确的UserControl积木。 .NET framework中的Page继承了IhttpHandler,因此我们可以对aspx的解析就让BasePage来处理,这样BasePage在分析了http请求之后,会载入PageTemplate,然后再根据所请求的页面载入不同的UserControl积木。
在web.config中进行如下配置,让httphandler生效:
<httpHandlers>
<add verb="*" path="*.aspx" type="HomeOffice.Web.UI.HttpHandler.MyPageHandlerFactory, HomeOffice.Web.UI"/>
</httpHandlers>
我们在这里不是直接使用了HttpHandler,而是采用了HttpHandlerFactory,不过所使用的代码也非常简单,用户自己可以扩展它的功能。
public class MyPageHandlerFactory : IHttpHandlerFactory
{
public virtual IHttpHandler GetHandler(HttpContext context,
String requestType,
String url,
String pathTranslated)
{
return new BasePage();
}
public virtual void ReleaseHandler(IHttpHandler handler)
{
}
}
为了要正确载入用户所请求的页面,需要对其http请求分析,这个功能放在AppSetting中实现,AppSetting还有一个重要功能就是将http请求字符串转化为页面中将要使用的参数。比如请求http://localhost/news/1.aspx,将分析出目标页面为newsdetail.ascx,参数为new_id=1:
public class AppSetting
{
public string Url;			// request url
public string Site;			// request site
public string User;			// login name
public string UserName;		// display name
public string TargetPage;		// target page
public string[] Roles;		// user roles in the site
private Hashtable parameter = new Hashtable();
public AppSetting()
{
Site = "default";
User = "*";
UserName = "";
Roles = null;
}
public AppSetting(string url) : this()
{
this.Url = url.ToLower();
AnalysisUrl(this.Url);
}
public object this[string key]
{
get { return parameter[key]; }
set { parameter.Add(key, value); }
}
// 分析用户所请求的页面和参数
protected void AnalysisPage(string url)
{
PageInfo[] pages = XmlHomeOffice.Pages();
foreach(PageInfo page in pages)
{
if(Regex.IsMatch(url,page.pattern,RegexOptions.IgnoreCase))
{
this.TargetPage = string.Format(page.target_page,
url.Replace(".aspx","").Split('/'));
if(!page.parameter.Equals(string.Empty))
{
string p = string.Format(page.parameter,
url.Replace(".aspx", "").Split('/'));
string[] ps = p.Split(',');
foreach(string str in ps)
{
string[] item = str.Split('=');
this[item[0]] = item[1];
}
}
return;
}
}
// No one matched, a Exception occur
this.TargetPage = "error";
}
// 分析出站点,类似于blog中的每个站点
protected string AnalysisSite(string url)
{
if(url[0]=='/')
{
url = url.Remove(0, 1);
}
string[] items = url.Split('/');
if(items.Length<1)
{
return Site + "/default.aspx";
}
if(items[0].EndsWith(".aspx"))
{
return Site + "/" + url;
}
string[] reserved_words = XmlHomeOffice.ReservedWords();
foreach(string str in reserved_words)
{
if(items[0].Equals(str.ToLower()))
{
return Site + "/" + url;
}
}
Site = items[0];
return url;
}
public void AnalysisUrl(string url)
{
Url = AnalysisSite(url);
AnalysisPage(Url);
}
public void SetUser(string user)
{
User = user;
UserName = XmlUsers.GetDisplayName(user);
XmlSiteProfile profile = new XmlSiteProfile(Site);
Roles = profile.SiteUserRole(user);
}
public bool HasRole(string role)
{
if(Roles==null) return false;
foreach(string str in Roles)
{
if(str.Equals(role)) return true;
}
return false;
}
}
在分析http请求的页面时,要用到外部Xml文件记录的pages映射信息:
  <pages>
<page pattern="^(\/testboth.aspx)$"
parameter="" target-page="testboth" />
<page pattern="^(\/\w+.aspx)$"
parameter="" target-page="{1}" />
</pages>
6.需要修改的服务器控件 由于采用了HttpHandler来映射新的页面,因此象HyperLink,Image等这些与相对路径有关的服务器控件就需要做个小手术来适应这种改变。 7.如何开发其他主题 要进行其他主题积木的开发,只需要开发界面工作即可。后台代码文件不需要开发。 Aspx文件前的指示语句为:
<%@ Control Language="c#" AutoEventWireup="false"
Inherits="HomeOffice.UserControl.PageTemplate" %>
在这个指示语句里,不需要codehind属性。其实现代码已经实现在blue主题中。最好的方式是,将blue主题中的所有ascx的cs文件都独立到一个UserControlCs目录中。这样在所有ascx文件中Inherits=”HomeOffice.UserControlCs.PateTemplate”。
流程说明
以某个请求为例,对积木式web应用的流程进行说明 假设用户请求localhost/default.aspx文件,在xml文件中分析得到default.aspx文件所对 应的处理ascx为Page目录下的HomePage.ascx。 首先由BasePage载入PageTemplate.ascx,然后根据分析出来的TargetPage载入 HomePage。
具体应用
采用这种方式构建的web应用即将在www.smartyouth.net开通。 其主要功能有:积木式应用,风格多样化(采用类似于windows主题的方式)。
优点讨论
在采用积木式构造www.smartyouth.net过程中,发现了几个小的优点: 1.可以统一的对应用中的权限进行认证。 实现一个权限认证UserControl,在该UserControl中判断用户是否具有某权限,是否符合某种角色,然后将认证的结果保存在BasePage中的IsAuthorized字段中,当认证不通过时显示某些错误字符串。 对于任何需要权限认证的模块,将该UserControl直接拖进设计器,并且正确的设置权限属性和角色属性即可。接着在需要认证的模块中将某些Button的Enabled状态设置为BasePage.IsAuthorized即可。 2.统一的Validator 由于asp.net的Validator模型有时候不是非常的方便,采用积木式应用,也可以统一的解决Validator。 实现一个Validator UserControl,在BasePage中用一个对象来记录错误字符串和对应的Control。 在Validator UserControl的PreRender方法中,将记录了错误的对象中所有的内容生成一些Link(当单击该Link,对应的Control调用focus方法)。 在需要进行检查的UserControl中,如果发生了错误,将错误字符串和Control.ClientID添加到错误对象中即可。
下载
注意:下载的源代码与示例代码会存在少少出入,因为示例代码来自一个更复杂些的 应用。如果需要使用下载代码中的DataGrid示例,需要安装SQL Server,并且
建立如下的数据库,表,存储过程:
数据库:test
访问账号:sa,sa(可以在web.config中修改)
表:test
字段 test_id(自增),string(nvarchar(50)),number(int)
存储过程:
testaddnew:(没有参数)
insert into test(string, number) values(‘’, 0);
testget: (没有参数)
select * from test
testdelete:(输入参数:@test_id int)
delete from test where test_id = @teat_id
testupate:(参数:@test_id, @string, @number)
update test set string=@string, number=@number
where test_id=@test_id
采用如下方式访问示例:(保证是localhost)http://localhost/testboth.aspx
http://localhost/testtextbox.aspx
http://localhost/testdatagrid.aspx
下载地址:http://www.smartyouth.net/scheme.rar
相关知识
使用 Microsoft .NET 的企业解决方案模式http://www.microsoft.com/china/msdn/architecture/patterns/Esp/
.Text Blog源代码http://scottwater.com/DotText/default.aspx

转载于:https://www.cnblogs.com/wzyexf/archive/2006/03/20/353672.html

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

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

相关文章

第一百零四期:搞清这些陷阱,NULL和三值逻辑再也不作妖

NULL 用于表示缺失的值或遗漏的未知数据&#xff0c;不是某种具体类型的值。数据表中的 NULL 值表示该值所处的字段为空&#xff0c;值为 NULL 的字段没有值&#xff0c;尤其要明白的是&#xff1a;NULL 值与 0 或者空字符串是不同的。 作者&#xff1a;youzhibing2904 NULL …

752. Open the Lock

文章目录1 题目理解2 BFS3 用int构建状态1 题目理解 一个钟表有4个槽&#xff0c;每个槽可以停在0-9&#xff0c;10个状态。钟表每个槽的轮子可以转&#xff0c;例如可以从0转到9&#xff0c;也可以从0转到1。 钟表的起始状态是"0000"。每个数字代表一个槽的状态。 …

移动开发 视频收集

构建基于SQL CE的移动方案http://download.chinaitlab.com/video/files/8282.html转载于:https://www.cnblogs.com/Regal/archive/2006/03/23/356800.html

移动混合开发之android文件管理新建文件和删除文件

今天经过一天超过8小时的实践&#xff0c;有很多CSS上的细节需要注意&#xff1a; 1&#xff0c; /*注意是对before的操作*/ .content ul li .icon-check-empty:before{display: block;/*webFont设置其width和height时无效,只有设置font-size*//*width: 3rem;*//*height: 3rem;…

spring mvc学习(19):cookievalue注解(显示cookie的值,默认必须有值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

续:C#串口操作

今天继续写C#的工业扫描串口。突然遇到一个很奇怪的问题&#xff1a;那就是我要求把某些码得到之后进行业务处理&#xff0c;但是就是这个时候突然发现扫描出来的 码位数不正确了&#xff01;我就很怀疑自己的代码逻辑了。于是&#xff0c;我就逐行进行调试&#xff0c;而接受口…

spring mvc学习(20):RequestHeader(获取请求头中某一部分值)

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

698. Partition to K Equal Sum Subsets

文章目录1 理解题目2 分析2.1进一步优化2.2 根据花花酱解答1 理解题目 Given an array of integers nums and a positive integer k, find whether it’s possible to divide this array into k non-empty subsets whose sums are all equal. 输入&#xff1a;一个int数组nums…

spring mvc学习(21):testparam请求参数和请求头表达式

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

OpenGL ES GLKit初探

#GLKit框架 GLKit框架的设计目的是为了简化OpenGL/OpenGL ES的应用开发。它的出现加快了OpenGL或OpenGL ES应用程序的开发。使用数学库、背景纹理加载&#xff0c;预先创建着色器效果&#xff0c;以及标准视图和视图控制器来实现渲染循环。 GLKit框架提供了功能和类&#xff0c…

一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库

呵呵&#xff0c;说实在的&#xff0c;这个类俺是从外国论坛上下载的&#xff0c;自己研究了下如何使用并做了一个DEMO&#xff0c;演示如何操作ACCESS数据库。希望给那些没有接触数据库编程的初学者一点启发吧。有任何问题请及时与我联系^_^。程序下载地址&#xff1a;/Files/…

93. Restore IP Addresses

文章目录1 题目理解2 回溯1 题目理解 输入&#xff1a;字符串s 输出&#xff1a;可能的ip地址 规则&#xff1a;一个有效的ip地市是一连串数字&#xff0c;数字范围在0到255&#xff0c;每个数字不能有前导0。例如"0.1.2.201" and "192.168.1.1"是有效ip地…

spring mvc学习(22):/textpath/*/helen

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

131. Palindrome Partitioning

文章目录1 题目理解2 回溯3 动态规划1 题目理解 输入&#xff1a;字符串s 规则&#xff1a;将字符串s分割&#xff0c;分割后每一个部分都是一个回文串。 输出&#xff1a;所有的分割方式 Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Examp…

4 文件操作 支持图片 视频 mp3 文本等

#文件操作:send_file,支持图片 视频 mp3 文本等app.route("/img")def img(): return send_file("1.jpg")转载于:https://www.cnblogs.com/ajaxa/p/11156483.html

我的博客开张了!!!

留个脚印,嘻嘻! 转载于:https://www.cnblogs.com/stu-acer/archive/2006/04/26/385453.html

第一百零五期:5年前,跳槽涨薪,你笑了,5年后,跳槽降薪,你慌了!

去年&#xff0c;我在年度绩效面谈中与某中年技术男就 “从测试转向产品经理” 的这个话题上进行了一些探讨与分析。 作者&#xff1a;王晔倞 图片来自 Pexels 或许是因为分析的角度比较客观、真实&#xff0c;再加上俩人都比较会演戏&#xff0c;我激情&#xff0c;他投入&a…

241. Different Ways to Add Parentheses

文章目录1 题目理解2 分治法1 题目理解 输入&#xff1a;字符串input&#xff0c;包含数字和操作符 规则&#xff1a;给input的不同位置加括号&#xff0c;使得input可以得到不同的计算结果。 输出&#xff1a;返回可能的计算结果 Example 1: Input: “2-1-1” Output: [0, 2…

第一百零六期:长相不讨AI喜欢面试就会挂?全球百万求职者经历AI“看脸”面试

AI不仅会筛选你的简历&#xff0c;还会通过看脸决定你能否通过面试。这不是将来时。全球已有超过一百万求职者&#xff0c;经历过AI面试官的冷酷“凝视”。 作者&#xff1a;鱼羊 本文经AI新媒体量子位&#xff08;公众号ID:QbitAI&#xff09;授权转载&#xff0c;转载请联系…

最近比较忙

最近项目真是忙的可以不过还好前几天没事搞了个电影小偷,闲下来看看电影真是不错站在这里要的回下就可以了http://www.ve99.com 转载于:https://www.cnblogs.com/flashicp/archive/2006/04/29/388972.html