Mikel的技术博客专注于大数据分析、人工智能行业应用及企业级应用软件开发Mikel
  • 开发笔记
    • JavaScript
    • ASP.NET
    • C#
    • ASP.NET MVC
    • iOS开发
    • Android
    • AR
    • Java
    • PHP
    • Delphi
    • Debug
    • 数据库
    • 架构设计
    • 项目管理
    • Flash
  • 网站运营
    • 建站经验
    • 网络营销
    • 搜索优化
    • 电子商务
    • 互联网
  • 源码下载
  • 人工智能
    • 机器学习
  • C#
  • Java
  • Python
  • JavaScript
  • PHP
  • 数据库
  • Debug
  • 微信小程序开发
  • 关注我们
    • 威客
Hi, 请登录     我要注册     找回密码
分享到: 更多 (0)

开发笔记 第600页

记录了我开发过程中遇到的问题和资料

[转载]ASP.NET MVC 最佳开发实践(2)

2011-05-04mikel阅读(919)

[转载]ASP.NET MVC 最佳开发实践(2) | EntLib.net 技术分享平台.

本文提供了一些代码设计准则,目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序,当然,你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译,欢迎分享和交流ASP.NET MVC 项目开发设计思路。

Controller 建议 – Controller Recommendations

Controller 和指定的Action方法由路由系统根据匹配的URL规则调用。Controller 接收路由系统的输入参数,包括HTTP 请求上下文(Session、Cookies、Browser等等)。

使用Model Binding,而不是手动解析请求。

ASP.NET MVC 通过Model binding 抽象了许多对象反序列代码,Model binding机制是将Request Context数据通过反射对应到Action方法中定义的对象类型上。

如下代码是Seller类,定义了表单提交的数据:

public class Seller
{
public Int64 ID { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
}

如下的是Register View 表单:

<% using (Html.BeginForm()) { %>
<legend>Account Information</legend>
<p>
<%= Html.TextBox("Name") %>
</p>
<p>
<%= Html.TextBox("Phone") %>
</p>
<p>
<%= Html.TextBox("Address") %>
</p>
<p>
<input value="Register" />
</p>
<% } %>

Controller 需要Register Action 方法,提供Model binding:

public ActionResult Register([Bind(Exclude="ID")] Seller newSeller)
{
...
}

默认的model binder 会寻找类中的每一个属性,以Name 为例:

(1) 先查找Request.Form[“Name”];
(2) 接着RouteData.Value[“Name”];
(3) 接着 Request.QueryString[“Name”];
(4) 最后如没有匹配,则为null;

从Register action方法可以看到,通过默认的model binder,对象属性将被赋值。Model binding系统也会进行验证逻辑,如data annotations attributes。

Model binding系统有丰富的扩展机制,可对object的创建、赋值和验证进行全面定制。

在Action方法中显示命名View。

在action方法中完成必要逻辑后,最后返回ViewResult 或 PartialViewResult对象。如不传入View名称给result 类,View 文件将默认为action 名称。如一个名为Products的Controller,有一个List 的Action方法,在List action方法调用 return View() 方法,且不传入任何参数。MVC 框架将寻找 /Views/Products/List.aspx 视图,如不存在,则继续寻找 /Views/Products/List.ascx。如仍不存在,则尝试 /Views/Shared/List.aspx和/Views/Shared/List.ascx。你可使用/Views/Shared 存放多个Controllers共享的视图。

为了避免混淆,在action方法中,显式命名View,如 return View(“explictViewName”),这样可从不同的Action调用List视图。

在提交表单时使用Post/Redirect/Get(PRG)

根据HTTP POST 和 GET 的定义:

HTTP GET 用于不更改Model数据;
HTTP POST 用于更改Model 数据;

下面是一个清晰的描述,在post back的action方法接收表单数据,返回 RedirectToAction(),该方法导致一个HTTP 302 (临时跳转),并对方法生成GET请求,这就是Post – Redirect – Get 模式。

传统的ASP.NET 表单回传数据,有可能导致数据的重复提交,可通过MVC Post-Redirect-Get模式解决这一问题。

但是,这一模式会造成client-side性能影响,因为redirect跳转会再次请求服务器,需要在性能成本和可用性之间进行判断。

实现HandleUnknownAction 和 HandleError

默认的unknown action响应是404(Not found)错误。可在Controller中重载HandleUnknownAction,针对这一错误实现一个默认视图。此外,可在controller的action方法添加HandleError属性,针对未捕获异常提供标准的错误视图。

路由建议 – Routing Recommendations

ASP.NET MVC 中路由映射 URL 直接到controller,而不是一个特定的文件。默认的路由添加到RouteTable,在Global.ascx文件的Application_Start中定义。该路由表负责映射特定URL到Controller和Action。

当时使用标准路由时,从特定的路由到一般路由进行排序。

路由表是有序的,因此按特定的到一般规则来创建路由。举一个示例,假定你有一个product category需要创建URL:

* http://sellmyproducts/
* http://sellmyproducts/Page#
* http://sellmyproducts/category
* http://sellmyproducts/category/Page#

假定List方法定义如下(在ProductsController 类中):
Public ViewResult List(string category, int page)

基于之前指定的URL,下面的路由规范将正确路由用户到正确的视图:

routes.MapRoute(
 
null,
 
"",
 
new { controller = "Products", action = "List", category = (string)null, page = 1 }
 
);
 
routes.MapRoute(
 
null,
 
"Page{page}",
 
new { controller = "Products", action = "List", category = (string)null },
 
new { page = @"\d+" }
 
);
 
routes.MapRoute(
 
null,
 
"{category}",
 
new { controller = "Products", action = "List", page = 1}
 
);
 
routes.MapRoute(
 
null,
 
"{category}/Page{page}",
 
new { controller = "Products", action = "List"},
 
new { page = @"\d+" }
 
);

使用命名的路由机制,避免路由歧义

在使用ASP.NET 路由机制时,必须知道路由机制是如何工作的。否则,会浪费很多时间去跟踪错误的路由。有一个办法是显式命名路由,可缓解这一问题。

如下路由映射定义了命名路由:

routes.MapRoute(
 
"Default",
 
"",
 
new { controller = "Products", action = "List", category = (string)null, page = 1 }
 
);
 
routes.MapRoute(
 
"PageRoute",
 
"Page{page}",
 
new { controller = "Products", action = "List", category = (string)null },
 
new { page = @"\d+" }
 
);

使用这些路由定义,可创建PageRoute路由链接:

<%= Html.RouteLink("Next", "PageRoute",
new RouteValueDictionary( new { page = i + 1 } )); %>

[转载]ASP.NET MVC 最佳开发实践(1)

2011-05-04mikel阅读(770)

[转载]ASP.NET MVC 最佳开发实践(1) – Rickie is back …. 人生·工作的结果=思维方式×热情×能力 – 博客园.

本文提供了一些代码设计准则,目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序,当然,你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译,欢迎分享和交流ASP.NET MVC 项目开发设计思路。

Model建议 – Model Recommendations

Model是定义业务领域相关的对象,应该包含业务逻辑(对象如何动作和关联),验证逻辑(验证对象的有效值),数据逻辑(数据对象如何持久化),和会话逻辑(跟踪用户状态)。

创建独立的Model项目,在ASP.NET MVC 项目中引用Model程序集。

将所有业务逻辑放置在Model中。

如将所有业务逻辑放置在Model项目中,可根据实际业务数据来生成View和Controller。有如下好处:

  • 减少重复的业务逻辑。
  • 在View中减少业务逻辑,View易于理解。
  • 业务逻辑的测试仅仅和Model有关。

例如,下面需要显示用户的用户名 – 先显示Last Name,在View中代码如下:


&lt;% if (String.Compare((string)TempData["displayLastNameFirst"], "on") == 0)        { %&gt;
Welcome, &lt;%= Model.lastName%&gt;, &lt;%= Model.firstName%&gt;
&lt;% }        else        { %&gt;
Welcome, &lt;%= Model.firstName%&gt; &lt;%= Model.lastName%&gt;
&lt;% } %&gt;

然而你需要在每一个地方重复这一逻辑。如将这一业务逻辑放置在Model中,可在Model中添加一个属性封装这一逻辑。

public string combinedName
{
get
{
return (displayLastNameFirst ? lastName + " " + firstName : firstName + " " + lastName);
}
private set
{
;
}
}

样,可大大简化视图代码:

<% Welcome, <%= Model.combinedName %> %>

将所有验证逻辑放置在Model中

所有输入验证应该在Model层,包括Client-side 验证。

可使用ModelState 添加验证检查,代码如下所示:

if (String.IsNullOrEmpty(userName))

{

ModelState.AddModelError(“username”, Resources.SignUp.UserNameError);

}

不过,更好的办法是使用 System.ComponentModel.DataAnnotations,在Model类的属性上添加attribute,如下所示:

public class User

{

[Required(ErrorMessageResourceName = “nameRequired”, ErrorMessageResourceType = typeof(Resources.User))]

public String userName { get; set; }

…

}

为数据访问定义接口

接口用来暴露数据访问类的方法,强化ASP.NET MVC 的松散耦合设计。

可考虑使用Entity Framework 或 LINQ to SQL 创建对数据库的访问类,Entity Framework 和 LINQ to SQL 都支持存储过程。

将所有会话逻辑放置在Model中。

View 建议 – View Recommendations

View用来展示Model数据,Controller负责选择View。业务逻辑不属于View,Model负责业务逻辑。View非常灵活,如Model的View可通过HTML显示,同样的Model也可通过XML 视图来呈现。

将HTML放置在View和Partial View中(不要在Controller中)

默认的ASP.NET视图引擎提供了如下视图文件:HTML View(.aspx),Partial HTML View(.ascx)和Master page(.master)

如下视图演示了对partial view的调用:

<%@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage” %>

…

Below is a list of items submitted by <b>

<%= Html.Encode(ViewData[“name”]) %></b>.

<p>

…

<div id=”items”>

<% Html.RenderPartial(“ItemsByName”);%>

</div>

</asp:content>

Partial view(ItemsByName.ascx)如下所示:

<%@ Control Language=”C#” %>

…

<% foreach (Seller.Controllers.Items item in (IEnumerable)ViewData.Model)

{ %>

<tr>

<td>

<%= Html.Encode(item.title)%>

</td>

<td>

<%= Html.Encode(item.price)%>

</td>

</tr>

<% } %>

</table>

<% } %>

