开发工具
STS,Mysql,PowerDesigner,Tomcat v9.0,navicat.
主要技术
采用JSP+Servlet+Javabean来实现,有负责前台展示的 JSP、负责流程逻辑控制的Servlet以及负责数据封装的
Javabean
项目描述
为公司制作一个内部管理系统,作为开发人员之一,主要负责登录过滤模块,消息管理模块,其中消息管理模块主要负
责公司内部人员的消息发送、接收、分页查看信息等功能。
思路:
Dao → service → servlet → jsp
功能
1.登录(过滤器)
2.发送消息,查看已发/已收消息(分页),删除消息(逻辑删除)
技术点总结:
1.登录过滤
验证mysql数据库中是否存在对应用户名及密码,若登陆成功则将用户信息存入session中,若登录失败则停留在登录页。
使用Filter(过滤器),拦截session(对所有servlet功能以及所有页面进行过滤)。
将ServletRequest转换为HttpServletRequest,获得session,若存在用户则放行,否则拦截。
Filter代码:
@WebFilter(urlPatterns= {"*.do","/files/*","/index.html","/index.jsp"})
public class LoginFilter implements Filter {
List<String> list=new ArrayList();//可放行的
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest req=(HttpServletRequest)request;
String path=req.getServletPath();
if(list.contains(path)) {
chain.doFilter(request, response);
}else {
HttpSession session=req.getSession();
Emp emp=(Emp)session.getAttribute("emp");
if(emp!=null) {
chain.doFilter(request, response);
}else {
HttpServletResponse res=(HttpServletResponse)response;
String context=req.getServletContext().getContextPath();
System.out.println(context);
res.sendRedirect(context+"/login.html");
}
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
list.add("/login.html");
list.add("/login.do");
}
}
2.收、发消息
创建vo对象,创建Dao接口,Mapper.xml映射,完成sql语句。(部分mapper需要高级映射)
service调用dao的方法完成各功能。
servlet:接收数据,调用service,转发请求。
3.消息的分页查看、删除功能
分页思路:
1.创建一个pageInfo类用来存储分页信息。
int currentPage=1; //当前页号
int recordCount=0; //总记录数
int pageSize=5; //每页记录数
String url=null; //请求的url
int pageCount=0;//总页数
//getter、setter此处省略
//计算总页数方法
public int getPageCount() {
if(this.recordCount%this.pageSize==0) {
return this.recordCount/this.pageSize;
}else {
return this.recordCount/this.pageSize+1;
}
}
//构造方法
public pageInfo(HttpServletRequest request) {
if(request.getParameter("currentPage")!=null) {
//设置当前页
this.currentPage=Integer.valueOf(request.getParameter("currentPage"));
}
//记录url
this.url=request.getRequestURL().toString();
//存入request
request.setAttribute("pageInfo", this);
}
1.总页数可以通过方法计算出来,构造方法需要参数request,根据request获得分页信息(根据不同登录用户获得分页信息)
2.分页查询需要两条sql语句
<select id="getReceiveMessageForPage" resultType="map">
<![CDATA[SELECT RECEIVEID,s.EMPID empid,createDate,openDate,messageTitle,s.SENDID sendid,empName FROM to_receivemessage r INNER JOIN to_sendmessage s
ON r.SENDID=s.SENDID INNER JOIN tb_emp e
ON s.EMPID=e.EMPID
WHERE r.EMPID=#{empId} AND r.MESSAGESTATE<>2 limit #{first},#{second}
]]>
</select>
<select id="getReceiveCount" resultType="Integer">
SELECT COUNT(*) from to_receivemessage where empId=#{empId}
</select>
一条查询记录结果,一条查询总记录数。
遇到的问题:
1.路径问题:
书写servlet与JSP路径两种方法:
方法一:servlet与JSP路径一致。
方法二:若不一致,JSP中所有资源应使用绝对路径。
例子:若servlet映射路径在根路径,JSP路径在“根路径/files/”下,若通过servlet访问JSP,则当前路径为根路径,JSP中资源会从根路径中查找 ,会有找不到资源的问题。
2.${}与#{}的区别?
参考本人另一篇总结:https://blog.csdn.net/Sunhongyu51/article/details/91422736