เว็บเซิร์ฟเวอร์แบบมัลติเธรดขนาดเล็ก แต่ทรงพลังเขียนอย่างสมบูรณ์ใน Java SE แล้วพอร์ตไปยัง Android
เซิร์ฟเวอร์ใช้ข้อกำหนด HTTP 1.1 ส่วนใหญ่และให้บริการ Servlet API ที่กำหนดเองซึ่งสามารถใช้ในการจัดการหน้าแบบไดนามิก Servlet API ได้รับการออกแบบหลังจาก javax.servlet API อย่างเป็นทางการ แต่ก็ไม่สามารถใช้งานได้ หน้าแบบไดนามิกสนับสนุนคุกกี้เซสชันการอัปโหลดไฟล์และสิ่งอื่นใดเพื่อสร้างเว็บแอปพลิเคชันทั่วไป
wrapper Gradle ที่ให้ไว้ควรใช้ในการสร้างแอปพลิเคชัน:
./gradlew clean build เมื่อเรียกใช้งานบิลด์เต็มรูปแบบเป็นครั้งแรกคุณต้องติดตั้ง Android SDK ก่อน คุณอาจติดตั้งด้วยตนเองหรือใช้สคริปต์ต่อไปนี้ที่ดาวน์โหลดและติดตั้งการอ้างอิงที่ต้องการทั้งหมดเป็น ~/android-sdk
./installsdk.sh หากต้องการทำให้สิ่งต่าง ๆ ทำงานได้หลังจากที่คุณออกจากระบบและเข้าสู่ระบบกลับกำหนดค่าตัวแปรสภาพแวดล้อม ANDROID_HOME :
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcโครงการย่อย HTTP เป็นหัวใจสำคัญของแอปพลิเคชันและเป็นอิสระบนแพลตฟอร์ม Android
ในความเป็นจริงแอพ Android เป็นเพียงความพยายามในการค้นหาการใช้งานโปรโตคอล HTTP ที่ใช้งานได้จริงมากขึ้น
หนึ่งในเป้าหมายการออกแบบคือการรักษาสิ่งประดิษฐ์ที่ มีขนาดเล็ก และเรียบง่ายในแง่ของการพึ่งพาห้องสมุดอื่น ๆ - ไม่จำเป็นต้องใช้ส่วนประกอบของบุคคลที่สาม การใช้งานโปรโตคอล HTTP ทั้งหมดขึ้นอยู่กับการแยกข้อมูลจากซ็อกเก็ต TCP ดิบ
เมื่อแพ็คเกจ ro.polak.http เติบโตพอสมควรมันจะได้รับการปล่อยตัวเป็นสิ่งประดิษฐ์อิสระ
โครงการย่อยสามารถทดสอบได้ด้วยวิธีต่อไปนี้:
./gradlew :http:clean :http:check -PskipAndroidBuildรหัสแพ็คเกจดั้งเดิมได้รับการปรับโครงสร้างใหม่และครอบคลุมด้วยการทดสอบหน่วยและการรวม ควรเก็บความคุ้มครองรหัสไว้สูงกว่า 90%
รหัสแอปพลิเคชันทั้งหมดมีการกำหนดเป้าหมายไปที่ Java 7 นอกจากนี้ยังรวบรวมสำหรับเวอร์ชัน Android SDK <19 (ไม่รองรับทรัพยากรใช้ IOutilities.closeLoesilently (ปิดได้) ใน finally บล็อกเป็นทางเลือกเมื่อปิดสตรีม)
ข้อ จำกัด ความเข้ากันได้อีกประการหนึ่งคือ Random แทนที่จะใช้ ThreadLocalRandom ใช้สำหรับการสร้างลำดับสุ่มใน StrockUtilities
การทดสอบการกลายพันธุ์สามารถเรียกใช้ได้โดยดำเนินการคำสั่งต่อไปนี้:
./gradlew :http:clean :http:pitest -PskipAndroidBuild ผลลัพธ์สามารถพบได้ภายใต้ http/build/reports/pitest/ro.polak.http/index.html และ http/build/reports/pitest/ro.polak.http/mutation.xml
เซิร์ฟเวอร์แบบสแตนด์อโลนสามารถใช้เพื่อรวมกลุ่มย่อย http เข้ากับการใช้งานเซิร์ฟเวอร์ที่เรียกใช้ได้ โครงการย่อย CLI ยังเป็นอิสระบนแพลตฟอร์ม Android มันไม่ได้รวมกับ APK หลัก
./gradlew :cli:bootRun -PskipAndroidBuildนอกจากนี้ยังเป็นไปได้ที่จะสร้าง "uber-jar" หนึ่งและใช้เป็นแอปพลิเคชันแบบสแตนด์อโลน:
./gradlew :cli:fatJar -PskipAndroidBuild สิ่งประดิษฐ์ที่เกิดขึ้นนั้นสามารถคว้าได้จาก ./cli/build/libs/cli-all.jar build/libs/cli- all.jar
ขวดเซิร์ฟเวอร์แบบสแตนด์อโลนสามารถเรียกใช้บนเครื่องใด ๆ ที่มีคำสั่งต่อไปนี้:
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_htmlสำหรับรายการที่สมบูรณ์ของพารามิเตอร์ที่มีอยู่โปรดดูที่ httpd.properties