Partial View 是一个强大的扩展和重用机制。你可在不同的地方包含相同的View,不必编写重复的代码。

在View中使用ViewData访问数据

ASP.NET 提供了如下机制在View模板中访问数据:

ViewData.Model 对象 – 在Controller的action方法中,在return语句中传入一个Model对象(return View(myModelObject))。

ViewData Dictionary – 在action方法中存入数据(ViewData[“key”] = value),接着在View中方法相同的dictionary。

在可能的情况下,应该是一ViewData Model,而不是ViewData 来访问数据,因为Model 提供了类型安全。此外,你应在View模板中,使用数据访问机制,而不是Request / Session 来访问。

如需要显示一个对象的多个属性,可使用ViewData.Model,并创建一个强类型View。针对seller详细页面,seller类有name、phone、address、email等等属性,在呈现View之前,你可在Controller中对ViewData.Model 赋值seller对象实例。但是如果是一些零散的数据,如page#、用户名和current time,则一般使用ViewData字典。

在使用模型绑定(Model bingding)时,避免在view中访问数据。

在Controller 中访问数据库,在执行View之前,将从数据库中检索的数据复制给轻量的View Model对象,这样,轻量的View Model对象不必在视图执行时检索数据。

使用(自动生成)客户端验证

从ASP.NET MVC 2 开始,可以很容易添加客户端验证。

(1) 如前所述,在Model层中添加数据验证逻辑;

(2) 确保项目中Scripts目录有如下JavaScript 文件:MicrosoftAjax.js 和 MicrosoftMvcValidation.js;

(3) 在表单提交页面,添加如下代码:

<script src=”<%= Url.Content(“~/Scripts/MicrosoftAjax.js”) %>” type=”text/JavaScript”></script>

<script src=”<%= Url.Content(“~/Scripts/MicrosoftMvcValidation.js”) %>” type=”text/JavaScript”></script>

(4) 在表单中添加如下代码:

<% Html.EnableClientValidation(); %>

现在如果编辑表单内容,当输入值不合格时,客户端马上进行验证提醒。

在模板中插入server-side 注释

在View模板中使用服务端注释,在HTML呈现时,会剔除。

如下是server-side注释:

<%– This is a server side template comment –%>

不要在View模板中使用HTML 注释,因为这些注释会呈现在web浏览器中,可被用户看到。

使用HTMLHelper 扩展方法。

System.Web.Mvc.Html 类中包含了很多有用的HTML 扩展方法。

Form 表单生成(BeginForm)

输入字段生成(checkbox、hidden、radio button、textbox)

链接URL生成(ActionLink)

XSS保护(Encode)

尽可能使用这些HTML扩展方法,如下是使用route table创建一个链接:

<%= Html.ActionLink(“Home page”, “Default”) %>

后续相关文章,可参考如下链接:

ASP.NET MVC 最佳开发实践(2)
ASP.NET MVC 最佳开发实践(3)

英文原文链接:
Best Practices for ASP.NET MVC
http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx

[转载]Android关于ListView (1)——异步加载图片

2011-05-04mikel阅读(956)

[转载]关于ListView (1)——异步加载图片 – 没有代码 – 博客园.

效果:

主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等

项目的布局如下:

首先加入网络的权限

<uses-permission Android:name=”Android.permission.INTERNET” />

工具类,主要根据url读取图片返回流的方法

Request.java

public class Request {

public static InputStream HandlerData(String url) {

InputStream inStream=null;

try {

URL feedUrl = new URL(url);

URLConnection conn = feedUrl.openConnection();

conn.setConnectTimeout(10 * 1000);

inStream = conn.getInputStream();

} catch (Exception e) {

e.printStackTrace();

}

return inStream;

}

}

ListViewReadImageAscy.java

