Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: C++ Server Pages | Lập trình web với C++

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    11

    Red face C++ Server Pages | Lập trình web với C++

    Em xin tự giới thiệu, em tên là: Nguyễn Mai Ngọc Anh, sinh năm 1992. Tuy em là con gái nhưng rất thích lập trình, dù thích nhưng em chưa biết gì nhiều, rất mong các đàn anh giúp đỡ.

    Em đặc biết khoái món làm web, trước em đã làm quen với PHP. Tình cờ em tìm thấy C++ Server Pages, chức năng cũng khá là thú vị. Sau đây là ví dụ:

    http://cxxsp.sourceforge.net

    Tệp Category.h
    C++ Code:
    1. #ifndef CATEGORY_H
    2. #define CATEGORY_H
    3.  
    4. #include <string>
    5. struct Category {
    6.     long id;
    7.     std::string name;
    8. };
    9. #endif//CATEGORY_H

    Tệp Products.cpp
    C++ Code:
    1. #include <boost/lexical_cast.hpp>
    2. #include <servlet/RequestDispatcher.h>
    3. #include <boost/shared_ptr.hpp>
    4. #include "Product.h"
    5. #include "Category.h"
    6. #include "mysql.h"
    7. #include <servlet/HttpServlet.h>
    8. #include <math.h>//ceilf
    9.  
    10. using namespace std;
    11. using boost::lexical_cast;
    12. using boost::shared_ptr;
    13. using namespace servlet;
    14.  
    15. class Products : public HttpServlet {
    16.     typedef vector<Product> products_t;
    17.     typedef std::vector<Category> categories_t;
    18.  
    19.     inline bool is(const Mysql::params_t::const_iterator& iter, const std::string& name) {
    20.         return (iter->first==name && !iter->second.empty());
    21.     }
    22.  
    23.     categories_t fetch_categories();
    24.     string where_part(const Mysql::params_t& params);
    25.     string order_part(const std::string& productsOrder, const std::string& productsDir);
    26.     inline int getPageSize(const std::string& productsPageSize);
    27.     string limit_part(const std::string& productsPageSize, const std::string& productsPage);
    28.     products_t fetch(const std::string& sql);
    29.     int count(const std::string& sql);
    30.     string make_naviLink(HttpServletRequest& request);
    31.     void process(HttpServletRequest& request, HttpServletResponse &response);
    32. public:
    33.     void doGet(HttpServletRequest& request, HttpServletResponse &response);
    34. };
    35.  
    36.  
    37. Products::categories_t Products::fetch_categories() {
    38.     const string sql = "SELECT * FROM store_categories";
    39.     shared_ptr<MYSQL_RES> result = mysql.query(sql);
    40.  
    41.     categories_t categories;
    42.     MYSQL_ROW row;
    43.     while( (row = mysql_fetch_row(result.get())) ) {
    44.         Category category;
    45.         category.id=lexical_cast<long>(mysql.get(row,0));
    46.         category.name=mysql.get(row,1);
    47.         categories.push_back(category);
    48.     }
    49.     return categories;
    50. }
    51.  
    52. string Products::where_part(const Mysql::params_t& params) {
    53.     vector<string> cond;
    54.     for(map<string,string>::const_iterator iter = params.begin(); iter!=params.end(); ++iter) {
    55.         if(is(iter,"category_id"))
    56.             cond.push_back("category_id=$category_id");
    57.         else if(is(iter,"s_keyword"))
    58.             cond.push_back("product_name LIKE '%$s_keyword%'");
    59.         else if(is(iter,"price_from"))
    60.             cond.push_back("price >= $price_from");
    61.         else if(is(iter,"price_to"))
    62.             cond.push_back("price <= $price_to");
    63.     }
    64.     string query;
    65.     if(!cond.empty()) {
    66.         query += " WHERE ";
    67.         for(unsigned i=0;;++i) {
    68.             query += cond[i];
    69.             if(i==cond.size()-1)
    70.                 break;
    71.             query += " AND ";
    72.         }
    73.     }
    74.     return mysql.prepare(query,params);
    75. }
    76. string Products::order_part(const std::string& productsOrder, const std::string& productsDir) {
    77.     string query;
    78.     if(!productsOrder.empty()) {
    79.         query = " ORDER BY ";
    80.         query += (productsOrder == "price") ? "price" : "product_name";
    81.         if(!productsDir.empty()){
    82.             query += (productsDir == "ASC") ? " ASC" : " DESC";
    83.         }
    84.     }
    85.     return query;
    86. }
    87. int Products::getPageSize(const std::string& productsPageSize) {
    88.     int pageSize = 10;
    89.     if(!productsPageSize.empty())
    90.         pageSize = lexical_cast<int>(productsPageSize);
    91.     return pageSize;
    92. }
    93. string Products::limit_part(const std::string& productsPageSize, const std::string& productsPage) {
    94.     string query = " LIMIT ";
    95.     int pageSize = getPageSize(productsPageSize);
    96.     query += lexical_cast<string>(pageSize);
    97.  
    98.     if(!productsPage.empty()) {
    99.         int page = lexical_cast<int>(productsPage) - 1;
    100.         if(page < 0)
    101.             page = 0;
    102.         query += " OFFSET " + lexical_cast<string>(page * pageSize);
    103.     }
    104.     return query;
    105. }
    106.  
    107. Products::products_t Products::fetch(const std::string& sql) {
    108.     shared_ptr<MYSQL_RES> result = mysql.query(sql);
    109.     products_t products;
    110.     MYSQL_ROW row;
    111.     while( (row = mysql_fetch_row(result.get())) ) {
    112.         Product product;
    113.         product.product_id = lexical_cast<long>(mysql.get(row,0));
    114.         product.category_id = lexical_cast<long>(mysql.get(row,1));
    115.         product.name = mysql.get(row,2);
    116.         product.price = lexical_cast<float>(mysql.get(row,3));
    117.         product.img = mysql.get(row,4);
    118.         product.desc = mysql.get(row,5);
    119.         product.recomended = lexical_cast<bool>(mysql.get(row,6));
    120.         products.push_back(product);
    121.     }
    122.     return products;
    123. }
    124.  
    125. int Products::count(const std::string& sql) {
    126.     shared_ptr<MYSQL_RES> result = mysql.query(sql);
    127.     MYSQL_ROW row;
    128.     if( (row = mysql_fetch_row(result.get())) )
    129.         return lexical_cast<int>(mysql.get(row,0));
    130.     return 0;
    131. }
    132.  
    133. string Products::make_naviLink(HttpServletRequest& request) {
    134.     auto_ptr< vector<string> > names_ptr = request.getParameterNames();
    135.     vector<string>& names = *names_ptr;
    136.     string link;
    137.     for(unsigned i=0;i<names.size(); ++i) {
    138.         if(names[i] == "productsPage")
    139.             continue;
    140.         link += link.empty()?'?':'&';
    141.         link += names[i] + "=" + request.getParameter(names[i]);
    142.     }
    143.     link += (link.empty()?'?':'&') + string("productsPage=");
    144.     return ("Products.sxx"+link);
    145.  
    146. }
    147.  
    148. void Products::process(HttpServletRequest& request, HttpServletResponse &response) {
    149.     map<string,string> params;
    150.     params["category_id"]=request.getParameter("category_id");
    151.     params["s_keyword"]=request.getParameter("s_keyword");
    152.     params["price_from"]=request.getParameter("price_from");
    153.     params["price_to"]=request.getParameter("price_to");
    154.  
    155.     const string WHERE = where_part(params) ;
    156.     string query = "SELECT * FROM store_products"
    157.         + WHERE
    158.         + order_part(request.getParameter("productsOrder"), request.getParameter("productsDir"))
    159.         + limit_part(request.getParameter("productsPageSize"), request.getParameter("productsPage"));
    160.  
    161.     products_t products = fetch(query);
    162.     request.setAttribute("products", products);
    163.  
    164.     query = "SELECT COUNT(*) FROM store_products" + WHERE;
    165.     int ResultsFound = count(query);
    166.     request.setAttribute("ResultsFound", ResultsFound);
    167.  
    168.     int pageSize = getPageSize(request.getParameter("productsPageSize"));
    169.     int pageCount = static_cast<int>( ceilf(static_cast<float>(ResultsFound)/pageSize) );
    170.     request.setAttribute("pageCount", pageCount);
    171.  
    172.     int currentPage = 1;
    173.     string s_currentPage = request.getParameter("productsPage");
    174.     if(!s_currentPage.empty())
    175.         currentPage = lexical_cast<int>(s_currentPage);
    176.     request.setAttribute("currentPage", currentPage);
    177.  
    178.     request.setAttribute("naviLink",make_naviLink(request));
    179. }
    180.  
    181. void Products::doGet(HttpServletRequest& request, HttpServletResponse &response) {
    182.     try{
    183.         request.setAttribute("categories", fetch_categories());
    184.         process(request, response);
    185.     }catch(const exception& ex) {
    186.         request.setAttribute<string>("error",ex.what());
    187.         request.setAttribute("ResultsFound", 0);
    188.         request.setAttribute("products", products_t());
    189.         request.setAttribute("naviLink",string());
    190.         request.setAttribute("currentPage", 0);
    191.     }
    192.     request.getRequestDispatcher("ProductsView.csp")->forward(request,response);
    193. }
    194.  
    195.  
    196. EXPORT_SERVLET(Products);

    Tệp ProductsView.csp
    Code:
    <%@ page import="vector,Category.h,Product.h" %>
    <%# using namespace std; %>
    <%! 
        typedef vector<Category> categories_t; 
        typedef vector<Product> products_t;
    %>
    <html>
    <head>
    <title>SearchResults</title>
    <link rel="stylesheet" type="text/css" href="style/Style.css">
    </head>
    <body bgcolor="#FFFFFF" link="#000000" alink="#FF0000" vlink="#000000" text="#000000" class="NoisePageBODY">
    <%@ include file="Header.csp" %>
    <p>
    <form method="get">
      <font class="NoiseFormHeaderFont">Search Products</font> 
      <table border="0" cellpadding="2" cellspacing="1" class="NoiseFormTABLE">
        <% if(request.hasAttribute("error")) { %>
        <tr>
          <td colspan="2" class="NoiseErrorDataTD"><%= request.getAttribute<string>("error") %></td>
        </tr>
        <% } %>
    
        <tr>
          <td class="NoiseFieldCaptionTD">Category</td> 
          <td class="NoiseDataTD">
            <select class="NoiseSelect" name="category_id">
              <option selected value="">All</option>
              <% 
                categories_t categories = request.getAttribute<categories_t>("categories"); 
                for(unsigned i=0;i<categories.size();++i) {
              %>
              <option value="<%=categories[i].id%>"><%=categories[i].name%></option>
              <% } %>                        
            </select>
          </td> 
        </tr>
     
        <tr>
          <td class="NoiseFieldCaptionTD">Keyword</td> 
          <td class="NoiseDataTD"><input class="NoiseInput" maxlength="250" name="s_keyword" value="<%=request.getParameter("s_keyword")%>">&nbsp;</td> 
        </tr>
     
        <tr>
          <td colspan="2" align="right" class="NoiseFieldCaptionTD" nowrap>
            <input class="NoiseButton" type="submit" value="Search">&nbsp; </td> 
        </tr>
     
      </table>
    </form>
    </p>
    <font class="NoiseFormHeaderFont" size="4"><b>Search
    Results - <font class="NoiseFormHeaderFont" size="8"><%=request.getAttribute<int>("ResultsFound")%></font>&nbsp;products
    found.</b></font>
    
    <table border="0" cellpadding="2" cellspacing="1" class="NoiseFormTABLE">
      <% 
      products_t products = request.getAttribute<products_t>("products"); 
      if(!products.empty()) { 
        for(unsigned i=0;i<products.size(); ++i) { 
            const Product& product = products[i];
      %> 
      <tr>
        <td class="NoiseColumnTD" rowspan="2"><a class="NoiseDataLink" href="ProductDetails.sxx?product_id=<%=product.product_id%>"><img class="NoiseInput" src="<%=product.img%>" border="0"></a></td> 
        <td class="NoiseDataTD"><a class="NoiseDataLink" href="ProductDetails.sxx?product_id=<%=product.product_id%>"><%=product.name%></a></td> 
      </tr>
     
      <tr>
        <td class="NoiseDataTD">Price: $<%=product.price%></td> 
      </tr>
     
      <tr>
        <td class="NoiseDataTD" colspan="2">&nbsp;</td> 
      </tr>
      <%  } } else { %>
      <tr>
        <td class="NoiseDataTD" colspan="2">No records&nbsp;</td> 
      </tr>
      <% } %>
      <tr>
        <td align="middle" class="NoiseFieldCaptionTD" colspan="2" nowrap>&nbsp; 
          <% 
            int pageCount = request.getAttribute<int>("pageCount");
            int currentPage = request.getAttribute<int>("currentPage");
            string naviLink = request.getAttribute<string>("naviLink");
          %>
          <%
            if(currentPage>1) { 
          %>
            <a class="NoiseNavigatorLink" href="<%=naviLink%><%=1%>">First</a>
            <a class="NoiseNavigatorLink" href="<%=naviLink%><%=currentPage+1%>">Prev</a>
          <% } %>  
          <%
            for(int page=1;page<=pageCount; ++page) { 
                if(page==currentPage) 
                    out << page; 
                else { %>
          <a class="NoiseNavigatorLink" href="<%=naviLink%><%=page%>"><%=page%></a>
                <% } %>
          &nbsp;
            <% } %>
          of
          <%= pageCount %>&nbsp; 
          <% if(currentPage<pageCount) { %>
            <a class="NoiseNavigatorLink" href="<%=naviLink%><%=currentPage+1%>">Next</a>
            <a class="NoiseNavigatorLink" href="<%=naviLink%><%=pageCount%>">Last</a>
          <% } %>  
        </td> 
      </tr>
    </table>
    <%@ include file="Footer.csp" %>
    </body>
    </html>
    Có phải rất hay không các anh, cùng thảo luận nào

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cái này là CGI interface : dynamic web pages
    Read if you're really interesting in Web with C++.

  3. #3
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    hic tui không chuyên cái nì ! chuyên java hơn

  4. #4
    Ngày gia nhập
    03 2008
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Cái này là CGI interface : dynamic web pages

    Read if you're really interesting in Web with C++.
    Cái này có gì đặc biệt vậy anh? Em thấy nó cũng giống như CGI cũ.

  5. #5
    Ngày gia nhập
    12 2006
    Bài viết
    5

    Tự dưng lại phải kiếm cái host support C++ :(

  6. #6
    Ngày gia nhập
    03 2008
    Bài viết
    11

    Mặc định C++ Server Pages | Lập trình web với C++

    Vâng, đúng vậy anh à, em nghĩ cái này là dùng cho hệ thống riêng.

  7. #7
    Ngày gia nhập
    03 2009
    Bài viết
    1

    xin lỗi có ai giải thích chi tiết hơn không.

  8. #8
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Đây là vấn đề khá hay và đây là một đề tài liên quan:

    Lập trình mạng | Simple WebServer C++

    Và sau đây là 2 link khác để tham khảo
    _http://www.adp-gmbh.ch/win/misc/webserver.html
    _http://www.adp-gmbh.ch/win/misc/webserver.html
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Ireport trong java lỗi the document has no pages?
    Gửi bởi timmo trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 1
    Bài viết cuối: 13-01-2014, 10:03 PM
  2. Trả lời: 0
    Bài viết cuối: 31-08-2013, 01:18 PM
  3. Chuyển từ sql server sang sql server compact trong visual studio 2010
    Gửi bởi ndnhan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 18-11-2012, 12:52 PM
  4. MS SQL với C# Backup trên Server A và Restore ở Server B cùng cấu trúc CSDL như thế nào?
    Gửi bởi snake_programmer trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 23-08-2011, 09:19 AM
  5. Làm sao để đưa 1 cửa sổ hiện hành vào pages
    Gửi bởi dieucay555 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 02-04-2009, 02:44 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn