一、数据库相关
作为一个web的新人,在练习某某某培训班视频,或者其他书上的的项目,一般对于数据库都是直接导入别人的 .sql 文件,然后进行练习的。但是长期下来,真的坑啊!!!个人建议:如果你不熟sql,那能手写的还是手写比较好。
1、自己如何设计数据库?
网上多查看别人的东西:列出对应的数据库表所需要的东西(相关的一个表、不相关的一个表),这样可以了解很多关于别人的想法。
另外,在开发过程中,先写处理业务逻辑的sql语句,方便,总体也独立一些。
为什么用javabean接受jdbc返回的数据?
ORM 对象关系映射思想
2、如果表中的数据 和 bean对象中的属性名称不一样怎么办?
解决:SQL语句起别名(直接别名或者as关键字),使不一致的属性与bean中的属性相同。如果数据的类型不一样,修改bean中的type。
二、关于主页
1、博客文章的列表及部分内容
显示页面叫main.jsp,处理业务的HomeServlet
(其中的方法main(request,response)是查询出blogs、categorys、comments
get(request,response)作用得到某篇具体的文章)
逻辑问题
- main.jsp首先浏览时:你需要列出所有的博文(分页待定)和部分简短内容;
- 点击你主页文章的分类时,你需要查询出对应类型的博客文章,并显示;
- 如果是点击文章的标题时,那你需要查出具体的博文内容和这篇文章的评论
流程
1,2的区别是:在sql语句中,2比1多个条件(分类的编号)。
2,3的区别是2是得到某一类文章,3是得到某一篇具体的文章(根据method参数调用不同的方法)
首先访问主页,转到HomeServlet
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<% response.sendRedirect("/blog/HomeServlet"); %>
在HomeServlet中首先进行2,3的判断(查询的是:文章的列表、或某个具体的文章)
request.setCharacterEncoding("utf-8");
String method = request.getParameter("method");
if (method == null) {
main(request, response);
request.getRequestDispatcher("/main.jsp").forward(request, response);
} else if (method.equals("get")) {
main(request, response);
get(request, response);
request.getRequestDispatcher("/displayBlog.jsp").forward(request,response);
}
在main(request,response)中进行1,2的判断(注:cid为分类的id:判断是否有传入的分类id,有——按分类查询,没有——查询所有),另外查出所有的分类和评论,存到request域中。
String cid=request.getParameter("cid");
String sql="";
if(cid==null){
sql = "...";
}else{
sql = "....";
}
2、右侧的分类、最近文章、最近评论之类的(复用)
都在HomeServlet的main方法中存到域中
页面获取即可。
注意:此处和主界面(不可能显示所有博文,只显示其中一部分) 用到字符传截取
举例:jsp页面顶部引入:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
如果标题太长的话 EL获取,JSTL截取 ${fn:substring(blog.title, 0, 12)}
三、细节问题
1、修改博文(注意:原博文分类的默认选中显示)
修改分为两个部分:1、查询出原来的。2、提交修改之后的
问题描述:表category和blog(含外键category_id,但是并没有分类的name)
blog实体中
private int id;
private String title;
private String content;
private String createdTime;
private String category;
private int categoryId;
分类实体中
private int id;
private String name;
.....
在博文管理页面传入当前blog的id,访问
href="${pageContext.request.contextPath }/PreEditBlogServlet?id=${blog.id}"
在 PreEditBlogServlet中,查询出当前博文和所有分类的信息,存到域中
// 查询博文
try {
sql = "select id,title,content,category_id as categoryId from blog where id="+ id;
blog = qr.query(sql, new BeanHandler<Blog>(Blog.class));
} catch (Exception e) {
e.printStackTrace();
}
//查询分类
try {
sql = "SELECT * FROM category ORDER BY LEVEL DESC,id DESC";
list = qr.query(sql, new BeanListHandler<Category>(Category.class)); //
} catch (SQLException e) {
e.printStackTrace();
}
前台获取数据时,使文章的分类默认选中
<td>类别:</td>
<td><select name="category" id="select">
<c:forEach items="${list}" var="listlist">
<c:if test="${blog.categoryId==listlist.id}">
<option value="${listlist.id }" selected>${listlist.name }</option>
</c:if>
<c:if test="${!(blog.categoryId==listlist.id)}">
<option value="${listlist.id }" >${listlist.name }</option>
</c:if>
</c:forEach>
</select></td>
然后提交博客即可。
2、权限问题(一般人浏览,博主增删改查)
这里使用到了session,根据session域中是否有User数据来判断,用户是否具有权限,如果没有那就跳转到登录界面(小提示:可以做成一个jsp页面,在需要权限的地方,顶部引入这个页面即可)
HttpSession session=request.getSession();
User user=(User) session.getAttribute("user");
if(user==null){
response.sendRedirect("/blog/admin/login.jsp");
}
3、问题分析(前台接收不到后台数据)
排查方式
排查错误,是不是这个bean对象的所有数据都接受不到?还是部分数据接收不到
在bean中 toString() 然后在相应的Servlet中输出,查看具体的属性值
如果是部分数据接收不到 查看sql语句 看具体起的什么别名(别名和bean属性相对应)
另外bean属性的类型 和 数据库表中字段的类型 要一致