Wednesday, October 9, 2013

Very simple.net web service exception handling


  1. Create header exception

  2. Assign header  for special web method

  3. Exception handling at client: SoapException and SoapHeaderException



Header definition
[sourcecode language="csharp"]
public class WSHeader: SoapHeader
{
public WSHeader()
{

}
private DateTime _CallTime;
public DateTime CallTime
{
get { return _CallTime; }
set { _CallTime = value; }
}
}
[/sourcecode]

Webservice difinition and header assignment
[sourcecode language="csharp"]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TimingService : System.Web.Services.WebService
{
public WSHeader DiscountHeader;
public TimingService()
{

//Uncomment the following line if using designed components
//InitializeComponent();
}

[WebMethod]
[SoapHeader("DiscountHeader", Direction = SoapHeaderDirection.In)]
public double Discount(DateTime birthdate)
{
if (DiscountHeader == null)
throw new SoapHeaderException("User invalid", SoapException.ClientFaultCode);
else if (birthdate > DateTime.Now)
{
throw new SoapException("Birthdate invalid", SoapException.ClientFaultCode);
}
else
{
if (DateTime.Now.Year - birthdate.Year < 18)
return 0.1;
else
return 0.0;
}
}
}
[/sourcecode]

Call method from client
[sourcecode language="csharp"]
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
WS.WSHeader header = new Client.WS.WSHeader();
header.CallTime = DateTime.Now.AddDays(-1);

WS.TimingService client = new Client.WS.TimingService();

client.WSHeaderValue = header;

Console.WriteLine("Discount per: "+ client.Discount(new DateTime(2013, 1, 1))*100 + "%");
}
catch (SoapHeaderException ex)
{
Console.WriteLine("Header error: " + ex.Message);
}
catch(SoapException ex)
{
Console.WriteLine("Call error: " + ex.Message);
}
}
}
}
[/sourcecode]

Friday, October 4, 2013

Lab – JSP - custom tag

Objectives


1. Create custom tag: Basis, Iteration and Complex tag


- Implement Interface
- Extend from Build in class

2. Using custom tag in JSP pages


Hits: Steps to create and call custom tag
1. Describe tag structure (Tag Library Description)
2. Process tag (Tag handler)
3. Register and call custom tag on JSP pages (<%@taglib ......%>

Custom tag 2013 (pdf version)


Source code

Create custom tag


1. Empty tag: header tag, footer tag
2. If – then – else tag
3. Iteration tag: loop tag
4. Employee list tag

HEADER tag (Implement Tag interface)


Create Tag Library Descriptor (customTag.tlb) file and insert xml section below
<tag>
<name>header</name>
<tag-class>MySource.header</tag-class>
<body-content>empty</body-content>
<attribute>
<name>companyname</name>
<required>true</required>
</attribute>
</tag>
Create tag handler
Create java class (header.java) in MySource package implement Tag interface
clip_image002
package MySource;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class header implements Tag{
String companyname ="";
public void setCompanyname(String companyname) {
this.companyname = companyname;
}

PageContext context;
Tag parrent;
public void setPageContext(PageContext pc) {
context = pc;
}

public void setParent(Tag t) {
parrent = t;
}

public Tag getParent() {
return parrent;
}

public int doStartTag() throws JspException {
try {
context.getOut().print("<h1>"+companyname+"</h1>");
context.getOut().print("<h3>Education Department</h3>");
} catch (IOException ex) {
Logger.getLogger(header.class.getName()).log(Level.SEVERE, null, ex);
}

return SKIP_BODY;
}

public int doEndTag() throws JspException {
return SKIP_BODY;
}

public void release() {
}

}

Call header from jsp page


Create jsp page (home.jsp), using taglib tag register header tag
<%@page contentType="text/html" pageEncoding="windows-1252"%>
<%@taglib prefix="my" uri="/WEB-INF/MyLib.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Home</title>
</head>
<body>
<my:header companyname="Can Tho University Software Center (CUSC)"/>
</body>
</html>

Now build and run home.jsp page


clip_image004

Home.jsp

FOOTER tag (extend from Simple Tag Support class)


Create Tag Handler (footer.java)
clip_image006
Select Tag Handler from netbean template
clip_image008
Provide tag name as footer and click next
clip_image010
Click Browse to select tld file, click New to add companyname attribute as figure

Modified home.jsp as below


<%@page contentType="text/html" pageEncoding="windows-1252"%>
<%@taglib prefix="my" uri="/WEB-INF/MyLib.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Home</title>
</head>
<body>
<my:header companyname="Can Tho University Software Center (CUSC)"/>
<my:footer companyname="Can Tho University Software Center (CUSC)"/>
</body>
</html>

Now build and run home.jsp page


clip_image012
Home.jsp

Loop tag


Create Tag Handler (loop.java) extend from Simple Body Tag Support, with 2 attribute start and end
clip_image014
clip_image016

Modified writeTagBodyContent as below

private void writeTagBodyContent(JspWriter out, BodyContent bodyContent) throws IOException {
if(start < end)
{
out.print("<ol>");
while(start < end)
{
out.print("<li>");
bodyContent.writeOut(out);
out.print("</li>");
start++;
}

out.print("</ol>");
}
bodyContent.clearBody();
}

Modified home.jsp as below
<%@page contentType="text/html" pageEncoding="windows-1252"%>
<%@taglib prefix="my" uri="/WEB-INF/MyLib.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Home</title>
</head>
<body>
<my:header companyname="Can Tho University Software Center (CUSC)"/>
<hr/>
<my:loop start="0" end="10">
<%= new java.util.Date()%>
</my:loop>
<my:footer companyname="Can Tho University Software Center (CUSC)"/>
</body>
</html>

Now build and run home.jsp page


clip_image018

Employee list tag


Create Tag Handler (employee.java) extend from Simple Body Tag Support (same above)
Modified employee.java as:
private void writeTagBodyContent(JspWriter out, BodyContent bodyContent) throws IOException {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn;
conn = DriverManager.getConnection("jdbc:sqlserver://ntdan-lt;user=sa;password=Admin@123;database=NorthWind;");
PreparedStatement command = conn.prepareStatement(bodyContent.getString());
java.sql.ResultSet result = command.executeQuery();
ResultSetMetaData meta = result.getMetaData();
out.print("<table border='1px'>");
out.print("<tr bgcolor='#ACE768'>");
int count = 1;
while(count <= meta.getColumnCount()) {
out.print("<td>"+meta.getColumnName(count)+"</td>");
count++;
}

out.print("</tr>");
while(result.next()) {
count=1;
out.print("<tr>");
while(count <= meta.getColumnCount()) {
out.print("<td>"+result.getString(meta.getColumnName(count))+"</td>");
count++;
}
out.print("</tr>");
}
out.print("</table>");
conn.close();
} catch(Exception ex) {
out.print(ex.toString());
}
bodyContent.clearBody();
}

Open home.jsp, insert code as

<body>
<my:header companyname="Can Tho University Software Center (CUSC)"/>
<hr/>
<my:loop start="0" end="2">
<%= new java.util.Date()%>
</my:loop>
<my:employee>Select Top 5 EmployeeID, FirstName, LastName From Employees</my:employee>
<my:footer companyname="Can Tho University Software Center (CUSC)"/>
</body>

Now build and run home.jsp page


clip_image020

Friday, September 6, 2013

Upload hình ảnh trong jsp

Do một số bạn thường hỏi vấn đề upload tài nguyên trong jsp (chủ yếu lúc làm đồ án) nên tổi để hướng dẫn ở đây để các bạn theo dõi.

Giao diện chọn ảnh

upload

[sourcecode language="html"]
<form name="uploadForm" action="upload.jsp" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input TYPE=Button name='Upload' Value='Upload' onClick="uploadForm.Upload.value='Uploading...';document.uploadForm.action='upload.jsp';document.uploadForm.submit()">
</form>
[/sourcecode]

Kết quả sau khi upload
upload1