แอปพลิเคชันตัวอย่างจะถูกนำไปใช้กับ Heroku โดยอัตโนมัติและสามารถติดต่อได้ที่:
โปรดทราบว่าแอปพลิเคชันที่ปรับใช้ ไม่มี แอปพลิเคชัน ผู้ดูแลระบบ เนื่องจากมีให้สำหรับ Android เท่านั้น ดู ProcFile สำหรับคำอธิบายการปรับใช้
package example ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
import ro . polak . http . servlet . HttpServlet ;
public class HelloWorld extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response ) {
response . getWriter (). print ( "Hello World!" );
}
} package example ;
import java . io . IOException ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . Filter ;
import ro . polak . http . servlet . FilterChain ;
import ro . polak . http . servlet . FilterConfig ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class RequestLoggingFilter implements Filter {
private static final Logger LOGGER = Logger . getLogger ( RequestLoggingFilter . class . getName ());
@ Override
public void init ( FilterConfig filterConfig ) throws ServletException {
// Do nothing
}
@ Override
public void doFilter ( HttpServletRequest request , HttpServletResponse response ,
FilterChain filterChain ) throws IOException , ServletException {
LOGGER . fine ( "Handling incoming request " + request . getRequestURL ());
filterChain . doFilter ( request , response );
}
}ตัวอย่าง servlets สามารถพบได้ใน http/src/main/java/ตัวอย่าง
การใช้ตัวกรองที่ใช้งานได้จริงสามารถตรวจสอบได้ที่ SecurityFilter.java และ logoutfilter.java ของแอปพลิเคชันผู้ดูแลระบบ
DeploymentDescriptorBuilder เป็นทางเลือก API สำหรับวิธีการ web.xml แบบดั้งเดิมที่มีจุดมุ่งหมายเพื่อสร้างการสร้างการทำแผนที่ servlet และการลงทะเบียนตัวกรองได้ง่าย ดูตัวอย่างโค้ดด้านล่าง
package example ;
import java . util . List ;
import java . util . regex . Pattern ;
import ro . polak . http . configuration . DeploymentDescriptorBuilder ;
import ro . polak . http . configuration . ServerConfig ;
import ro . polak . http . session . storage . SessionStorage ;
class DeploymentDescriptorFactory {
public List < ServletContextWrapper > buildDeploymentDescriptor ( SessionStorage sessionStorage ,
ServerConfig serverConfig ) {
return DeploymentDescriptorBuilder . create ()
. withSessionStorage ( sessionStorage )
. withServerConfig ( serverConfig )
. addServletContext ()
. withContextPath ( "/example" )
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^.*$" ))
. withUrlExcludedPattern ( Pattern . compile ( "^/(?:Login|Logout)" ))
. withFilterClass ( SecurityFilter . class )
. end ()
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^/Logout$" ))
. withFilterClass ( LogoutFilter . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/Index$" ))
. withServletClass ( Index . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/$" ))
. withServletClass ( Index . class )
. end ()
. end ()
. build ();
}
}การให้บริการทรัพยากรคงที่จะถูกนำไปใช้โดยใช้ defaultServlet
การโหลดทรัพยากรจริงถูกนำมาใช้โดยการลงทะเบียนอินสแตนซ์ ResourceProvider ในการกำหนดค่าเซิร์ฟเวอร์
ขณะนี้มีผู้ให้บริการทรัพยากรสองราย
package ro . polak . http . resource . provider ;
import ro . polak . http . servlet . impl . HttpServletRequestImpl ;
import ro . polak . http . servlet . impl . HttpServletResponseImpl ;
import java . io . IOException ;
public class DummyResourceProvider implements ResourceProvider {
/**
* Tells whether this resource provider can load resource for given path.
*/
@ Override
public boolean canLoad ( final String path ) {
return false ; // TODO Add some logic
}
/**
* Loads the resource for the given path by copying the stream to the response.getOutputStream().
*/
@ Override
public void load ( final String path ,
final HttpServletRequestImpl request ,
final HttpServletResponseImpl response ) throws IOException {
// TODO Load the stream to response.getOutputStream();
}
/**
* Shuts down the resource provider if necessary, usually closes all open resources.
*/
@ Override
public void shutdown () {
}
}ตัวอย่างต่อไปนี้นำเสนอวิธีการรวมเครื่องยนต์เทมเพลต JTWIG
ก่อนอื่นคุณต้องเพิ่มการพึ่งพา JTWIG ในไฟล์ Gradle ของคุณ:
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...จากนั้นมันก็ใช้งานได้นอกกรอบ:
package example ;
import org . jtwig . JtwigModel ;
import org . jtwig . JtwigTemplate ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . HttpServlet ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class Templating extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response )
throws ServletException {
JtwigTemplate template = JtwigTemplate . inlineTemplate ( "Hello {{ var }}" );
JtwigModel model = JtwigModel . newModel (). with ( "var" , "World" );
template . render ( model , response . getOutputStream ());
}
}






หากคุณต้องการส่ง SMS จริงโปรดลบ "& test = 1" ออกจากโพสต์พารามิเตอร์
SERVER_IP=192.168.1.1 ; SERVER_PORT=8080 ;
echo " Phone number: " ; read TO ; echo " Message: " ; read MESSAGE ;
wget -qO- --post-data " to= $TO &message= $MESSAGE &test=1 "
http:// $SERVER_IP : $SERVER_PORT /api/1.0/sms/sendAndroid HTTP Server ใช้ไอคอนจากแพ็ค "Farm Fresh Web" ที่ออกแบบมาอย่างสวยงามโดย Fatcow Web Hosting! ชุดไอคอนเหล่านี้ได้รับใบอนุญาตภายใต้ใบอนุญาต Creative Commons Attribution 3.0
โครงการนี้ใช้ร่วมกันตามใบอนุญาต GNU GPLV3
หากคุณสนใจใบอนุญาตเชิงพาณิชย์โดยเฉพาะโปรดส่งบรรทัดที่ piotr [at] polak [dot] ro