toAddCost()
,行吧,就叫这个名字啊,toAddCost
,即MainServlet.toAddCost()
,就去增加,去增加资费这个意思。toAddCost.do
,是有规律的对吧,其实说白了,这个方法叫什么,路径就是什么,/toAddCost.do
,这是我的一个习惯啊,规律啊,叫这个名字啊。那访问它以后,它这个打开增加页面,它这个有什么业务逻辑需要处理么,有没有业务逻辑呢,没有,就打开了页面对吧,没有业务,当然做完整要有,因为你要初始化那个图标对吧,做完整要有,但是现在没有,所以呢,这里我就不调dao了,不需要访问数据库了,直接转发对吧,是吧,有人说,哎,你这,就什么业务都没有,有必要还转发么,直接写个jsp,访问jsp行不行呢,不要这样啊,就是说,我们即便是没有业务,也要遵守MVC的规则,明白吧,就将来,我们会讲什么呢,我们怎么去统一管理,咱们项目中的这个请求,做一些公共的业务,那前提是呢,它们的结构一样,明白吧,套路一样才可以,所以,一旦说你改变了套路,将来代码不好管理。将来再讲啊,反正也是MVC啊。add.jsp
,/WEB-INF/cost/add.jsp
,这样的,然后呢,由jsp向浏览器做出了响应,最终呢,浏览器就得到了增加页面,这是增加功能的第一个请求,这样。然后呢,当浏览器得到这个网页之后,它一加载可以看到一个表单对吧,是得到一个表单,表单中有很多框,我就不细画了,然后呢,最终,表单上有一个保存按钮是吧,然后呢,当用户呢,点保存按钮时,是不是向服务器,又发请求,要求存数据是吧,这是我们这个功能的第2个请求,这样,前后的关系就是这样。然后呢,再往后看,那服务器要处理请求,因为有数据了,肯定是动态的对吧,所以还是要访问Servlet,那我还是访问同样的这个MainServlet,然后呢,是保存数据,增加数据,我这个方法叫addCost,行吧,MainServlet.addCost()
,刚才是要增加,现在是,就是真增加啊,是这样的。然后呢,它的路径跟这个方法相似,要求呢,是叫/addCost.do
,行吧,跟这个方法同名,对应。CostDao.save()
,就可以。那你要调保存方法的话,是不是要把数据传给它呢,传给CostDao.save(),传入的数据是什么数据呢,Emp,有点走火入魔了,是吧,学Emp学大了是吧,这里切换场景啊,这里是资费啊,是Cost,是吧,是Cost。那你把数据呢,封装好,传进去,然后呢,就存了,只要不报错就是成功对吧,好了,保存完以后然后怎么办, 最后怎么办啊,重定向到查询对吧,那么,在此之前,我们查询早做好了对吧,那查询是什么呢,早做好了,是MainServlet里面的findCost,当然,findCost调了Dao,MainServlet.findCost()
,它调了谁呢,调了这个CostDao.findAll()
方法对吧,这都已经写好了,然后呢,它已经能调这个Dao,由Dao呢,返回了集合数据。那你只要访问它就行了,访问MainServlet.findCost()
,那我们要访问它的话,因为这个增加和查询是两个不同的请求,不同的功能对吧,相互,所以重定向就可以了,那这是这个功能当中的第3个请求,3个请求呢,互相就这样串接起来了。MainServlet.toAddCost()
到/WEB-INF/cost/add.jsp
,这不就是转发一下么,对吧;服务器返回/WEB-INF/cost/add.jsp
给浏览器,这不就是一个jsp显示个东西,对吧;保存按钮被点击触发时,浏览器发送/addCost.do
请求到MainServlet.addCost()
,这不就是接收点参数么,MainServlet.addCost()
把Cost数据发送给CostDao.save()
,不就是把参数给dao,保存一下么,然后,MainServlet.addCost()
再建议浏览器发起第3个请求查询资费,不就是重定向么,每一步的逻辑都非常的简单了,都比较小了,就比较容易实现了。CostDao.save()
里啊,保存数据的时候,那么,我们传入的是6个值对吧,id你用序列生成;其他的3个值,状态,默认为1;然后呢,创建时间,默认为系统时间;开通时间,默认为null,听明白了么,这是一些细节,那再强调一下。<input type="button" value="增加" class="btn_add" onclick="location.href='fee_add.html';" />
,你只要把路径搞明白就可以了,那有人说,哎呀,路径我还是不会写,那你不会写的话,我以前也说过,你退一步讲,你实在不会写相对路径,你可以写绝对路径,绝对路径的格式是固定的,斜线,项目名,斜线,什么什么,是这样吧,固定的,你别管访问啥,都是这样的。所以说你不行的话,写绝对路径也能做出来,或者说,你写相对路径,你先不写,点点杠,试一下,写点点杠,试一下,你可以随便试试,没准就试对了,所以说,这个呢,自己尝试一下,不要只在想,有的时候,确实想不出来啊。/toAddCost.do
,这是我的规范。那打开这个Servlet,就MainServlet
,当然了,我画的图上呢,我说了要加一个新方法,叫toAddCost
,但是你直接加一个方法,没有用,因为我们这个类处理请求,靠的是service方法对吧,靠的是它,从父类继承过来的Servlet,你要想调用那个方法,是不是还得判断路径,才去调对吧,显然得在这,service方法里,还加一个判断,这应该能自己想到,因为这里头我都写上了,而且以前在做那个模拟员工管理时(Servlet2和Servlet3中),,,不也是这么干的么,对吧,都是判断,加判断啊。那这块我判断一下, else if("/toAddCost.do".equals(path))
,//根据规范(图)处理路径
if("/findCost.do".equals(path)) {
findCost(req,res);
} else if("/toAddCost.do".equals(path)) {
toAddCost(req,res);
} else {
throw new RuntimeException("没有这个页面");
}
toAddCost.do
,如果是这个路径,我就调这个方法,toAddCost(req, res);
,那么这个方法呢,我需要加以声明,那方法的声明,它和findCost(),没什么区别,我可以呢,复制粘贴进行处理,那这个复制的findCost方法名改一下,改成叫toAddCost
,然后呢,给个注释,这是打开增加资费的页面,这是打开那个增加的页面,不是保存,这个要把这个,它所代表的意义搞清楚,别整乱了。然后呢,toAddCost这个方法之内,没有任何的业务,就是转发,那转发到一个jsp,叫什么呢,叫add.jsp
,即/WEB-INF/cost/add.jsp
。然后你看啊,咱们以前做这个查询时,查询不也转发了么,是吧,查询也转发了,那查询,转发到查询jsp,find.jsp
,增加转发到增加jsp,add.jsp1
,这个是不是一样的方式啊,所以转发的路径是不是一样啊,对吧,所以你有了查询模块,转发的那个经验,增加时那个路径是一样的,一参考,你也不用去想它为什么会这样,它怎么写,以前怎么写,现在就怎么写对吧,就行啊。request.getRequestDispatcher()
,我记得做查询的转发的时候,我们是直接就写WEB-INF/cost/add.jsp
,是吧,就从这开始写,req.getRequestDispatcher("WEB-INF/cost/add.jsp").forward(req, res);
好,这就转发了,就一句话,然后呢,有同学问,说这个增加资费,我转发了,这数据 ,没有数据,我怎么去绑定数据呢,这学的有点太,太生硬了啊,这没有数据就别绑定,对吧,没有数据就不绑定了啊,就是说我们啊,给你讲一个项目,一个案例,这只是这个项目这么去做,我们换一个项目,肯定会有很多需要调整的地方,对吧,不可能都一样,参数不一样,有的有参数,有的没有,有的多,有的少啊,有的是转发,有的是重定向,可能是有调整的,这个调整,我们得多想一想啊。WEB-INF/cost
之下,创建这个jsp啊,add.jsp
,然后呢,jsp中的代码,我们可以呢,从这个静态页面中贴过来啊,所以去找到这个NETCTOSS_V02,下面的资费增加页面,资费页面在fee目录之下,资费增加为fee_add.html
,一目了然对吧,很直观了,或者你打开页面看一下就知道了,那我把这个fee_add.html
中的代码复制一下,然后粘贴过来,当然粘贴之前,还得写那个啥呢,还得写page指令,<%@page pageEncoding="utf-8" %>
,然后呢,粘贴过来。粘贴过来以后,我们还得从头到尾过一遍,因为这个网页上也需要引入样式和图片对吧,它的路径很有可能也不对,我们看一下,然后呢,七八行有link,link上,它原来写了点点杠,点点杠要么,不要,因为咱们find.jsp
,也是没有要对吧,跟它的意思一样,那你找葫芦画瓢也是把它去掉,再看,这个网页上有没有图片,我搜一下。好,60行,有一个图片,也是要把点点杠去掉,那么去掉以后Servlet和jsp都有了,最后呢,我们把增加按钮处理一下就好了。find.jsp
,然后,在find.jsp
之上,我找到这个增加按钮,那么增加按钮,它是在63行,找一下,按钮上原来写了,onclick单击时,改变网址,location.href='fee_add.html';
,它写的是一个静态的网页,但现在我们不是访问静态网页对吧,我们访问的是谁呢,也不能说jsp,访问的是谁呢,Servlet对吧,我们直接访问的是Servlet,Servlet访问路径是toAddCost.do
,那这里面,我们最好写相对路径,但如果说你自己写的时候,我就不会写相对路径,你可以写绝对路径,绝对路径怎么写呢,斜线开头,项目名,然后斜线,toAddCost.do
,即<input type="button" value="增加" class="btn_add" onclick="location.href='/netctoss/toAddCost.do';" />
,是这意思吧,也可以这样写,因为我们讲路径有3种方式,你再不会写,你可以写个完整路径http什么什么对吧,你把它写完整,肯定没有任何歧义。/netctoss/findCost.do
啊,对于浏览器而言,不知道有jsp,它只知道,有点do,有Servlet,我们要访问的目标,是这个啊,/netctoss/toAddCost.do
,你会发现,我们所访问这两个Servlet是平级关系,所以,路径就写toAddCost.do
这一段就行了,<input type="button" value="增加" class="btn_add" onclick="location.href='toAddCost.do';" />
,所以就可以不用写那么麻烦,那当然了,这个路径啊,如果说你已经很熟了,其实你也不用把它列举出来,你脑子里一想,当前是谁,目标是谁,你就能想出来,如果不熟的话,列举一下,对比一下,更清楚,再一个,你就可以随便试,即便是试错了,它肯定会提示你路径不对,你看是哪不对,差哪,你再调整,看浏览器。findCost.do
,即localhost:8080/netctoss/findCost.do
,查询到以后呢,去点增加,它打开了增加页面,toAddCost.do
,即localhost:8080/netctoss/toAddCost.do
,没错,就这样了,好,这就是第一个请求,完成了啊。那这是第一个请求。那我们再写第二个请求,增加功能呢,它最麻烦的,也就是在第二个请求上,但是呢,这个请求,和之前模拟的,跟那个其实没什么大的区别,浏览器要访问服务器传数据,表单要配置对吧,表单要配置,有3项,form上,得有action说明目标对吧,文本框,框上得有name,声明名字对吧,还有,如果是单选多选得怎么办,加value传什么值要声明对吧,这之前都讲过,你看着这个案例,得回顾一下。request.getParameter()
,是吧,如果是多个数据,getParameterValues()
,这回顾一下,这不刚讲过的么,有人这个就忘了,还有人说,我得到getParameter得到的那个数据, 我想判断它是否为空,我怎么判断呢,这个有点让我诧异,你get到的是什么,不就是字符串么对吧,字符串怎么判断为空呢,就判断呗,所以说,你看啊,其实,你问的这个问题,你自己回顾一下,有点不是那么回事对吧,你仔细想,不是那么回事,但为什么会问出来呢,就是说一旦这个案例复杂了,你会把你以前的那些,你所掌握的那些小知识,都了,一旦你感觉难的时候,你就选择混乱,你的思维就会混乱,就会遗忘,不知道为啥,这就是我们,让你做这个练习的目的。base_duration
,base_cost
和unit_cost
,这3个字段,这3个字段都是数字对吧,或整数,或小数,然后的话呢,我说了我们实体类,应该都用封装类型,好支持null对吧,但有同学仔细,突然就看到了说,这个数组得到以后,我数据库里得到为null,我得到的是0对吧,你注意到了么,你看我这个:find.jsp
页面里的基本时长,这是不是0啊,按理说应该是null,为啥是0呢,因为,因为什么呢,c.setBaseDuration(rs.getInt("base_duration"));
,我rs.getInt
,int是不是,这个getInt得到的是数字,明白么,就没有null,我getDouble,得到的也是数字,也没有null,所以它默认转为0了,自动的。那有人说,我想不要这个0,我就想空,怎么办呢,你得自己判断,比如说你把这个字段呢,当作字符串处理,getString,然后判断是不是为null,明白吧,如果为null,给它一个null值,如果不为null,我就再getInt,你可以判断一下,那有人说,那这也太麻烦了,那现在没办法,只能是这样,然后呢,将来我们会学到框架,我们学到框架以后就好了,框架比较聪明,它会自动帮我们判断,自动帮我们处理null,现在的话,没办法,那我也没判断,为什么呢,因为反正将来会用框架,先暂时就简单处理了啊。package web;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.AdminDao;
import dao.CostDao;
import entity.Admin;
import entity.Cost;
import util.ImageUtil;
public class MainServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//获取访问路径
String path = req.getServletPath();
//根据规范(图)处理路径
if("/findCost.do".equals(path)) {
findCost(req,res);
} else if("/toAddCost.do".equals(path)) {
toAddCost(req,res);
} else {
throw new RuntimeException("没有这个页面");
}
}
//查询资费
protected void findCost(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//查询所有的资费
CostDao dao = new CostDao();
List<Cost> list = dao.findAll();
//将请求转发到jsp
req.setAttribute("costs", list);
//当前:/netctoss/findCost.do
//目标:/netctoss/WEB-INF/cost/find.jsp
req.getRequestDispatcher("WEB-INF/cost/find.jsp").forward(req, res);
}
//打开增加资费
protected void toAddCost(
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
req.getRequestDispatcher("WEB-INF/cost/add.jsp").forward(req, res);
}
}
<%@page pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务