写在前面
1.刚跟小yao交流一下说这块还是很像以前的jdbc的,那一个部分的crud。
所以我觉得可以对比来看看吧,都是小白理解------
2第一这块开始结合了前后端的东西,通过最重要的http这种协议来实现前后端的交互,不再是控制台小白了,所以说这么一想我觉得这块最重要的就是理解一下http里面的转发和重定向,另外一些具体细节(比如说绝对路径啊,相对路径啊),出现的bug可以一起分享一下
3.另外我觉得就是从技术的角度,理解一下业务的流程和细节。你如说你crud整完 ,高低应该给用户看一眼,再比如说,你删除的时候,高低问下用户是不是确认删除。
整体的知识性的定义
1.servlet的生命周期、几个重要方法的重写的关系(doget、dopost、service):
Servlet的生命周期包含了下面4个阶段:
1.加载和实例化
2.初始化–init()
3.请求处理–service()
4.服务终止–destroy()
service()方法的职责:核心方法
可以重写doget、dopost方法,默认访问service
service()方法为Servlet的核心方法,客户端的业务逻辑应该在该方法内执行,典型的服务方法的开发流程为:
解析客户端请求-〉执行业务逻辑-〉输出响应页面到客户端
2.转发和重定向的区别(包括绝对相对路径的问题):
转发就是不涉及到url,不会产生新的reuqest请求,那我理解就是转发到新的jsp页面里面,request直接内置了,你通过这个requset数据的绑定直接扔到,下一个新的jsp页面里面。
重定向:就是产生一个新的需求,这个需求还要通过xml去拦截一下,然后再走一个继承servlet的service。
我觉得其实本质都是一样的都是再进去一个servlet。
转发
request.setAttribute("persons",s1);
RequestDispatcher rd=request.getRequestDispatcher("showall.jsp");
rd.forward(request,response)
重定向
String url=request.getContextPath()+"/findall";
response.sendRedirect(url);
路径问题:是有相对与浏览器地址,还是服务器地址这种复杂说法。
我理解就是加/ 那就是绝对路径–得从8080来开始算
相对路径不加/从应用开始算。
我这里测试了一下,重定向的时候我直接加相对路径一点毛病没有。
String url="findall";
response.sendRedirect(url);
3.jsp的原理、加载执行过程(第一次和第二次)解决了什么问题:
转载:
https://blog.youkuaiyun.com/weixin_42529699/article/details/81303861
自己理解:
1.jsp–java servlet page 这么说就很清晰了,就是一个servlet只是放在前端里面融合了一下
2.加载分第一次加载和第二次加载:第一次的话会编译成class文件,再执行service方法。如果第二次没有更改代码的话直接调用service方法就ok了。service方法在jsp里面隐藏了,包括各种输入输出流都是简化了,然后内置的request等对象等等。。。。
3.解决问题:就是能够实时动态展示,不至于写死在后端里面。
4.新手问题:具体怎么融合进去,当时在for里面写前端表格的问题给我愁坏了。
4.整个web框架-从浏览器到服务器再到数据库
tomcat就是服务器应用
层次分析
1.前端
最前面的是各种页面,用来与客户互动,请用户进行输入,对用户的命令进行反馈。这里面前期用的是html,然后一键表格发送。
一些要说的
1.隐藏ID,我觉得不应该让客户更改信息的时候把自己ID改了吧,毕竟在数据库里他也是是主键,不能动啊
<input type="text" value="<%=request.getParameter("id")%>" hidden="true" name="id">
2.删除提示
2.service层
我的理解就是service层有多少,那么dao层就有多少功能点,因为比较简单清晰,这次我是把dao层所有功能封装到一起了,就是增删改查功能点都在一起了。
service层我觉得是这一部分的重点,从刚开始你要从request上面拽下来用户发过来的信息,再到回传的时候,进行数据绑定,转发dao层回传的数据给前端。后期涉及到重定向贴近现实需求。
service层的话实现的话,用的是继承HttpSevrlet类。也可以继承servlet类,先不讨论。
3.dao层
有前面jdbc扎实的底子,这一块可以说是最简单的。也有一部分细节问题。其实就是传参的问题,入口点参数要清晰。比如说更改信息这一块,一定要待着id一直带到dao层,带到数据库。
这时候,前端页面我设计的是隐藏了id.–前面有说–
4.不得不说的核心 web.xml
这个东西就相当于路口指挥的交警,指挥着请求的方向,告诉它到底去哪个servlet。很重要,很重要,很重要。
5.差点忘了的实体类和DBUTIL-也是很重要的,我们封装这两个,减少代码量。
service层的代码分享
查询
public class getperson extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer=response.getWriter();
List<person> s1;
Persondao persondao=new Persondao();
try {
s1 = persondao.getall();
//需要将绑定数据的request发送到指定的页面 ---绑定和转发
request.setAttribute("persons",s1);
RequestDispatcher rd=request.getRequestDispatcher("showall.jsp");
rd.forward(request,response);
} catch (SQLException throwables) {
throwables.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
System.out.println("服务器异常");
}
}
}
增加
public class addperson extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
int id=Integer.parseInt(request.getParameter("id"));
String name=request.getParameter("name");
int age= Integer.parseInt(request.getParameter("age"));
//创建一个 实体类的对象方便管理
person emp1=new person();
emp1.setId(id);
emp1.setName(name);
emp1.setAge(age);
//DAOc层数据写入
Persondao persondao=new Persondao();
try {
persondao.addperson(emp1);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//利用重定向x显示结果--再回到查询所有页面
//url 要是绝对路径(/这种带斜杠的 --是从服务器发出--从8080端口的根目录开始算--应该写完整--/csdn/findall)
//url 写相对路径--- findall--重定向到这个位置
// 咱们这个csdn属于 项目名 也是应用名 参考的是服务器的根目录---并不是像转发是根据浏览器地址来讲
//{ 开发日志--0909 1.完成重定向的学习--实现添加员工后自动跳回原来页面 2.实现删除功能 }
try {
//获取当前应用的名字 --/当前应用的名字
String url=request.getContextPath()+"/findall";
response.sendRedirect(url);
} catch (IOException e) {
e.printStackTrace();
}
}
}
修改
public class updataperson extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
int id= Integer.parseInt(request.getParameter("id"));
String name=request.getParameter("name");
int age= Integer.parseInt(request.getParameter("age"));
Persondao persondao=new Persondao();
try {
persondao.updataperson(id,name,age);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//继续做一个重定向
String url=request.getContextPath()+"/findall";
try {
response.sendRedirect(url);
} catch (IOException e) {
System.out.println("重定向失败");
e.printStackTrace();
}
}
}
删除
public class delperson extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
int id= Integer.parseInt(request.getParameter("id"));
Persondao persondao=new Persondao();
try {
persondao.delperson(id);
} catch (SQLException throwables) {
throwables.printStackTrace();
System.out.println("删除异常");
}
//删除完再 重定向 回到查询所有页面--可以是相对路径
String url="findall";
try {
response.sendRedirect(url);
} catch (IOException e) {
e.printStackTrace();
}
}
}
dao层的代码分享
我把crud都写在一个里面了,因为其实你dao层,他属于就是被调用那块的,被控制那块的,只要你dao里面自己写清楚结构了,他都是被动接收参数的,不涉及像service层那种要分开走的功能。
public class Persondao {
Connection conn= null;
String sql1="select id,name,age from person";
List<person> personList=new ArrayList<person>();
public List<person> getall() throws SQLException {
conn= DBUTil.connection();
//预编译sql语句 防止sql注入
PreparedStatement preparedStatement=conn.prepareStatement(sql1);
ResultSet set=preparedStatement.executeQuery();
//循环迭代 将查询到的记录放到list集合里面
while (set.next() ){
person person=new person();
person.setId(set.getInt("id"));
person.setName(set.getString("name"));
person.setAge(set.getInt("age"));
personList.add(person);
}
conn.close();
return personList;
}
public void addperson(person emp1) throws SQLException {
String sql2="insert into person values(?,?,?);";
Connection connection=DBUTil.connection();
PreparedStatement ps=connection.prepareStatement(sql2);
ps.setInt(1,emp1.getId());
ps.setString(2,emp1.getName());
ps.setInt(3,emp1.getAge());
ps.execute();
connection.close();
}
public void delperson(int id) throws SQLException {
String sql3="delete from person where id=?;";
Connection connection=DBUTil.connection();
PreparedStatement ps=connection.prepareStatement(sql3);
ps.setInt(1,id);
ps.execute();
connection.close();
}
//编辑内容 需要传参去定位到数据库内容
public void updataperson(int id,String name,int age) throws SQLException {
String sql4="update person set name=? , age=? where id=?";
Connection connection=DBUTil.connection();
PreparedStatement ps=connection.prepareStatement(sql4);
ps.setInt(3,id);
ps.setString(1,name);
ps.setInt(2,age);
ps.execute();
connection.close();
}
}