鏉ユ簮锛歨ttp://www.bjsxt.com/
涓€銆丼02E205_01鎵嬪啓鏈嶅姟鍣╤ttpserver_xml閰嶇疆鏂囦歡_sax瑙f瀽鍩虹
XML
package com.test.xml;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class ParseDemo {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//銆佽幏鍙栬В鏋愬伐鍘? SAXParserFactory factory = SAXParserFactory.newInstance();
//銆佷粠瑙f瀽宸ュ巶鑾峰彇瑙f瀽鍣? SAXParser parser = factory.newSAXParser();
//銆佸姞杞芥枃妗ocument娉ㄥ唽澶勭悊鍣? //銆佺紪鍐欏鐞嗗櫒
PersonHandler handler = new PersonHandler();
parser.parse(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/test/xml/person.xml")
,handler);
List<Person> persons = handler.getPersons();
for (Person p : persons) {
System.out.println(p.getName() + "-->>" + p.getAge());
}
}
}
package com.test.xml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 瀛樺偍瀵矽薄
*/
public class PersonHandler extends DefaultHandler{
private List<Person> persons;
private Person person;
private String tag;//璁闆綍鏍囩鍚?
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Override
public void startDocument() throws SAXException {
//System.out.println("澶勭悊鏂囨。寮€濮?);
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("寮€濮嬩竴涓厓绱? + qName);
if(null!=qName){
tag = qName;
}
if(null!=qName && qName.equals("person")){
person = new Person();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//System.out.println(new String(ch,start,length));
String str = new String(new String(ch,start,length));
if(null!=tag && tag.equals("name")){
person.setName(str);
}else if(null!=tag && tag.equals("age")){
Integer age = Integer.valueOf(str);
person.setAge(age);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//System.out.println("缁撴潫涓€涓厓绱? + qName);
if(qName.equals("person")){
this.persons.add(person);
}
tag = null;
}
@Override
public void endDocument() throws SAXException {
System.out.println("澶勭悊鏂囨。缁撴潫");
}
}
package com.test.xml;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
鎺у埗鍙拌緭鍑猴細
寮€濮嬩竴涓厓绱爌ersons
寮€濮嬩竴涓厓绱爌erson
寮€濮嬩竴涓厓绱爊ame
寮€濮嬩竴涓厓绱燼ge
寮€濮嬩竴涓厓绱爌erson
寮€濮嬩竴涓厓绱爊ame
寮€濮嬩竴涓厓绱燼ge
澶勭悊鏂囨。缁撴潫
鑷沖皧瀹?->>9000
鐧芥櫠鏅?->>7000
浜屻€丼02E206_01鎵嬪啓鏈嶅姟鍣╤ttpserver_xml閰嶇疆鏂囦歡_sax瑙f瀽搴旂敤
<html>
<head>
<title>绗竴涓〃鍗?lt;/title>
</head>
<body>
<form method="get" action="http://localhost:8888/g">
鐢ㄦ埛鍚嶏細<input type="text" name="uname" id="name">
瀵嗙爜锛?lt;input type="password" name="pwd" id="pass">
<input type="submit" value="鐧誨綍">
</form>
</body>
</html>
web.xml鏂囦歡
<?xml version="1.0" encoding="UTF-8" ?>
<web_app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.test.server2.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
<url-pattern>/log</url-pattern>
<url-pattern>/g</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>com.test.server2.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
</web_app>
婧愮爜锛?
package com.test.server2;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 鍒涘緩鏈嶅姟鍣紝骞跺惎鍔? * 1銆佽姹? * 2銆佸搷搴? */
public class Server {
private ServerSocket server;
private boolean isShutDown = false;
public static void main(String[] args) {
Server server = new Server();
server.start();
}
/**
* 鍚姩鏂規硶
*/
public void start(){
start();
}
/**
* 鎸囧畾绔彛鐨勫惎鍔ㄦ柟娉? */
public void start(int port){
try {
server = new ServerSocket(port);
this.receive();
} catch (IOException e) {
//e.printStackTrace();
stop();
}
}
/**
* 鎺ユ敹瀹㈡埛绔? */
private void receive(){
try {
//璇鋒眰鍙婂搷搴? while(!isShutDown){
new Thread(new Dispatcher(server.accept())).start();
}
} catch (IOException e) {
//e.printStackTrace();
stop();
}
}
/**
* 鍋滄鏈嶅姟鍣? */
public void stop(){
isShutDown = true;
try {
if(!(null==server)){
server.close();
}
} catch (IOException e) {
//e.printStackTrace();
}
}
}
package com.test.server2;
import java.io.IOException;
import java.net.Socket;
/**
* 涓€涓姹備笌鍝嶅簲锛屽氨涓€涓璞? */
public class Dispatcher implements Runnable{
private Socket client;
private Request req;
private Response rep;
private int code = ;
Dispatcher(Socket client){
this.client = client;
try {
req = new Request(client.getInputStream());
rep = new Response(client.getOutputStream());
} catch (IOException e) {
//e.printStackTrace();
code = ;
try {
rep.pushToClient(code);
} catch (IOException e1) {
//e1.printStackTrace();
}
return;
}
}
@Override
public void run() {
try {
Servlet serv = WebApp.getServlet(req.getUrl());
if(null==serv){
this.code = ;//鎵句笉鍒闆鐞? }else{
serv.service(req, rep);
}
rep.pushToClient(code);//鎺ㄩ€佸埌瀹㈡埛绔? } catch (Exception e) {
//e.printStackTrace();
this.code = ;
try {
rep.pushToClient(code);
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
client.close();
} catch (IOException e) {
//e.printStackTrace();
}
}
}
package com.test.server2;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
* 灏佽request
*/
public class Request {
//璇鋒眰鏂瑰紡
private String method;
//璇鋒眰璧勬簮
private String url;
//璇鋒眰鍙傛暟
private Map<String,List<String>> parameterMapValues;
//鍐呴儴
public static final String CRLF = "\r\n";
private InputStream is;
private String requestInfo;
public Request(){
method = "";
url = "";
parameterMapValues = new HashMap<String,List<String>>();
requestInfo = "";
}
public Request(InputStream is){
this();
this.is = is;
try {
byte[] data = new byte[];
int len = is.read(data);
requestInfo = new String(data,,len);
} catch (IOException e) {
return;
}
//鍒嗘瀽璇鋒眰淇℃伅
parseRequestInfo();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
/**
* 鍒嗘瀽璇鋒眰淇℃伅
*/
private void parseRequestInfo(){
if((null==requestInfo) || (requestInfo=requestInfo.trim()).equals("")){
return;
}
/**
* ====================================
* 浠庝俊鎭殑棣栬鍒嗚В鍑猴細璇鋒眰鏂瑰紡 璇鋒眰璺緞 璇鋒眰鍙傛暟锛坓et鍙兘瀛樺湪锛? * 濡傦細GET /index.html?uname=intputUname&pwd=inputPassword HTTP/1.1
*
* 濡傛灉涓簆ost鏂瑰紡锛岃姹傚弬鏁闆彲鑳藉湪鏈€鍚庢鏂囦腑
* ====================================
*/
String paramString = "";//鎺ユ敹璇鋒眰鍙傛暟
int positionCRLF = ;
positionCRLF = requestInfo.indexOf(CRLF);
if (positionCRLF == -){
return;
}
//1銆佽幏鍙栬姹傛柟寮? String firstLine = requestInfo.substring(,requestInfo.indexOf(CRLF));
int idx = requestInfo.indexOf("/");// /鐨勪綅缃? this.method = firstLine.substring(,idx).trim();
String urlStr = firstLine.substring(idx,firstLine.indexOf("HTTP/")).trim();
if(this.method.equalsIgnoreCase("post")){//post鏂瑰紡
this.url = urlStr;
paramString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
}else if(this.method.equalsIgnoreCase("get")){//get鏂瑰紡
if(urlStr.contains("?")){
String[] urlArray = urlStr.split("\\?");
this.url = urlArray[];
paramString = urlArray[];//鎺ユ敹璇鋒眰鍙傛暟
}else{
this.url = urlStr;
}
}
//2銆佸皢璇鋒眰鍙傛暟灏佽鍒癕ap涓? parseParams(paramString);
}
/**
* 灏嗚姹傚弬鏁闆皝瑁呭埌Map涓? * @param paramString
*/
private void parseParams(String paramString){
//鍒嗗壊锛屽皢瀛楃涓茶漿鎴愭暟缁? StringTokenizer token = new StringTokenizer(paramString,"&");
while(token.hasMoreTokens()){
String keyValue = token.nextToken();
String[] keyValues = keyValue.split("=");
if(keyValues.length == ){
keyValues = Arrays.copyOf(keyValues, );
keyValues[] = null;
}
String key = keyValues[].trim();
String value = null==keyValues[]?null:decode(keyValues[].trim(),"gbk");
//鍒嗘嫞锛岃漿鎹㈡垚Map
if(!parameterMapValues.containsKey(key)){
parameterMapValues.put(key, new ArrayList<String>());
}
List<String> values = parameterMapValues.get(key);
values.add(value);
}
}
/**
* 瑙e喅涓枃
* @param value
* @param code
* @return
*/
private String decode(String value,String code){
try {
return java.net.URLDecoder.decode(value, code);
} catch (UnsupportedEncodingException e) {
//e.printStackTrace();
}
return null;
}
/**
* 鏍規嵁椤甸潰鐨刵ame鑾峰彇瀵瑰簲鐨勫涓€? */
public String[] getParameterValues(String name){
List<String> values = null;
if( (values=parameterMapValues.get(name))==null ){
return null;
}else{
return values.toArray(new String[]);
}
}
/**
* 鏍規嵁椤甸潰鐨刵ame鑾峰彇瀵瑰簲鐨勫崟涓€? */
public String getParameterValue(String name){
String[] values = getParameterValues(name);
if(null==values){
return null;
}
return values[];
}
}
package com.test.server2;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;
/**
* 灏佽鍝嶅簲淇℃伅
*/
public class Response {
//涓や釜甯擱噺
public static final String CRLF = "\r\n";
public static final String BLANK = " ";
//娴? private BufferedWriter bw;
//姝f枃
private StringBuilder content;
//瀛樺偍澶翠俊鎭? private StringBuilder headInfo;
//瀛樺偍姝f枃闀垮害
private int len = ;
public Response(){
headInfo = new StringBuilder();
content = new StringBuilder();
len = ;
}
public Response(OutputStream os){
this();
bw = new BufferedWriter(new OutputStreamWriter(os));
}
public Response(Socket client){
this();
try {
bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
} catch (IOException e) {
headInfo = null;
}
}
/**
* 鏋勫緩姝f枃
*/
public Response print(String info){
content.append(info);
len += (info + CRLF).getBytes().length;
return this;
}
/**
* 鏋勫緩姝f枃+鍥炶濺
*/
public Response println(String info){
content.append(info).append(CRLF);
len += (info + CRLF).getBytes().length;
return this;
}
/**
* 鏋勫緩鍝嶅簲澶? */
private void createHeadInfo(int code){
//1)HTTP鍗忚鐗堟湰銆佺姸鎬佷唬鐮併€佹弿杩? headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
switch(code){
case :
headInfo.append("OK");
break;
case :
headInfo.append("NOT FOUND");
break;
case :
headInfo.append("Server Error");
break;
}
headInfo.append(CRLF);
//2)鍝嶅簲澶達紙Response Head锛? headInfo.append("Server:test Server/0.0.1").append(CRLF);
headInfo.append("Date:").append(new Date()).append(CRLF);
headInfo.append("Content-type:text/html;charset=GBK").append(CRLF);
//姝f枃闀垮害锛氬瓧鑺傞暱搴? headInfo.append("Content-Length:").append(len).append(CRLF);
headInfo.append(CRLF);
}
/**
* 鎺ㄩ€佸埌瀹㈡埛绔? * @throws IOException
*/
void pushToClient(int code) throws IOException{
if(null==headInfo){
code = ;
}
createHeadInfo(code);
//澶翠俊鎭?鍒嗗壊绗? bw.append(headInfo.toString());
//姝f枃
bw.append(content.toString());
bw.flush();
bw.close();
}
}
package com.test.server2;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class WebApp {
private static ServletContext contxt;
static{
try {
//鑾峰彇瑙f瀽宸ュ巶
SAXParserFactory factory = SAXParserFactory.newInstance();
//鑾峰彇瑙f瀽鍣? SAXParser sax = factory.newSAXParser();
//鎸囧畾xml + 澶勭悊鍣? WebHandler web = new WebHandler();
sax.parse(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/test/server2/web.xml")
,web);
//灏哃ist杞垚Map
contxt = new ServletContext();
Map<String,String> servlet = contxt.getServlet();
//servlet-name,servlet-class
for (Entity entity : web.getEntityList()) {
servlet.put(entity.getName(), entity.getClz());
}
//url-pattern,servlet-name
Map<String,String> mapping = contxt.getMapping();
for (Mapping mapp : web.getMappingList()) {
List<String> urls = mapp.getUrlPattern();
for (String url : urls) {
mapping.put(url, mapp.getName());
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (org.xml.sax.SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Servlet getServlet(String url) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
if(null==url || (url=url.trim()).equals("")){
return null;
}
//return contxt.getServlet().get(contxt.getMapping().get(url));
//鏍規嵁瀛楃涓詫紙瀹屾暣璺緞锛夊垱寤哄璞? String name = contxt.getServlet().get(contxt.getMapping().get(url));
return (Servlet)Class.forName(name).newInstance();//纭繚绌烘瀯閫犲瓨鍦? }
}
package com.test.server2;
/**
* 鎶借薄涓轟竴涓埗绫? */
public abstract class Servlet {
public void service(Request req,Response rep) throws Exception{
this.doGet(req,rep);
this.doPost(req,rep);
}
public abstract void doGet(Request req,Response rep) throws Exception;
public abstract void doPost(Request req,Response rep) throws Exception;
}
package com.test.server2;
import java.util.HashMap;
import java.util.Map;
/**
* 涓婁笅鏂? */
public class ServletContext {
//涓烘瘡涓€涓猻ervlet鍙栧埆鍚? // login-->com.test.server2.LoginServlet
private Map<String,String> servlet;
// url-->login
// /log-->login
// /login-->login
private Map<String,String> mapping;
public ServletContext() {
servlet = new HashMap<String,String>();
mapping = new HashMap<String,String>();
}
public Map<String, String> getServlet() {
return servlet;
}
public void setServlet(Map<String, String> servlet) {
this.servlet = servlet;
}
public Map<String, String> getMapping() {
return mapping;
}
public void setMapping(Map<String, String> mapping) {
this.mapping = mapping;
}
}
package com.test.server2;
public class LoginServlet extends Servlet{
@Override
public void doGet(Request req,Response rep) throws Exception {
String name = req.getParameterValue("uname");
String pwd = req.getParameterValue("pwd");
if(login(name, pwd)){
rep.println("鐧誨綍鎴愬姛");
}else{
rep.println("鐧誨綍澶辮觸");
}
}
public boolean login(String name,String pwd){
return name.equals("test") && pwd.equals("12346");
}
@Override
public void doPost(Request req,Response rep) throws Exception {
}
}
package com.test.server2;
public class RegisterServlet extends Servlet{
@Override
public void doGet(Request req, Response rep) throws Exception {
}
@Override
public void doPost(Request req, Response rep) throws Exception {
rep.println("<html><head><title>杩斿洖娉ㄥ唽</title>");
rep.println("</head><body>");
rep.println("浣犵殑鐢ㄦ埛鍚嶄負锛? + req.getParameterValue("uname"));
rep.println("</body></html>");
}
}