看我这篇文章的思路和代码里面怎么写的思路 第一步看目录结构 我这里没有使用jsp作为返回给浏览器。这篇文章的核心是servlet数据接收和编写思路 第二步看目录 代码量有一点,我解释一下目录,需要全部项目文件留邮箱就可以 utils连接数据库的工具包 eneity 实体类与数据库对应 dao 操作数据库的类 service 业务功能 controller 对index.html中的请求进行分发处理 由于我没有写jsp作为返回给浏览器使用 view 做为返回(实际上就是servlet里面使用了response.getWriter()这个方法向浏览器传输数据)
web就是网页的一些img和css,index是div+css写的= =就是我的web栏中的那个网页,现在加了一个登陆验证。
第三步看代码和注释 这次代码和注释= =很仔细的写了思路,以及请求头和请求体和get和post方法和httpServlet的关系我贴一部分在文章里面。 index.html
在这里插入代码片 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <!--第一步浏览器的默认访问页面,可视化的页面是需要1.填信息或者2.点击鼠标按钮的3.展示数据图片的--> <form method="post" action="login.do"> <!--跳转到某个servlet--> <!--1.思考展示的页面对于浏览器来说就是一个数据输入框,一但往里面输入了数据就是一组组键值对 2.浏览器本身是携带请求头,请求体 3.一但浏览器点击提交submit数据,实际上就是将请求头加请求体发送到指定网页(根据不同的发送方式将数据拼到请求头或者请求体的位置) 4.在login.do页面接收到整条数据包含请求头请求体--> <input type="text" name="username" placeholder="用户名"/><br/> <input type="text" name="password" placeholder="密码"/><br/> <input type="submit" value="提交"/> </form> </body> </html>controller login.do
在这里插入代码片 package com.qf.day10.controller; import com.qf.day10.entity.Book; import com.qf.day10.entity.User; import com.qf.day10.service.BookService; import com.qf.day10.service.UserService; import com.qf.day10.service.impl.BookServiceImpl; import com.qf.day10.service.impl.UserServiceImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @WebServlet("/login.do") public class LoginController extends HttpServlet { /*第二步 实现页面功能的逻辑*/ private UserService userService = new UserServiceImpl(); private BookService bookService = new BookServiceImpl(); /*2 * 1.对于从浏览器中传入的整条数据,servlet提供了两个方法进行解析 根据解析方法的不同用户输入的数据在请求头和请求体的位置就不同 * 2.对数据进行解析,数据本身是(浏览器的字符集编码)包含格式的,设置服务器的解析格式 *3.对整条数据进行解析后,会将数据(这些数据包含用户输入到页面的表单数据,也包含一些隐藏的数据,如cookie和session)放入request集合 *4.以下就是对request集合对象中的数据进行操作,同时httpServlet也提供了response集合可以存一些数据也有一些方法帮我们实现servlet重定向,request对象实现转发 * 5.对于最后的展示sevlet或者jsp实际上就是通过向浏览器发送数据,并且浏览器(按照一定规则/字符集等)解析这些数据展示出来 * */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); //1登录的逻辑 //根据网页传来的数据从数据库查询数据,使用userService封装到user对象中 User user = userService.login(username, password); if (user != null){ // 1.1 如果查询到对应的对象就说明登陆成功 // 登录成功 List<Book> list = bookService.findAll(); // 查询所有的书籍信息 //1.1.1 登陆成功后,再使用bookService在数据库中查询book数据,并且将数据存到request对象(是一个集合)中 request.setAttribute("list", list); // 将list存储到request对象 //1.1.2 将request和response对象(数据)转发到home.html(这里实际上是一个servlert)中并且跳转 request.getRequestDispatcher("home.html").forward(request, response); }else{ //1.2 登录失败 response.sendRedirect("fail.html"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }显然正确页面和错误页面就是view中的servlet 贴一个正确的
package com.qf.day10.view; import com.qf.day10.entity.Book; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @WebServlet("/home.html") public class HomeJSP extends HttpServlet { /*第三步 在servlet中将所有获得的request对象和response对象的数据 展示出来*/ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //这里是直接向浏览器的页面写text/html;charset=utf-8 PrintWriter out = response.getWriter(); out.write("\r\n"); out.write("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <meta charset=\"utf-8\" />\r\n"); out.write(" <title>Title</title>\r\n"); out.write(" <base href=\""); out.print(request.getContextPath()); out.write("/\"/>\r\n"); out.write(" <link rel=\"stylesheet\" href=\"css/common.css\" />\r\n"); out.write("<body>\r\n"); out.write("<div id=\"contentDiv\">\r\n"); out.write(" <div id=\"headerDiv\">\r\n"); out.write(" <div id=\"firstDiv\">\r\n"); out.write(" <div id=\"loginDiv\">\r\n"); out.write(" <ul>\r\n"); out.write(" <li>亲,请登录</li>\r\n"); out.write(" <li>免费注册</li>\r\n"); out.write(" <li>手机逛淘宝</li>\r\n"); out.write(" </ul>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"homeLinkDiv\">\r\n"); out.write(" <ul>\r\n"); out.write(" <li>淘宝网首页</li>\r\n"); out.write(" <li>我的淘宝</li>\r\n"); out.write(" <li>购物车</li>\r\n"); out.write(" <li>收藏夹</li>\r\n"); out.write(" <li>商品分类</li>\r\n"); out.write(" <li>卖家中心</li>\r\n"); out.write(" <li>联系客服</li>\r\n"); out.write(" <li>网站导航</li>\r\n"); out.write(" </ul>\r\n"); out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"secondDiv\">\r\n"); out.write(" <div id=\"logoDiv\">\r\n"); out.write(" <img src=\"img/taobao-logo.png\"/>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"searchDiv\">\r\n"); out.write(" <div id=\"searchContentDiv\">\r\n"); out.write(" <input type=\"text\" id=\"searchTxt\" name=\"keywords\"/>\r\n"); out.write(" <input type=\"button\" value=\"搜索\"/>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"classifyDiv\">\r\n"); out.write(" <ul>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" </ul>\r\n"); out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"thirdDiv\">\r\n"); out.write(" <ul>\r\n"); out.write(" <li>你是不是想找:</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" <li>客厅灯</li>\r\n"); out.write(" <li>冲锋衣</li>\r\n"); out.write(" <li>沙发</li>\r\n"); out.write(" </ul>\r\n"); out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"mainDiv\">\r\n"); out.write(" <div id=\"mainFirstDiv\">\r\n"); out.write(" <div id=\"priceDiv\">\r\n"); out.write(" 价格:<input type=\"text\" />——<input type=\"text\" />\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"optionDiv\">\r\n"); out.write(" <ul>\r\n"); out.write(" <li><input type=\"checkbox\" /></li>\r\n"); out.write(" <li>包邮</li>\r\n"); out.write(" <li><input type=\"checkbox\" /></li>\r\n"); out.write(" <li>正品保障</li>\r\n"); out.write(" <li><input type=\"checkbox\" /></li>\r\n"); out.write(" <li>7天退换</li>\r\n"); out.write(" <li><input type=\"checkbox\" /></li>\r\n"); out.write(" <li>消费者保障</li>\r\n"); out.write(" </ul>\r\n"); out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"mainSecondDiv\">\r\n"); // 在request对象中获取存储的书籍集合数据 List<Book> list = (List<Book>) request.getAttribute("list"); // 循环显示 for (Book books : list) { out.write(" <div class=\"bookDiv\">\r\n"); out.write(" <div>\r\n"); out.write(" <img src=\"img/"+books.getPic()+"\" />\r\n"); out.write(" </div>\r\n"); out.write(" <div>¥"+books.getPrice()+".0包邮</div>\r\n"); out.write(" <div>"+books.getName()+"</div>\r\n"); out.write(" <div>"+books.getShop()+"</div>\r\n"); out.write(" <div>"+books.getDetail()+"</div>\r\n"); out.write(" </div>\r\n"); } out.write(" </div>\r\n"); out.write(" </div>\r\n"); out.write(" <div id=\"footerDiv\"></div>\r\n"); out.write("</div>\r\n"); out.write("</body>\r\n"); out.write("</html>"); } }到这一步就把服务端想要的逻辑写完了,下面是具体的dao层和service层 实际上到后面复杂的功能dao层和service层是要分开考虑的设计的,但是核心编程思路还是和我列的一样。 Users
package com.qf.day10.entity; public class User { private int id; private String username; private String pwd; private String truename; public User() { } public User(int id, String username, String pwd, String truename) { this.id = id; this.username = username; this.pwd = pwd; this.truename = truename; } 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 getTruename() { return truename; } public void setTruename(String truename) { this.truename = truename; } }dao userdao 接口
package com.qf.day10.dao; import com.qf.day10.entity.User; import java.sql.SQLException; import java.util.List; //第二步写数据库操作层,第三步写service层 public interface UsersDAO { //1 写抽象方法 //1.1 抽象方法要做些什么?要返回些什么?需要传入什么参数? 从这三个方面设计抽象方法 //转到impl实现类具体实现 User findUser(String username,String password) throws SQLException; }接口的实现
package com.qf.day10.dao.impl; import com.qf.day10.dao.UsersDAO; import com.qf.day10.entity.User; import com.qf.day10.utils.MyDBUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import java.sql.SQLException; import java.util.GregorianCalendar; import java.util.List; //对接口中的方法进行具体实现 //1.1 抽象方法要做些什么?要返回些什么?需要传入什么参数? 从这三个方面设计抽象方法 //UsersDAOImpl需要从数据库查询用户信息,返回用户对象,传入String username, String password public class UsersDAOImpl implements UsersDAO { @Override public User findUser(String username, String password) throws SQLException { QueryRunner queryRunner = new QueryRunner(); return queryRunner.query(MyDBUtils.getConnection(), "SELECT * FROM users WHERE username = ? AND pwd = ?", new BeanHandler<>(User.class),username,password); } }service的功能很简单就和dao一样,实际上不太可能很简单所以我就没有写思路了。
package com.qf.day10.service; import com.qf.day10.entity.User; public interface UserService { User login(String username, String password); } package com.qf.day10.service.impl; import com.qf.day10.dao.UsersDAO; import com.qf.day10.dao.impl.UsersDAOImpl; import com.qf.day10.entity.User; import com.qf.day10.service.UserService; import com.qf.day10.utils.MyDBUtils; import java.sql.SQLException; public class UserServiceImpl implements UserService { UsersDAO usersDAO = new UsersDAOImpl(); @Override public User login(String username, String password) { try { return usersDAO.findUser(username, password); } catch (SQLException e) { e.printStackTrace(); }finally { try { MyDBUtils.close(); } catch (SQLException e) { e.printStackTrace(); } } return null; 页面和css没办法贴= =要的话直接找我不要的话随便写一个就行。 } }