package myserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
public MyServer() {
try {
ServerSocket socket = new ServerSocket(8089);
while (true) {
Socket s = socket.accept();
new SocketThread(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MyServer();
}
}

package myserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import service.AddService;
import service.FindAllService;
import service.LoginService;

public class SocketThread implements Runnable{
private Socket socket;

public SocketThread(Socket socket) {
this.socket = socket;

Thread th = new Thread(this);
th.start();
}

@Override
public void run() {
InputStream in = null;
OutputStream out = null;
try {
in = socket.getInputStream();//获取文件读取流
out = socket.getOutputStream();//获取文件写入流
Response response = new Response(out);//相应数据到浏览器
Request request = new Request(in);//从网页获取数据
System.out.println("********"+request);
String url = request.getUrl();//获取URL路径
//response.sendMessage("hello");
if ("login".equals(url)) {
LoginService login = new LoginService();
try {
login.service(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}else if("findAll".equals(url)){
FindAllService all = new FindAllService();
try {
all.service(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}else if("add".equals(url)){
AddService add = new AddService();
try {
add.service(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}else{
response.sendFile(url);
}

out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

package myserver;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class Request {
private String url;
//封装表单数据
private Map<String,String> paramMap = new HashMap<String,String>();

public Request(InputStream in) {
byte[] by = new byte[1024];
try {
in.read(by);
String str = new String(by).trim();//去掉两边空格
System.out.println(str);

if (str.startsWith("GET")){//GET开头的流数据
this.getGet(str);
}else{//POST开头的流数据
this.getPOST(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}

private void getPOST(String str) {//获取POST的URL和表单数据
String[] s = str.split("\\s+");//按空格割分字符串为字符串数组
this.url = s[1].substring(1);//表单的POST提交
getMap(s[s.length-1]);//获取表单数据
}

private void getGet(String str) {//获取GET的URL和表单数据
String[] s = str.split("\\s+");//按空格割分字符串为字符串数组
if (s[1].indexOf("?") == -1){
this.url = s[1].substring(1);//文本的GET提交
}else{
String s1 = s[1];
//表单的GET提交
this.url = s1.split("[?]")[0].substring(1);
this.getMap(s1.split("[?]")[1]);//获取表单数据
}
}
//GET /url POST|GET /url?userName=""&pwd=""&age=""&sex=""
private Map<String,String> getMap(String string) {//获取表单数据
String[] s = string.split("[&]");
for (String str : s) {
this.paramMap.put(str.split("[=]")[0], str.split("[=]")[1]);
}
return this.paramMap;
}

public String getUrl() {
return this.url;
}

public String getParameter(String key){
return this.paramMap.get(key);
}

@Override
public String toString() {
return "Request [url=" + url + ", paramMap=" + paramMap + "]";
}
}

package myserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Response {
private OutputStream out;

public Response(OutputStream out) {
this.out = out;
}

//发送消息到浏览器
public void sendMessage(String msg) {
try {
out.write(msg.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void sendFile(String filePath) throws IOException {
File f = new File(filePath);
if (f.exists() == false) {//判断文件是否存在
System.out.println("文件不存在,请自行建立");
return;
}
InputStream in = null;
try {
in = new FileInputStream(filePath);
byte[] by = new byte[1024];
int len = 0;
while ((len=in.read(by)) != -1) {
out.write(by, 0, len);//读取1024字节并写入到浏览器
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
in.close();
}
}
}

package bean;

public class UserBean {
/**编号*/
private int id;
/**用户名*/
private String userName;
/**密码*/
private String pwd;
/**等级*/
private String grade;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}

public UserBean() {}

public UserBean(String userName, String pwd, String grade) {
this.userName = userName;
this.pwd = pwd;
this.grade = grade;
}

@Override
public String toString() {
return "UserBean [id=" + id + ", userName=" + userName + ", pwd=" + pwd
+ ", grade=" + grade + "]";
}
}

package dao;

import java.util.List;

import bean.UserBean;

public interface IUserDao {
/**
* 登录接口
* @param name 登录用户名
* @param pwd 登录密码
* @return 拥有用户名和密码的用户对象,没有返回null
* @throws Exception
*/
public UserBean login(String name,String pwd) throws Exception;
/**
* 添加用户
* @param bean 用户对象
* @throws Exception
*/
public void add(UserBean bean) throws Exception;
/**
* 删除用户
* @param id 用户ID
* @throws Exception
*/
public void del(int id) throws Exception;
/**
* 按ID修改密码
* @param id
* @param pwd 新密码
* @throws Exception
*/
public void update(int id, String pwd) throws Exception;
/**
* 根据ID查询
* @param id 用户ID
* @return 用户对象
* @throws Exception
*/
public UserBean findById(int id) throws Exception;
/**
* 查询所有用户
* @return 用户集合
* @throws Exception
*/
public List<UserBean> findAll() throws Exception;
}

package dao.impl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 父类DAO持久层
* @author Administrator
*
*/
public class BaseDao {
/**连接对象*/
protected Connection con;
/**预编译SQL语句对象*/
protected PreparedStatement ps;
/**结果集对象*/
protected ResultSet rs;

public void setConnection(){
try {
Class.forName("org.gjt.mm.mysql.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8","root","199212");
} catch (Exception e) {
e.printStackTrace();
}
}

public void closeConnection(){
try {
if (rs != null){
rs.close();
}
if (ps != null){
ps.close();
}
if (con != null){
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

// public static void main(String[] args) {
// BaseDao dao = new BaseDao();
// dao.setConnextion();
// System.out.println(dao.con);
// }
}

package dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import bean.UserBean;
import dao.IUserDao;

public class UserDaoImpl extends BaseDao implements IUserDao {
public static void main(String[] args) {
UserDaoImpl dao = new UserDaoImpl();
try {
//dao.add(new UserBean("123","123","employee"));
// Scanner sc = new Scanner(System.in);
// int id = sc.nextInt();
// UserBean bean = dao.findById(id);
// System.out.println(bean);
// if (bean.getId() == 0){
// System.out.println("第"+id+"个记录不存在");
// }else{
// //dao.update(id, "666666");
// dao.del(id);
// }
//System.out.println(dao.findAll());
List<UserBean> list = dao.findAll();
for (UserBean bean : list){
System.out.println(bean);
}
UserBean bean = dao.login("123", "1231");
if (bean == null){
System.out.println("该用户不存在");
}else{
System.out.println(bean);
}
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public UserBean login(String name, String pwd) throws Exception {
this.setConnection();
ps = con.prepareStatement("select * from t_user where userName=? and pwd=?");
ps.setString(1, name);
ps.setString(2, pwd);
rs = ps.executeQuery();
UserBean bean = null;
if (rs.next()){
bean = new UserBean();
bean.setGrade(rs.getString("grade"));
bean.setId(rs.getInt("id"));
bean.setPwd(rs.getString("pwd"));
bean.setUserName(rs.getString("userName"));
}
this.closeConnection();
return bean;
}

@Override
public void add(UserBean bean) throws Exception {
this.setConnection();
ps = con.prepareStatement("insert into t_user(userName,pwd,grade) values(?,?,?)");
ps.setString(1, bean.getUserName());
ps.setString(2, bean.getPwd());
ps.setString(3, bean.getGrade());
ps.executeUpdate();//必须跟新不然添加不进去
this.closeConnection();
}

@Override
public void del(int id) throws Exception {
this.setConnection();
ps = con.prepareStatement("delete from t_user where id = ?");
ps.setInt(1, id);
ps.executeUpdate();//必须跟新不然删除不掉
this.closeConnection();
}

@Override
public void update(int id, String pwd) throws Exception {
this.setConnection();
ps = con.prepareStatement("update t_user set pwd=? where id = ?");
ps.setString(1, pwd);
ps.setInt(2, id);
ps.executeUpdate();
this.closeConnection();
}

@Override
public UserBean findById(int id) throws Exception {
this.setConnection();
ps = con.prepareStatement("select * from t_user where id = ?");
ps.setInt(1, id);
rs = ps.executeQuery();
UserBean bean = new UserBean();
if (rs.next()){
bean.setId(rs.getInt("id"));
bean.setGrade(rs.getString("grade"));
bean.setPwd(rs.getString("pwd"));
bean.setUserName(rs.getString("userName"));
}
this.closeConnection();
return bean;
}

@Override
public List<UserBean> findAll() throws Exception {
this.setConnection();
ps = con.prepareStatement("select * from t_user");
rs = ps.executeQuery();
List<UserBean> list = new ArrayList<UserBean>();
while (rs.next()){
UserBean bean = new UserBean();
bean.setId(rs.getInt("id"));
bean.setGrade(rs.getString("grade"));
bean.setPwd(rs.getString("pwd"));
bean.setUserName(rs.getString("userName"));
list.add(bean);
}
this.closeConnection();
return list;
}
}

package service;

import bean.UserBean;
import dao.IUserDao;
import dao.impl.UserDaoImpl;
import myserver.Request;
import myserver.Response;

/**
* 处理登录业务
* @author Administrator
*
*/
public class LoginService {
private IUserDao dao = new UserDaoImpl();
//servlet底层实现
public void service(Request request, Response response) throws Exception{
String nameTxt = request.getParameter("userName");
String pwdTxt = request.getParameter("pwd");
UserBean bean = dao.login(nameTxt, pwdTxt);
if (bean!=null){
response.sendMessage("<html><meta charset='utf-8'><span style='color:blue'>登录成功</span></html>");
}else{
response.sendMessage("<html><meta charset='utf-8'><span style='color:red'>登录失败</span></html>");
}
}
}

package service;

import java.util.List;

import bean.UserBean;
import dao.IUserDao;
import dao.impl.UserDaoImpl;
import myserver.Request;
import myserver.Response;

public class FindAllService {
/**用户持久对象*/
private IUserDao dao = new UserDaoImpl();

public void service(Request request, Response response) throws Exception{
List<UserBean> list = dao.findAll();

response.sendMessage("<html><meta charset='utf-8'><table border='1' cellspacing='0' width='60%'>");
response.sendMessage("<thead><tr><th>用户名</th><th>等级</th></tr></thead><tbody>");
for (UserBean bean : list){
response.sendMessage("<tr><td>"+bean.getUserName()+"</td><td>"+bean.getGrade()+"</td></tr>");
}

response.sendMessage("</tbody></table></html>");
}
}

package service;

import bean.UserBean;
import dao.IUserDao;
import dao.impl.UserDaoImpl;
import myserver.Request;
import myserver.Response;

public class AddService {
private IUserDao dao = new UserDaoImpl();

public void service(Request request, Response response) throws Exception{
String userName = request.getParameter("userName");
String pwd = request.getParameter("pwd");
String grade = request.getParameter("grade");

UserBean bean = new UserBean(userName,pwd,grade);
dao.add(bean);
//调用查询所有业务方法,重新显示所有用户
FindAllService findAll = new FindAllService();
findAll.service(request, response);
}
}

Tomcat底层实现的更多相关文章

  1. tomcat底层原理实现

    1.首先完成一个server类,用来接收客户端的请求:代码都在一个while(true)循环中,模拟tomcat一直在启动,其中绑定一个端口,用来监听一个端口,然后创建一个输入流,获取请求的输入流,然 ...

  2. Servlet和Tomcat底层源码分析

    Servlet 源码分析   Servlet 结构图 Servlet 和 ServletConfig 都是顶层接口,而 GenericServlet 实现了这两个顶层接口,然后HttpServlet ...

  3. 【Spring boot】整合tomcat底层原理

    本文结论 源码基于spring boot2.6.6 项目的pom.xml中存在spring-boot-starter-web的时候,在项目启动时候就会自动启动一个Tomcat. 自动配置类Servle ...

  4. Tomcat底层通过全类名创建对象的实现

    示例: //com.neuedu.baier.entity.User为User类的全类名 //要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 Class<?> user ...

  5. tomcat相关配置技巧梳理

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

  6. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

  7. Tomcat server.xml中Connector配置参数详解

    Tomcat中Connector常用配置 Tomcat中server.xml有些配置信息是需要我们了解的,最起码知道如何进行简单的调试. <Connector port="8080&q ...

  8. Spring Boot2.0之 原理—创建内置Tomcat容器

    前面所述的https://www.cnblogs.com/toov5/p/9823728.html 中的第一条先不赘述了,就是玩了maven 重点介绍后两条 首先内置Tomcat: SpringBoo ...

  9. tomcat 代码集

    Tomcat类是整个tomcat的起点,负责加载所有的配置信息以及把配置信息解析转换成tomcat组件对象. Context addWebapp(String contextPath, String ...

随机推荐

  1. mysqldump导出多个数据库

    mysqldump -uroot -p111111 -q -e -R -x --databases account game_s1 game_s2 ...... > D:\backup.sql ...

  2. .net 控件开发常见的特性总结

    http://blog.csdn.net/aofengdaxia/article/details/5924364 在.net开发中常常需要使用一些[]里面的特性描述,我发现对常用的几个知道大概的意思, ...

  3. ECharts.js 简单示例

    ECharts.js学习(一) 简单入门 EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Vi ...

  4. caffe 用faster rcnn 训练自己的数据 遇到的问题

    1 . 怎么处理那些pyx和.c .h文件 在lib下有一些文件为.pyx文件,遇到不能import可以cython 那个文件,然后把lib文件夹重新make一下. 遇到.c 和 .h一样的操作. 2 ...

  5. day20 GUI(Graphics User Interface)

    顶层容器:JWindow.JFrame.JDialge.JAsplet JFrame,默认布局是边界布局 JFrame的内容面板是:Container. 面板容器:JPanel,默认布局是流布局. 布 ...

  6. 如何在Windows系统下隐藏文件

    隐藏后只有键入文件夹名称才可访问,如果忘记路径就找不到了 attrib +s +a +h +r e:\bak\tools 取消的方法: attrib -a -s -h -r e:\bak\tools

  7. NGINX配置PHP解析

    <?php phpinfo(); ?> location ~ \.php$ { root html; fastcgi_pass ; fastcgi_index index.php; fas ...

  8. PHP7 学习笔记(一)Ubuntu 16.04 编译安装Nginx-1.10.3、 PHP7.0.9、Redis3.0 扩展、Phalcon3.1 扩展、Swoole1.9.8 扩展、ssh2扩展(全程编译安装)

    ==================== PHP 7.0 编译安装================== wget http://cn2.php.net/get/php-7.0.9.tar.bz2/fr ...

  9. 【简记】前端对接WebSocket与心跳重连

    前言 最近又在忙着开发别的模块,其中包含了即时通讯这一块,上一次做即时通讯时还是去年年底,一时间代码都在自己的笔记本里,还没带--这里就记录一下前端对接WebSocket的实现,包含心跳重连,简记之. ...

  10. 悲催的IE6 七宗罪大吐槽(带解决方法)第一部分

    一.奇数宽高 悲剧的IE6啊,为何有如此多bug,但用户市场又那么大,真让我们搞网站的纠结.今天就遇到了一个非常奇怪但又很细节的一个bug,一个外部的相对定位div,内部一个绝对定位的div(righ ...