[sourcecode language="html"]
<%
response.setContentType("text/html");
response.setHeader("Cache-control","no-cache");

String err = "";
String fileOutPath = request.getRealPath("/").replace('\\','/');
String lastFileName = "";

String contentType = request.getContentType();
String boundary = "";
final int BOUNDARY_WORD_SIZE = "boundary=".length();
if(contentType == null || !contentType.startsWith("multipart/form-data")) {
err = "Ilegal ENCTYPE : must be multipart/form-data\n";
err += "ENCTYPE set = " + contentType;
}else{
boundary = contentType.substring(contentType.indexOf("boundary=") + BOUNDARY_WORD_SIZE);
boundary = "--" + boundary;
try {
javax.servlet.ServletInputStream sis = request.getInputStream();
byte[] b = new byte[1024];
int x=0;
int state=0;
String name=null,fileName=null,contentType2=null;
java.io.FileOutputStream buffer = null;
while((x=sis.readLine(b,0,1024))>-1) {
String s = new String(b,0,x);
if(s.startsWith(boundary)) {
state = 0;
//out.println("name="+name+"<br>");
//out.println(fileName+"<br>");

name = null;
contentType2 = null;
fileName = null;


}else if(s.startsWith("Content-Disposition") && state==0) {
state = 1;
if(s.indexOf("filename=") == -1)
name = s.substring(s.indexOf("name=") + "name=".length(),s.length()-2);
else {
name = s.substring(s.indexOf("name=") + "name=".length(),s.lastIndexOf(";"));
fileName = s.substring(s.indexOf("filename=") + "filename=".length(),s.length()-2);
if(fileName.equals("\"\"")) {
fileName = null;
}else {
String userAgent = request.getHeader("User-Agent");
String userSeparator="/"; // default
if (userAgent.indexOf("Windows")!=-1)
userSeparator="\\";
if (userAgent.indexOf("Linux")!=-1)
userSeparator="/";
fileName = fileName.substring(fileName.lastIndexOf(userSeparator)+1,fileName.length()-1);
if(fileName.startsWith( "\""))
fileName = fileName.substring( 1);
}
}
name = name.substring(1,name.length()-1);
if (name.equals("file")) {
if (buffer!=null)
buffer.close();
lastFileName = fileName;
buffer = new java.io.FileOutputStream(fileOutPath+fileName);
}
}else if(s.startsWith("Content-Type") && state==1) {
state = 2;
contentType2 = s.substring(s.indexOf(":")+2,s.length()-2);
}else if(s.equals("\r\n") && state != 3) {
state = 3;
}else {
if (name.equals("file"))
buffer.write(b,0,x);
}
}
sis.close();
buffer.close();
}catch(java.io.IOException e) {
err = e.toString();
}
}
boolean ok = err.equals("");
if(!ok) {
out.println(err);
}else{
%>
<SCRIPT language="javascript">
//history.back(1)
alert('Uploaded <%=lastFileName%>');
//window.location.reload(false)
</SCRIPT>
<%
}
%>
<img src="<% out.print(request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"+lastFileName);%>
" width="200px" alt="imgeas"/>
[/sourcecode]

Đây chỉ là ví dự đơn giản nhất để các bạn nghiên cứu thêm.

Thursday, August 29, 2013

Kỹ thuật SEO hiệu quả nhất

Những kỹ thuật SEO tối ưu nhất năm 2012


Bài này tôi chủ yếu dành tặng cho các cá nhân và những doanh nghiệp đang tìm hiểu về SEO năm 2012. Riêng các Công ty SEO chuyên nghiệp ắt hẳn cũng đã nắm được phần nào các kỹ thuật này, tuy nhiên có khá nhiều điều mới mẻ ở đây nên các bạn cũng nên theo dõi.


Các bạn có thể dễ dàng tìm thấy các trang nói về kỹ thuật SEO, kiến thức SEO bằng cách search Google, nhưng đa số chúng đều là những tài liệu cũ và lỗi thời. Ở đây tôi sẽ đề cập đến 10 thủ thuật SEO giúp bạn thoát khỏi thuật toán Panda và Penguin.



Viết nội dung chất lượng và duy nhất
Nội dung chất lượng và duy nhất là vấn đề mấu chốt cơ bản trong SEO. Không có nội dung hay và độc nhất thì website cũng như là tiếng sáo trong cơn gió. Bạn hãy viết sao cho người đọc muốn chia sẻ nội dung của bạn với mọi người.


Thường xuyên publish nội dung mới

Một website không hề thay đổi về nội dung cả tháng trời thì cũng như một website chết đối với Google và cả khách hàng. Nếu website của bạn thường có nội dung mới bạn sẽ tạo thói quen cho khách hàng thường xuyên ghé thăm trang web của bạn và chắn chắn rằng các bộ máy tìm kiếm cũng tham quan website của bạn một cách đều đặn.


Mỗi trang trên website nên có 1 cụm từ khóa riêng biệt

Ở mỗi trang con trên website bạn nên tập trung vào 1 cụm từ khóa gồm 5 từ, nó có thể là 1 sản phẩm hay 1 dịch vụ liên quan đến từ khóa chính của website.

Ví dụ từ khóa chính của website bạn là “Nước hoa” thì bạn sẽ có những cụm từ cần quan tâm như “Nước hoa dành cho nữ”, “Nước hoa dành cho nam”, “Nước hoa hàng hiệu”,…

Chú ý: Phải xác định cụm từ mục tiêu của mình trước khi viết nội dung cho nó. Khi viết nội dung bạn hãy chèn các cụm từ khóa này thật tự nhiên và khéo léo, tuyệt đối không nhồi nhét gây cảm giác khó chịu cho người đọc lẫn bộ máy tìm kiếm. Bạn có thể tham khảo bài viết Nghệ thuật nghiên cứu từ khóa ở đây.


Làm cho website của bạn thật hữu ích, dễ sử dụng với khách hàng

Bạn phải bảo đảm rằng những nội dung trên website thật dễ hiểu và hữu ích với khách hàng. Ngôn ngữ lập trình website phải đúng tiêu chuẩn trên tất cả trình duyệt. Hãy làm mọi thứ để bộ máy tìm kiếm dễ dàng tìm thấy và index nội dung trên trang web của bạn.


Viết tiêu đề và mô tả trang lôi cuốn

Mỗi trang trên website phải có tiêu đề và mô tả riêng biệt. Khi bạn viết hay sẽ làm gia tăng tỉ lệ click chuột vào trang web của bạn, từ đó thu hút thêm nhiều khách hàng tiềm năng.


Chèn cụm từ khóa vào URL

Tập trung vào một từ khóa hay một cụm từ khóa là điều cần thiết, nó làm công cụ tìm kiếm biết đâu là chủ đề chính của website. Ngoài tiêu đề trang và nội dung, bạn cũng nên đặt cụm từ khóa mục tiêu vào địa chỉ URL, nó giúp bộ máy tìm kiếm hiểu website của bạn đang nói về vấn gì.


Sử dụng microformat cho những vùng liên quan.

