会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132384个问题

老师请问一下我的代码是跟着老师一步一步敲的为啥我登录结果是这样的,bjsxt当时换成xx登录成功了一次,在次登录的时候又不行了,请老师解答一下

package com.bjsxt.server;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.bjsxt.servlet.Servlet;
import com.bjsxt.util.IOCloseUtil;
/**
 * 服务器,用于启动和停止服务
 * @author Administrator
 *
 */
public class Server {
 private ServerSocket server;
 public static void main(String[] args) {
  Server server=new Server();//创建服务器对象
  server.start();
 }
 public void start(){
  this.start(8888);
 }
 public void start(int port){
  try {
   server=new ServerSocket(port);
   this.receive(); //调用接收请求信息的方法
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 private void receive() {
  try {
   //(1)监听
   Socket client=server.accept();
   
   //封装请求信息
   Request req=new Request(client.getInputStream());
   
   /**做出响应*/
   /*StringBuilder sb=new StringBuilder();
   sb.append("HTTP/1.1").append(" ").append(200).append(" ").append("OK").append("\r\n");
   sb.append("Content-Type:text/html;charset=utf-8").append("\r\n");
   //内容
   String str="<html><head><title>响应结果</title></head><body>成功</body></html>";
   sb.append("Content-Length:"+str.getBytes("utf-8").length).append("\r\n");
   sb.append("\r\n");
   sb.append(str);
   
   //通过输出流发送出去
   BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"utf-8"));
   bw.write(sb.toString());
   bw.flush();
   bw.close();*/
   Response rep=new Response(client.getOutputStream());
   Servlet servlet=WebApp.getServlet(req.getUrl());
   int code=200;
   if (servlet==null) {
    code=404;
   }
   //调用Servlet中的服务的方法
   try {
    servlet.service(req, rep);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   rep.pushToClient(code);
   IOCloseUtil.closeAll(client);
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 public void stop(){
  
 }
package com.bjsxt.servlet;
import com.bjsxt.server.Request;
import com.bjsxt.server.Response;
/**
 * 是所有请求的Servlet的父类
 * 
 * @author Administrator
 *
 */
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.bjsxt.servlet;
import com.bjsxt.server.Request;
import com.bjsxt.server.Response;
public class LoginServlet extends Servlet{
 @Override
 public void doGet(Request req, Response rep) throws Exception {
   //获取请求参数
  String name=req.getParameter("username");
  String pwd=req.getParameter("pwd");
  
  if(this.login(name, pwd)){
   //调用响应中的构建内容的方
   rep.println(name+"登录成功");
  }else{
   rep.println(name+"登录失败,对不起,账号或密码不正确");
  }
  
 }
 private boolean login(String name,String pwd){
  if ("xx".equals(name)&&"123".equals(pwd)) {
   return true;
  }
  return false;
 }
 @Override
 public void doPost(Request req, Response rep) throws Exception {
  // TODO Auto-generated method stub
  
 }
 
}
package com.bjsxt.server;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import com.bjsxt.util.IOCloseUtil;
/**
 * 响应
 * @author Administrator
 *
 */
public class Response {
 private StringBuilder headInfo;//响应头
 private StringBuilder content;//响应内容
 private int length;//响应内容的长度
 //流
 private BufferedWriter bw;
 
 //两个常量,换行和空格
 private static final String CRLF="\r\n";//换行
 private static final String BLANK=" ";//空格
 
 //构造方法
 public Response() {
  headInfo=new StringBuilder();
  content=new StringBuilder();
  
 }
 //带参构造方法
 public Response(OutputStream os){
  this();//调用本类的无参构造方法
  try {
   bw=new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
  } catch (UnsupportedEncodingException e) {
   headInfo=null;
  }
  
 }
 //构造正文部分
 public Response print(String info){
  content.append(info);
  try {
   length+=info.getBytes("utf-8").length;
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return this;
 }
 public Response println(String info){
  content.append(info).append(CRLF);
  try {
   length+=(info+CRLF).getBytes("utf-8").length;
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return this;
 }
 
 //构造响应头
 
 private void createHeadInfo(int code){
  headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
  switch (code) {
  case 200:
   headInfo.append("OK");
   break;
  case 500:
   headInfo.append("SERVER ERROR");
   break;
  default:
   headInfo.append("NOT FOUND");
   break;
  }
  headInfo.append(CRLF);
  headInfo.append("Content-Type:text/html;charset=utf-8").append(CRLF);
  headInfo.append("Content-Length:"+length).append(CRLF);
  headInfo.append(CRLF);
 }
 /**
  * 推送到客户机的浏览器
  * @param code
  */
 public void pushToClient(int code){
  if (headInfo==null) {
   code=500;
  }
  try {
   //调用本类中的构造响应头
   this.createHeadInfo(code);
   bw.write(headInfo.toString());
   bw.write(content.toString());
   bw.flush();
   this.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public void close(){
  IOCloseUtil.closeAll(bw);
 }
}

1576990078(1).jpg

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3256楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3258楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 3259楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3260楼

老师我这里为何会报异常,请老师帮忙看看谢谢,学到这,我有点迷糊了,有点听不懂了

package com.bjsxt.server;
import java.util.List;
import java.util.Map;
import org.dom4j.Element;
import com.bjsxt.servelet.Servlet;
/**
 * 编写WebApp类
 * @author ADMIN
 *(1)初始化程序运行的数据
 *(2)根据不同的url创建所请求的Servlet对象
 */
public class WebApp {//App的意思就是应用程序
 private static ServletContext contxt;
 //使用静态块初始化Servlet容器
 static{
  contxt=new ServletContext();
  //分别获取对应关系的Map集合
  Map<String,String>servlet=contxt.getServlet();
  Map<String,String>mapping=contxt.getMapping();
  //创建解析XML文件的对象
  webDom4j web=new webDom4j();
  web.parse(web.getDocument());//解析xml
  //获取解析XML之后的List集合
  List<Entity>entityList=web.getEntityList();
  List<Mapping>mappingList=web.getMappingList();
 
  //将List集合中的数据存储到Map集合中去
  for (Entity entity : entityList) {
   servlet.put(entity.getName(), entity.getClazz());
  }
  //System.out.println(servlet);
  for(Mapping map:mappingList){
   //遍历url-pattern的集合
   List<String>urlPattern=map.getUrlPattern();
   for(String s:urlPattern ){
    mapping.put(s, map.getName());
   }
  
  } 
  //System.out.println(mapping);
 }
 /**
  * 根据url创建不同的Servlet对象
  * @param url
  * @return
  */
 public static Servlet getServlet(String url){
  if(url==null||url.trim().equals("")){
   return null;
  }
  //调用无参构造方法创建Servlet对象
  
  try {
   //如果url正确
   //根据url的key获取Servlet -name的值/log=login, /reg=register
   String servletName=contxt.getMapping().get(url);
   //根据servletName得到对应的servlet-class
   String servletClass=contxt.getServlet().get(servletName);//得到的是一个完整的包名+类名的字符串
   //使用反射创建Servlet对象
   Class<?>clazz=Class.forName(servletClass);
   Servlet servlet = (Servlet) clazz.newInstance();
   return servlet;
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
 public static void main(String[] args) {
  System.out.println(getServlet("/log"));
 }
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3263楼

老师我的main方法没有问题怎么会报这种错误?

package com.bjsxt.server;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * 解析xml
 * @author ADMIN
 *
 */
public class webDom4j {
 private List<Entity> entityList;//用于存储N多Entity,而每一个Entity都是servlet-name与servlet-class
 private List<Mapping>mappingList;//用于存储N多Mapping,而每一个Mapping都是一个servlet-name与N多个url-pattern
 public List<Entity> getEntityList() {
  return entityList;
 }
 public void setEntityList(List<Entity> entityList) {
  this.entityList = entityList;
 }
 public List<Mapping> getMappingList() {
  return mappingList;
 }
 public void setMappingList(List<Mapping> mappingList) {
  this.mappingList = mappingList;
 }
 public webDom4j(List<Entity> entityList, List<Mapping> mappingList) {
  super();
  this.entityList = entityList;
  this.mappingList = mappingList;
 }
 public webDom4j() {
  entityList=new ArrayList<Entity>();//初始化集合
  mappingList=new ArrayList<Mapping>();
 
 }
 //获取Document对象的方法 
 private Document getDocument(){
   try {
    //(1)创建SAXReader对象
    SAXReader reader=new SAXReader(); 
    //(2)调用read方法
    return reader.read(new File("src/WEB_INFO/web.xml"));
   } catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;
  }
 public void parse(Document doc){
  //(1)获取根元素
  Element root=doc.getRootElement();//web-app
  //(2)获取servlet子元素
  for(Iterator<Element>ite=root.elementIterator("servlet");ite.hasNext();){
   Element subElement=ite.next();//得到每一个servlet
   //创建一个实体类
   Entity ent=new Entity();//用于存储servlet-name与servlet-class
    for(Iterator<Element>subIte=subElement.elementIterator();subIte.hasNext();){
      Element ele=subIte.next();//可能是servlet-name,也可能是servlet-class
      if("servlet-name".equals(ele.getName())){
       ent.setName(ele.getText());//给实体中类中的name赋值
      }else if("serblet-class".equals(ele.getName())){
       ent.setClazz(ele.getText());//给实体类中的clazz赋值
      }
    }
    //将Entity添加到集合中
    entityList.add(ent);
  }
  //测试
  for (Entity entity : entityList) {
   System.out.println(entity.getName()+"\t"+entity.getClazz());
  }
 }
 //用于测试
 public static void main(String[] args){
  webDom4j web=new webDom4j();
  web.parse(web.getDocument());
 } 
 
 
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3264楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 3265楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3266楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3267楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3268楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3269楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637