private ImageAdapter adapter;

//数据源

private ArrayList beans = new ArrayList();

//内部类
public class Bean {

private Bitmap image;

public Bitmap getImage() {

return image;

}

public void setImage(Bitmap image) {

this.image = image;

}

}

扩展BaseAdapter

public class ImageAdapter extends BaseAdapter {

public ImageAdapter(Context context) {

}

@Override

public int getCount() {

return beans.size();

}

@Override

public Bean getItem(int position) {

return beans.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ImageView i = new ImageView(getApplicationContext());

Bean b = beans.get(position);

//如果有图片则读取,没有则跳过

if (b.getImage() != null) {

i.setImageBitmap(b.getImage());

}

return i;

}

}

/异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。

//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。

public class ImageLoadTask extends AsyncTask {

private ImageAdapter adapter;

// 初始化

public ImageLoadTask(Context context, ImageAdapter adapter) {

this.adapter = adapter;

}

@Override

protected Void doInBackground(Void... params) {

for (int i = 0; i &lt; adapter.getCount(); i++) {

Bean bean = adapter.getItem(i);

Bitmap bitmap = BitmapFactory

.decodeStream(Request

.HandlerData("http://avatar.profile.csdn.net/A/E/5/2_piaopiaohu123.jpg"));

bean.setImage(bitmap);

publishProgress(); // 通知去更新UI

}

return null;

}

public void onProgressUpdate(Void... voids) {

if (isCancelled())

return;

// 更新UI

adapter.notifyDataSetChanged();

}

}

设置数据源

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

for (int i = 0; i &lt; 15; i++) {
Bean b = new Bean();
b.setImage(BitmapFactory.decodeResource(getResources(),
R.drawable.icon));

beans.add(b);
}

adapter = new ImageAdapter(this);
ListView listview = new ListView(this);
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
setContentView(listview);

new ImageLoadTask(this, adapter).execute();
}

本文为原创,如需转载,请注明作者和出处,谢谢!

http://www.cnblogs.com/not-code/archive/2011/05/03/2035421.html

代码下载

http://files.cnblogs.com/not-code/ListViewReadImageAsyn.rar

[转载]Asp.net MVC3.0 入门指南 2.控制器Controller

2011-05-04mikel阅读(895)

[转载]Asp.net MVC3.0 入门指南 2.控制器Controller – 用心做事,用心做人 – 博客园.

添加一个控制器

MVC代表model-view-controller。MVC对开发应用程序来说,

是一种很好的架构和便于维护的模式。基于MVC的程序包含:

  • 控制器:负责处理外部请求,获取模型数据,提取视图模板(负责返回请求给客户端)
  • 模型:代表应用程序的数据并使用验证逻辑去执行数据的业务规则
  • 视图:用来动态生成HTML响应的一些模板文件

在这个教程里将会包含所有上述概念并告诉您如何去使用他们去创建应用程序。

让我们开始创建一个控制类。在解决方案资源管理器中,右键Controller文件夹并选择添加Controller。

命名新的控制器为“HelloWorldController”。保留默认的模板为 Empty controller 。单击Add。

注意:在解决方案资源管理器中一个新的文件已经被创建,名字为HelloWorldController.cs.

文件已经在IDE中打开。

在程序块public class HelloWorldController的内部,创建两个方法,代码如下。

作为例子,控制器将返回一个HTML字符串。

using System.Web;
using System.Web.Mvc;

namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/

public string Index()
{
return "This is my <strong>default</strong> action...";
}

//
// GET: /HelloWorld/Welcome/

public string Welcome()
{
return "This is the Welcome action method...";
}
}
}

的控制器被命名为HelloWorldController并且第一个方法被命名为Index。

让我们从浏览器调用它。运行应用程序(按F5或Ctrl+F5)。在浏览器中地址栏