Định dạng microformat là một phương pháp giúp xác định một loại thông tin cụ thể, như địa chỉ doanh nghiệp, bài viết, sự kiện, hoặc thông tin cá nhân. Microformat chỉ có vài định dạng trọng yếu, và một trong những định dạng Bing và Google thường sử dụng chính là Schema.org (http://schema.org/), bạn có thể kiểm tra xem Goole trông thấy định dạng nào bạn áp dụng cho trang web bằng cách sử dụng công cụ thử nghiệm rich snippet (http://www.google.com/webmasters/tools/richsnippets).


Xây dựng liên kết

Bình luận blog và tham gia diễn đàn là cách tuyệt vời để có được liên kết và thu hút traffic (lưu lượng truy cập website). Nhưng điều hữu ích nhất nó mang đến là giúp xây dựng Thương hiệu và website của bạn như là 1 phần của cộng đồng. Đừng cô lập mình bằng cách không tìm kiếm và trao đổi kinh nghiệm cũng như liên kết với các website khác. Tạo được danh tiếng nghĩa là bạn sẽ có được sự tin tưởng từ người dùng lẫn bộ máy tìm kiếm. Hãy gia nhập cộng đồng và để lại những comment có tính xây dựng.


Tham gia mạng xã hội

Tham gia bằng cách sử dụng các phương tiện truyền thông xã hội có thể tốn thời gian nhưng nó thật sự rất có giá trị. Mạng xã hội không chỉ thu hút traffic mà nó còn tạo cho bạn danh tiếng trên bảng xếp hạng tìm kiếm và là bộ mặt của công ty bạn trước Khách hàng. Hãy nhớ tham gia mạng xã hội không phải là một sự lãng phí thời gian.


Đam mê

Hãy xây dựng trang web với niềm đam mê và không một công ty hay Dịch vụ SEO nào có thể truyền đạt niềm đam mê đó của bạn. Vì vậy, hãy tự viết nội dung cho trang web của mình. Hãy cho Khách hàng thấy niềm đam mê của bạn và làm họ yêu thích nó như chính bạn bằng sự trung thực của mình.


(Nguồn tham khảo internet)

Tuesday, August 27, 2013

Hello World, Basic Server/Client Example of WCF (Tham khảo cho các bạn LTV môn WCF)

Các bạn học lập trình viên Aptech có thể tham khảo thêm vài viết này (nguồn từ codeproject)

Hello World, Basic Server/Client Example of WCF

[caption width="400" align="aligncenter"]Hello World, Basic Server/Client Example of WCF Hello World, Basic Server/Client Example of WCF[/caption]

Và bài viết này Creating and Consuming a Simple WCF Service without using configuration files

Goodluck !

Friday, August 2, 2013

Subversion -hệ thống quản lý phiên bản SVN

Subversion(viết tắt là SVN) là một hệ thống quản lí version (version control system(VCS)) được giới thiệu vào năm 2000 bởi công ty CollabNet.



Kiến trúc cở bản của SVN.
Hệ thống SVN là một hệ thống quản lý tài nguyên của một dự án. Hệ thống có khả năng tự cập nhật, so sánh và kết hợp tài nguyên mới vào tài nguyên cũ.

  1. Hổ trợ nhóm làm việc trên cùng một project, việc nhiều người cùng chỉnh sửa nội dung của một file là điều không thể tránh khỏi. SVN cung cấp các chức năng để có thể thực hiện việc này một cách đơn giản và an toàn.

  2. Subversion là hệ thống quản lý source code tập trung (Centralized).

  3. Subversion quản lý tập tin và thư mục theo thời gian.

  4. Việc ghi log cụ thể chi tiết giúp ta quản lý quá trình phát triển dự án tốt hơn

  5. Điểm đặt biệt của SVN là nó lưu lại tất cả những gì thay đổi trên hệ thống file: file nào đã bị thay đổi lúc nào, thay đổi như thế nào, và ai đã thay đổi nó.

  6. —SVN cũng cho phép recover lại những version cũ một  cách chính xác.

  7. —Subversion hỗ trợ khá nhiều giao thức để kết nối giữa client và server.


Đối với các bạn làm eProject SVN là công cụ rất hữu ích để các bạn quản lsy mã nguồn của nhóm.

1. Sử dung server SVN google cung cấp để quản lý mã nguồn của nhóm: mỗi nhóm tạo một project trên http://code.google.com để quản lý mã nguồn dự án. Chọn subversion là SVN.

2. Sử dung plugin SVN (VisualSVN-3.5.1) và TortoiseSVN-1.8.1.24570-x64-svn-1.8.1 tích hợp mã nguồn vào Visual Studio, Netbean để tiến  hành phát triển.

Thời gian tới tôi sẽ hướng dẫn các bạn lớp lập trình viên tôi giữ laij và up hướng dẫn lên để các bạn tham khảo.

[youtube=http://youtu.be/e27yJJPWZFo]

Lay ve website

[youtube=http://youtu.be/5u1mFWWspy4]

Translate