(接上)
显示页面
frameset.jsp
实现页面分栏:
<frameset rows="20%, *, 8%">
<frame src="top.jsp" name="top">
<frame src="main.jsp" name="main">
<frame src="tip.jsp" name="tip">
</frameset>
注:去掉<body></body>标签
top.jsp
顶部页面:
<head>
<!-- 点击该页面的链接从“main”中打开 -->
<base target="main" />
</head>
<body style="text-align:center;">
<h1>客户关系管理系统</h1>
<a href="add.jsp">添加客户</a> |
<a href="CustomerServlet?method=a">查询客户</a> |
<a href="#">高级搜索</a>
</body>
main.jsp
中间部分:
<h2>欢迎来到我的主页!</h2>
tip.jsp
底部:
<p>版权所有:lakuite</p>
显示效果:
add.jsp
添加客户信息的表单页面。
<body style="text-align:center;">
<h3>添加客户信息</h3>
<form action="CustomerServlet" method="post">
<!-- 隐藏,传method过去以测试执行方法 -->
<input type="hidden" name="method" value="add" />
<p> id:
<input type="text" name="id" /></p>
<p> name:
<input type="text" name="name" /></p>
<p>sex:
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女
</p>
<p> age:
<input type="text" name="age" /></p>
<p>phone:
<input type="text" name="phone" /></p>
<button type="submit">提交</button>
<button type="reset">重置</button>
</form>
</body>
show.jsp
显示客户列表。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<body style="text-align:center;">
<h3>客户信息表</h3>
<table border="1" cellspacing="0" cellpadding="7" style="margin:auto;">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>电话</th>
<th></th>
<th></th>
</tr>
<c:forEach var="v" items="${list }">
<tr>
<td>${v.id }</td>
<td>${v.name }</td>
<td>${v.sex }</td>
<td>${v.age }</td>
<td>${v.phone }</td>
<td><a href="CustomerServlet?method=del&cid=${v.id }">删除</a></td>
<td><a href="CustomerServlet?method=findid&cid=${v.id }">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
注:(1)这里用到了jstl和el表达式,需执行taglib指令。
(2)有时候html内的表格即使在外部设置了居中也依然不会显示居中,此时需加上 style="margin:auto;" 代码。
update.jsp
客户信息的修改页面。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<body style="text-align:center;">
<h3>修改客户信息</h3>
<form action="CustomerServlet" method="post">
<input type="hidden" name="method" value="update" />
<p> id:
<input type="text" name="id" value="${p1.id }" /></p>
<p> name:
<input type="text" name="name" value="${p1.name }" /></p>
<p>sex:
<input type="radio" name="sex" value="男" <c:if test="${p1.sex=='男' }">checked</c:if> />男
<input type="radio" name="sex" value="女" <c:if test="${p1.sex=='女' }">checked</c:if> />女
</p>
<p> age:
<input type="text" name="age" value="${p1.age }" /></p>
<p>phone:
<input type="text" name="phone" value="${p1.phone }" /></p>
<button type="submit">修改</button>
<button type="reset">重置</button>
</form>
</body>
注:(1)性别为单选框,默认选择用 checked 表示,使用jstl的if判断来显示。
(2)与客户信息添加页面一样,不同的是输入框内需要传参。
super.jsp
高级搜索页面。
<body style="text-align:center;">
<h3>查询客户信息</h3>
<form action="CustomerServlet" method="post">
<input type="hidden" name="method" value="superfind" />
<p> name:
<input type="text" name="name" /></p>
<p>sex:
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女
</p>
<p>phone:
<input type="text" name="phone" /></p>
<button type="submit">查询</button>
<button type="reset">重置</button>
</form>
</body>
servlet
实现处理功能。
新建包“com.xmx.oa.controller”,在包下建servlet,命名为“CustomerServlet.java”:
源代码:
package com.xmx.oa.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xmx.oa.model.entity.Person;
import com.xmx.oa.model.service.IPersonService;
import com.xmx.oa.model.service.impl.PersonServiceImpl;
public class CustomerServlet extends HttpServlet {
IPersonService service = new PersonServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("1");
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// System.out.println("2");
String method = request.getParameter("method");
// System.out.println(method);
if(method.equals("add")){
this.doAdd(request, response);
}else if(method.equals("del")){
this.doDel(request, response);
}else if(method.equals("findid")){
this.doFindId(request, response);
}else if(method.equals("update")){
this.doUpdate(request, response);
}else if(method.equals("superfind")){
this.doSuperFind(request, response);
}else{
this.doFind(request, response);
}
}
public void doAdd(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.提取参数
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String sex = request.getParameter("sex");
int age = Integer.parseInt(request.getParameter("age"));
String phone = request.getParameter("phone");
//2.封装成对象
Person p = new Person(id, name, sex, age, phone);
//3.调用业务逻辑层(放到外面)
// IPersonService service = new PersonServiceImpl();
int i = service.addPerson(p);
System.out.println(i);
//4.跳转到显示页面
if(i>0){
request.getRequestDispatcher("CustomerServlet?method=a").forward(request, response);
}else{
request.getRequestDispatcher("add.jsp").forward(request, response);
}
}
public void doDel(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.取得参数
int id = Integer.parseInt(request.getParameter("cid"));
//2.调用业务逻辑层的删除方法
int i = service.deletePersonById(id);
//3.跳转到显示页面
if(i>0){
request.getRequestDispatcher("CustomerServlet?method=a").forward(request, response);
}else{
request.getRequestDispatcher("add.jsp").forward(request, response);
}
}
public void doFindId(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.取得参数
int id = Integer.parseInt(request.getParameter("cid"));
//2.调用业务逻辑层中的按id查询方法
Person p = service.findByIdPerson(id);
//3.保存对象
request.setAttribute("p1", p);
//4.跳转到update.jsp
request.getRequestDispatcher("update.jsp").forward(request, response);
}
public void doUpdate(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.提取参数
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
String sex = request.getParameter("sex");
int age = Integer.parseInt(request.getParameter("age"));
String phone = request.getParameter("phone");
//2.封装成对象
Person p = new Person(id, name, sex, age, phone);
//3.调用业务逻辑层(放到外面)
// IPersonService service = new PersonServiceImpl();
int i = service.updatePerson(p);
System.out.println(i);
//4.跳转到显示页面
if(i>0){
request.getRequestDispatcher("CustomerServlet?method=a").forward(request, response);
}else{
request.getRequestDispatcher("update.jsp").forward(request, response);
}
}
//查询所有客户信息
public void doFind(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.调用业务逻辑层的查询方法
List<Person> list = service.findAllPerson();
//2.保存到request中
request.setAttribute("list", list);
//3.跳转到显示页面
request.getRequestDispatcher("show.jsp").forward(request, response);
}
public void doSuperFind(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.提取参数
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String phone = request.getParameter("phone");
//2.封装成对象
Person p = new Person(name, sex, phone);
//3.调用业务逻辑层的高级搜索方法
List<Person> list = service.superQuery(p);
//4.保存到request中
request.setAttribute("list", list);
//5.跳转到显示页面
request.getRequestDispatcher("show.jsp").forward(request, response);
}
public void init() throws ServletException {
// Put your code here
}
}
过滤器filter
实现完成编码问题。
新建包“com.xmx.oa.filter”,在包下建class“CustomerFilter.java”,建的时候选择添加相应的Filter:
源代码:
package com.xmx.oa.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CustomerFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("我是过滤器,我骄傲!");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 把请求传回过滤链
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
配置“web.xml”文件:
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.xmx.oa.filter.CustomerFilter</filter-class>
</filter>
<!-- mapping过滤器的映射,url-pattern中配置的是你要对那个内容进行过滤 -->
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/CustomerServlet</url-pattern>
</filter-mapping>
一些说明
1、传参
<a href="CustomerServlet?method=del&cid=${v.id }">删除</a>
- CustomerServlet.java为处理页面
- ?后为传参,参数值不需要打引号
- &符号分隔两个不同参数
2、执行流程
以添加用户信息为例。
在add.jsp中添加信息后:
点击“提交”,页面交给“CustomerServlet.java”处理。
“add.jsp”传过去的method值为add:
<form action="CustomerServlet" method="post">
<input type="hidden" name="method" value="add" />
……
</from>
在“CustomerServlet.java”页面中,由“add”判断执行doAdd()方法:
if(method.equals("add")){
this.doAdd(request, response);
}
把表单中的值获取,并封装到Person p中后,调用业务逻辑层,来到“PersonServiceImpl.java”页面:
IPersonService service = new PersonServiceImpl();
int i = service.addPerson(p);
“PersonServiceImpl.java”页面中,继承于“IPersonService.java”,该继承页面声明了dao中的方法:
public class PersonServiceImpl implements IPersonService {
……
}
return dao.addPerson(p) ,来到“PersonDao.java”:
PersonDao dao=new PersonDao();
@Override
public int addPerson(Person p) {
// TODO Auto-generated method stub
return dao.addPerson(p);
}
“PersonDao.java”页面中,执行addPerson(Person p)方法:
public int addPerson(Person p) {
……
return i;
}
获取返回值i后回到“CustomerServlet.java”页面:
if(i>0){
request.getRequestDispatcher("CustomerServlet?method=a").forward(request, response);
}else{
request.getRequestDispatcher("add.jsp").forward(request, response);
}
执行成功则跳转到“CustomerServlet.java”,并传method值为a。
method=a为else中的判断条件,执行doFind()方法:
else{
this.doFind(request, response);
}
该方法最后获取到结果值,并跳转到显示页面显示出来:
//查询所有客户信息
public void doFind(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.调用业务逻辑层的查询方法
List<Person> list = service.findAllPerson();
//2.保存到request中
request.setAttribute("list", list);
//3.跳转到显示页面
request.getRequestDispatcher("show.jsp").forward(request, response);
}
3、dao中方法的定义
因为在“CustomerServlet.java”中使用的方法来源于 :IPersonService service = new PersonServiceImpl(); ,
经历了“IPersonService.java”和“PersonServiceImpl.java”。
因此在“PersonDao.java”中如果新增了方法后,在另两个页面也要相应添加。
例如:
//PersonDao.java
//高级搜索(多字段)Person封装的是可能选择的条件字段
public List<Person> superQuery(Person p){
……
return list;
}
//IPersonService.java
//高级搜索
public List<Person> superQuery(Person p);
//PersonServiceImpl.java
@Override
public List<Person> superQuery(Person p) {
// TODO Auto-generated method stub
return dao.superQuery(p);
}
注:方法有改变后,需重启服务器代码才生效。