中追加"HelloWorld"。(例如:在下面的插图中,这样写http://localhost:43246/HelloWorld.)

浏览器页面中返回结果如下边屏幕截图。上面的方法中,代码直接放回了字符串。

您告诉系统仅仅返回一些HTML,它做到了!

URL的第一部分决定了执行哪个控制器类。所以 /HelloWorld 映射到 HelloWorldController 类。

URL的第二部分决定了执行控制器类中的哪个操作(方法)。所以/HelloWorld/Index 触发了

HelloWorldController 类的Index方法。

注意:Index方法被用作默认方法。

这就是为什么如果没有明确指定方法时,Index方法将会被调用的原因。

浏览ttp://localhost:xxxx/HelloWorld/Welcome.  Welcome方法返回

字符串”This is the Welcome action method…”.

MVC默认映射为/[Controller]/[ActionName]/[Parameters].

对于这个URL来说,控制器是HelloWorld,Welcome是响应方法。

您不用必须使用[Parameters]。

让我们稍微修改一下以便您可以通过URL传递参数给控制器。(比如,

/HelloWorld/Welcome?name=Scott&numtimes=4). 改变Welcome

方法,像下面一样添加两个参数。注意,代码中使用C#的可选参数特性

指明参数numTimes默认值为1(不传递该参数时)


public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

运行应用程序并浏览URL(http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4).
您可以为name和numtimes多试几次其他的值。系统自动从URL请求字符串中映射到您的方法中
相应的参数上。

在这两个例子中控制器已经完成了MVC中的“VC”,也即是说,视图和控制器已经

工作了。控制器直接返回了HTML.通常您不想让控制器直接返回HTML,因为这会变成

非常累赘的代码。我们通常使用一个单独的视图模板文件来帮助生成HTML响应。

让我们来看看我们如何能够做到这一点。

下一节:视图 View

原文网址:

http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part2-cs

[转载]Asp.net MVC3.0 入门指南 1.简介

2011-05-04mikel阅读(895)

[转载]Asp.net MVC3.0 入门指南 1.简介 – 用心做事,用心做人 – 博客园.

简介

该教程将教会您如何使用Microsoft Visual Web Developer 2010 Express Service Pack 1(免费版本的Visual Studio),

去创建一个ASP.NET MVC网页程序。可以通过Web Platform Installer安装。

在所有开始之前,请确定您的机器已经安装了如下所列的必备组件:

· Visual Studio Web Developer Express SP1 prerequisites

//译者注:建议大家使用Visual Studio 2010+sp1

· ASP.NET MVC 3 Tools Update

· SQL Server Compact 4.0 (runtime + tools support)

//译者注: SQL Server7、SQL Server2000、SQL Server2005、SQL Server2008也可以

如果您正在使用Visual Studio 2010而不是Visual Web Developer 2010,

安装必备的组件通过点击下面的链接:Visual Studio 2010 prerequisites。

准备创建什么

您将完成一个简单的电影列表程序,支持从数据库创建、编辑和展示电影列表。

下面是两个程序截屏。它包括了一个显示所有电影的列表页面:

该程序也支持您添加、编辑和删除电影,并可以查看某个电影的细节。

所有的数据输入都包含了验证,以确保存入数据库的数据是正确的。

您将学到的技能

学到技能如下:

  • 如何创建ASP.NET MVC 工程
  • 如何创建ASP.NET MVC控制器和视图
  • 如何使用实体类框架的代码优先(Code First)创建一个新的数据库
  • 如何获取并展示数据
  • 如何编辑数据并进行数据验证

开始

打开Visual Studio 2010,在启动页面选择新建项目。

Visual Studio是一个集成开发环境。

创建您的第一个应用

您可使用Visual Basic或C#创作为编程语言创建应用程序。

选择左边的Visual C#然后选择ASP.NET MVC 3 Web Application.命名项目为“MvcMovie”,单击OK。

在新弹出的 New ASP.NET MVC 3 Project窗口,选择Internet Application.

确保Use HTML5 markup并保留Razor作为默认的视图引擎。

单击OK。您刚才创建的ASP.NET MVC程序,Visual Studio使用默认的模板,

所以您没有做任何工作就已经完成了一个可以工作的应用程序。

这是一个简单的“Hello World!”程序,它是您开始应用程序的一个好地方。

“调试”菜单,选择“开始调试”

您也可以使用快捷键F5开始调试。

Visual Studio启动一个浏览器并打开程序的主页面。注意地址栏的显示的是localhost而不是形如example.com。

这是因为localhost总是指向您的本地计算机,在这种情况下它指向您刚才创建的应用程序。当Visual Studio启动一个网络项目时,

一个随机的端口被web server使用。如下图所示,这是随机的数字是43246.当您运行程序时,您可能看到的是一个不同的端口。

下一节:控制器Controller

原文网址:http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs

[转载]Android学习系列(6)--App模块化及工程扩展

2011-05-03mikel阅读(827)

[转载]Android学习系列(6)–App模块化及工程扩展 – 谦虚的天下 – 博客园.

软件业界,无时无刻不在创造,也无时无刻不在重复,就是这样,无所谓对和错,但是我们要精诚合作。
这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。
这篇文章很简单,但是很重要,真的很重要,特此隆重推荐!

1.需求
无论是在.net还是java平台,合理的分层架构是最普遍的模块化思路之一。
dll,jar文件无不风靡盛行,无处不在,使用它们的好处,我们不必在此多言。
一天,tx团队和我说,我们现在要做Android上做三个论坛的客户端,一个是新闻论坛,一个是文学论坛,一个是音乐论坛。除了数据,界面和很少的模块不一样,其他的都一摸一样。
OK,动工!好,想一想…
jar是我第一刻就想到的东西,但是共用的jar文件无法方便的共享资源或者覆盖资源。
而我们也不会傻傻的单独做三个客户端的吧,也不会傻傻的做3个客户端再傻傻的copy3份,依次修改吧。

2.问题
在Android工程中如何开发一个共用Framework,能共用资源,代码,但是也能扩展?

3.使用硬编码判断
有人提出了一种方案, 在代码里面判断:

if(新闻论坛) {
//加载新闻论坛的资源
//执行新闻论坛的代码
//显示新闻论坛的效果
}else if(文学论坛) {
//加载文学论坛的资源
//执行文学论坛的代码
//显示文学论坛的效果
}else if(音乐论坛) {
//加载音乐论坛的资源
//执行音乐论坛的代码
//显示音乐论坛的效果
}
PS:这是一种很无奈的办法,代码丑陋,扩展性差,有没有更好的办法呢?

4.使用Android Library分离工程
Android Library提供了一个类似于其他平台的库的概念,这个库不仅能公用代码,还能共用资源,还能覆写资源。
Android Library是以工程的颗粒来复用,引用它的工程,其实就是引用它的代码,然后生成R.java和主工程需要的资源,而剔除Library中被覆盖的资 源。其中Library中的AndroidManifest.xml不能复用,也就是说主工程必须重新定义AndroidManifest.xml,这个 也很容易理解,AndroidManifest.xml本来就是工程的一个配置文件,一般来说不具备共用的库的通用性。
步骤如下:
第一步:新建Android工程common。
第二步:右键common,选择Properties,在Android标签页,选中”Is Library” ,如下图。

第三步: 新建主工程新闻论坛tianxianews。
第四步: 右键tianxianews,选择Properties,在Android标签页,点击Add,选中common。如下图。
查看最后的工程结构:
此时此刻,common工程天衣无缝成了tianxianews工程的一部分。
我们展开tianxianews工程的gen目录:

eclipse为了生成了两个R.java,一个是common工程的,一个tianxianews工程的,但是内容是一摸一样的,这样做的好处 是:R.java里面的内容包括两个工程资源,第一,tianxianews工程通过R.java能调用到common工程的资源;第二,如果有覆写的资 源,生成apk的时候,tianxianews工程覆盖common工程的资源,因为两个R.java内容一样,common代码调用的R.java中的 资源,实际上调用的是tianxianews资源,这个特性类似如面向对象的继承的概念。
我们还可以另外新建tianxiamusic,tianxialiterature工程,都引用common,这样我们三个工程就能共用common,这样我们就可以只在common一个工程中开发了。
在这里,具体的使用步骤我没有截图出来,主要是没什么技术,也没什么好说的,就是两个字:覆盖。

5.小结
Android Library为Android模块化和工程扩展提供了一个很好的工具或者方式。随着项目的增大,资源的共享,模块化和扩展的这种需求更是日益凸显,它不 仅去掉了代码的丑陋,而且减少了开发量,带来的益处不少。同时由此我们也可以看出来Android的不成熟,他们为我们大型工程提供的方案还是太少,这可 能也有源自手机平台本身的局限性吧,我们期待Android市场走向更强大,技术走向更强悍。

[转载]向设计师推荐20款漂亮的免费英文字体

2011-05-03mikel阅读(1070)

[转载]向设计师推荐20款漂亮的免费英文字体 – 梦想天空 – 博客园.

本文收集了20款非常漂亮的免费字体,特别适合网页设计师,平面设计师和电脑艺术人员。 如果你正在寻找漂亮的字体,那么这份清单正是为你准备的。

1. Fertigo Professional Free Font

2. Lost in Space

3. Font Cube

4. Just Old Fashion

5. Quadranta

6. Museo Slab

7. Obitron

8. Cyclo

9. Square Type B

10. Oblik

11. Sweet confusion

12. Gabrielle

13. Melbourne

14. Piron

15. Steiner

16. Telegrafico

17. Caprica

18. Butter

19. Diavlo

20. File

(编译来源:梦想天空 原文来自:20 free fonts for web designers)

[转载]InstallShield 部署安装包整理(3)

2011-05-03mikel阅读(992)

[转载]InstallShield 部署安装包整理(3) – zhaodyun – 博客园.

InstallShield 调用批处理部署MySQL数据库

说明:InstallShield版本: 2010

需求:自动部署mySQL数据库

实现方法:先给客气机安装mySQL的ODBC,以便测试客户输入的用户名密码正确,调用批处理自动部署数据库

由于用ODBC执行mysql脚本导入数据时中文为乱码,这个一直没解决,所以没办法只有想到调用批处理实现Mysql自动部署了!导入需要三个文件,从MySql安装根目录下的Mysql.exe,和你自己的写的导入数据的批处理,要导入的sql脚本文件。

一.InstallShield调用外部mysql odbc msi安装包实现mysql odbc部署

1>在Behavior and Logic->Support Files/Billboards

Support Files->Language Independent下添加要调用的外部msi文件

在OnBegin事件里添加代码判断mysql odbc是否存在并安装mysql的odbc。

szKey="\\SOFTWARE\\ODBC\\ODBCINST.INI\\MySQL ODBC 3.51 Driver";   nResult=RegDBKeyExist(szKey);   if(nResult<0) then   szParam="/i "+SUPPORTDIR^"MyODBC.msi"+" /qb";   if(LaunchAppAndWait("msiexec.exe",szParam,WAIT)<0) then   MessageBox("Mysql ODBC Install failed!",INFORMATION);   endif;   endif;

二.InstallShield调用外部程序

1>在Behavior and Logic->Support Files/Billboards

Support Files->Language Independent下添加要调用的外部可执行文件

此处为执行安装数据库的批处理文件

2>在setup.rul脚本文件的OnSQLLogin的事件后面添加代码向批处理

传递服务器IP,用户名,数据库密码这三个参数

if( bNext ) then //此处添加安装数据库代码 szParam= szServer+" "+szUser+" "+szPassword; //MessageBox(szParam,MB_OK); LaunchAppAndWait(SUPPORTDIR^"bat.bat",szParam,WAIT); return NEXT; else return BACK; endif;

这样当用户在安装时的数据库登陆界面里点击下一步时便执行此处的代码安装数据库实现mysql数据库的自动部署。

[转载]InstallShield 部署安装包整理(2)

2011-05-03mikel阅读(1067)

[转载]InstallShield 部署安装包整理(2) – zhaodyun – 博客园.

说明:InstallShield 版本:2010

部署要求:小组考试系统教师端与学生端WebService,根据客户服务器设置配置Web.config,项目是基于.Net 2.0

说明:由于WebService的部署与Web Site部署一样所以这里掌握InStallShield的Web Site部署就行了

一.设置项目基本信息

略

二.添加网站对应Feture,添加Feture下面对应Components

->在Files and Folders下面添加对应文件夹并在其目录下面添加网站发布文件,

保证他们对应关系一致.

->在Server Configuration->Internet Information Services->Web Sites

右键单击Add Web Site

->对添加的Web Site属性进行设置

*Identification

Name:网站的名称

IP Address:IP地址

TCP Port Number:在此处设置你想设置网站的端口号

Host Header Name:如果网站有域名的话,在这设置

Site Number:默认为0,帮助文档上面看和不是很懂,这里一般不用设置

*General

Component:这里指定你设置网站的组件,注意这里你得切换到Components标签下把这里的这个组件的Destination属性设置成你存放网站的那个目录。

ASP.NET Version:如果是.Net项目在 这里设置项目版本

ASP.NET Platform:应该这里是设置部署目标系统的

Delete on Uninstall:Yes/No是否在卸时删除Web Site

Default Document:一般也不用设置

*Home Directory

Content Source Path(Local or UNC):设置你网站默认的文件夹,这个设置发布网站所在的文件夹

以下是对主目录的一些设置(IIS6里主目录选项卡里的设置)

Script Source Acess:是否允许脚本资源访问

Read Access:读取

Write Access:写入

Drictory Browsing:目录浏览

Log Vists:记录访问

Index Resource:索引资源

*Application Settings

Application Pool:应用程序池一般就先默认的DefaultAppPool

Application Mapping:默认

Session Timeout:默认

Asp ScriptTimeout:默认

*Security/Advanced

这个里面没用到,有用到的可以再看帮助文档

三.Web Site设置

New Application:建立网站

这个还没试过

New Virtual Directory:建立虚拟目录

其设置属性与Web Site的差不多,大多有重复,这里和上面一样

这里发现其实你不添加这两项的话也可以发布你的Web项目

四.权限设置

这个在添加发布网站的时候可以设置文件夹或Component的属性

具体操作:File and Folder选中存放发布网站的文件夹右键Properties->Permissions可以在这个界面里对要发布的网站进行权限设置。

五.数据库部署

见上一篇用的是MySQL

六.动态修改Web Site的配置文件

1>在System ConfigurationXML file Change里在指定的Feture下添加或导入Web Config文件,修改配置文件的连接字符串节点的

server=[IS_SQLServer_SERVER];database=数据库名;Userid=[IS_SQLServer_USERNAME];Pwd=[IS_SQLSERVER_PASSWORD];

这里将自动把客户输入的服务器ip,数据库用户名和密码写入到这个文件.

2>下面就是如何把把这个文件关联到网站文件夹的目录

选中web.config文件,选中General选项卡,

在XML File Destination为你网站的文件目录

在Select Features the XML file belong to:配置文件所在的Feture

最后没解决的问题:InstallShield里用ODBC部署MySQL数据库时执行插入数据的sql脚本后生成的数据为乱码!

下面上传我部署WebService的例子文件,由于里面文件是项目里WebService,所以文件都删除了,有需要的可以看看,希望对你有帮助!如果有更多要求的话,建议自己再多看看帮助文档!

Deploy WebService

[转载]基于Lodop控件的Web打印

2011-05-03mikel阅读(982)

[转载]基于Lodop控件的Web打印 – Vincent.Q – 博客园.

最近项目组的打印控件有所改变,已经换成Lodop控件,使用以后发现,功能确实非常强大.可以打印Web页面内某个控件的内容.下面,还是通过一个实例 来说明下吧,医院系统有个模块,是院内感染模块,它需要填写各种报卡,并且填写完以后,要将它打印出来,而且打印出来的效果要和纸制的报卡近乎一致.额, 这个要求就比较高喽,如图-1所示,这是其中一张报卡的纸制扫描效果图,我们打印出来的效果要和这个几乎一样.

clip_image002

图-1

现在我们来分析一下这里的打印展示类型.

类型1:患者姓名,卡片编号等,直接取自Db栏目值,不需要额外加工.不过,有的需要增加下划线功能.

类型2:出生日期,需要对日期进行拆分,增加汉字:年,月和日

类型3:户籍属于,全部复选框,将其中某一数据选中

类型4:户籍地址,是Db中多个栏目拼接而成.而且都是将数据值替换为显示值

OK,经过以上的分析,上述这些打印类型是可以通过配置的方式实现.新建一XML配置文件,如图-2所示

clip_image004

图-2

字段说明:

字段描述 描述
itemname 打印模板中被替换关键字,同时也是Db表中某列名称
itemparename 若打印类型是comboitem这种组合方式,它用来定义包括哪些子itemname
printstyle 打印类型,目前包括:textbox,dropdownlist,datetime,checkboxlist和comboitem(组合方式,即由其他多个字段组合而成)
printformat 打印格式,日期型的输出格式在此处定义
bottomline 是否对文字增加下划线
datasource 下拉菜单等的数据源,专门测试使用

然后我们看看打印模板文件是如何制作的,如图-3所示

clip_image005

图-3

现在,我们就要通过编码的方式来实现将这些关键字替换掉,简单说,是根据不同的打印格式分别处理.比较核心的代码如图-4所示

clip_image007

图-4

经过上述代码的编写,我们看看最终的效果图,如图-5所示

clip_image009

图-5

打印控件本身非常强大,可以连续打印.在我提供的示例文件中,已经提供代码实现方式.大家可以直接参考.

再说明一点,这个控件,是在客户端需要安装的.好了,有什么问题欢迎留言!

示例代码

基于Lodop控件的Web打印.Files

  • 上一页
  • 1
  • ···
  • 597
  • 598
  • 599
  • 600
  • 601
  • 602
  • 603
  • ...
  • 下一页
  • 共 882 页

热门标签

C# (824)ASP.NET MVC (621)Android (588)ASP.NET (448)数据库 (300)JavaScript (287)JQuery (221)PHP (210)SQLServer (197)程序开发 (156)架构设计 (156)源价值 (155)SQL (128)Java (116)EasyUi (85)教程 (76)网站 (67)人工智能 (66)Debug (63)互联网 (63)MySQL (61)Flash (56)搜索优化 (54)创意 (53)SEO (51)ASP.NET MVC3 (51)电子商务 (50)建站经验 (49)实例代码 (49)源码下载 (47)

分类

  • 开发笔记 (5,970)
  • 源码下载 (9)
  • 网站运营 (279)
  • 图书下载 (115)
  • 创意应用 (108)
  • 动画视频 (75)
  • 琐事杂记 (292)
  • Android (1,011)
  • Java (206)
  • iOS开发 (150)
  • ASP.NET MVC (881)
  • ASP.NET (670)
  • C# (2,016)
  • JavaScript (1,047)
  • Delphi (56)
  • Flash (94)
  • Debug (837)
  • 数据库 (849)
  • 架构设计 (870)
  • 项目管理 (239)
  • AR (27)
  • Android源码 (2)
  • C#源码 (2)
  • Java源码 (4)
  • PHP (402)
  • PHP源码 (2)
  • Python (49)
  • 互联网 (244)
  • 产品 (75)
  • 人工智能 (31)
  • 人工智能 (153)
  • 建站经验 (186)
  • 微信小程序开发 (58)
  • 搜索优化 (130)
  • 机器学习 (28)
  • 游戏 (10)
  • 电子商务 (82)
  • 网站 (56)
  • 网站模板 (1)
  • 网络营销 (133)

链接表

  • 威客宝

© 2025 Mikel   网站地图 备案号:冀ICP备17031416号