JavaEE项目分包和Thymeleaf基础
JavaEE项目分包和Thymeleaf基础
JavaEE项目中的java类的功能分类
1.什么是JavaEE项目
JavaEE是(java enterprise edition)java企业版
在JavaSE的基础上JavaEE提供一组API和运行环境来开发和运行大规模的,多层的,可扩展的,可靠的和安全的网络应用程序。学习的Servlet就是JavaEE的一部分,服务器端应用程序就需要JavaEE的API才能开发
2.编写实现新增和全查员工的业务
编写Java类
- Emp类:这个类对应emp表,Emp类中的属性对应emp表中的列
package entity;
//这个Emp类称为实体类
//项目对应的数据库中有几张表,一般就有几个实体类:一张表对应一个实体类
//类中的一个属性对应表中的一个列
//这个类的一个对象对应这个表中的一行
public class Emp {
//Integer能赋值null
private Integer empno;
private String ename;
private Double sal;
public Emp() {
}
//alt+shift+s+o有参构造
public Emp(Integer empno, String ename, Double sal) {
super();
this.empno = empno;
this.ename = ename;
this.sal = sal;
}
//alt+shift+sr get方法
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
@Override
//alt+shift+ss toString方法
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + "]";
}
}
- EmpDao类:编写对数据库进行操作的代码
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
//import entity.Emp;
//import utils.DBUtils3;
//dao就是编写对数据库操作的类
//EmpDao就是表示对emp表进行数据库操作
public class EmpDao {
//对emp表进行新增
public void insert(Emp emp) {
//获取数据库连接
try(Connection conn=DBUtils3.getConn();){
String sql="insert into emp(empno,ename,sal) values(?,?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1, emp.getEmpno());
ps.setString(2, emp.getEname());
ps.setDouble(3,emp.getSal());
ps.executeUpdate();
System.out.println("新增成功");
} catch (Exception e) {
e.printStackTrace();
}
}
//查询所有员工的方法
public List<Emp> getAll(){
List<Emp> list=new ArrayList<Emp>();
//获取数据库连接
try (Connection conn=DBUtils3.getConn();){
String sql="select empno,ename,sal from emp";
PreparedStatement ps=conn.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while(rs.next()) {
//循环中实例化对象
//Emp e=new Emp();
//为这个对象的各个属性赋值
e.setEmpno(rs.getInt(1));
e.setEname(rs.getString(2));
e.setSal(rs.getDouble(3));
//循环中将赋值好的对象加入list集合
//list.add(e);
//list.add(new Emp(empno,ename,sal));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
- AddServlet类:处理新增员工的业务
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import dao.EmpDao;
//import entity.Emp;
public class AddServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得表单中的各种信息
//设置请求中的中文字符集
request.setCharacterEncoding("utf-8");
Integer empno=Integer.parseInt(request.getParameter("empno"));
String ename=request.getParameter("ename");
Double sal=Double.parseDouble(request.getParameter("sal"));
//实例化Emp对象
Emp e=new Emp(empno,ename,sal);
//实例化EmpDao
EmpDao ed=new EmpDao();
ed.insert(e);
//通过页面重定向,发送新请求到FindAllServlet
//System.out.println(request.getContextPath());
//response.sendRedirect(request.getContextPath()+"/FindAllServlet");
}
}
- FindAllServlet类:处理所有查询员工并输出的业务
package 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 dao.EmpDao;
//import entity.Emp;
public class FindAllServlet extends HttpServlet {
//使用超链接访问的Servlet运行的是doGet方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
EmpDao ed=new EmpDao();
//调用查询全部员工的方法
List<Emp> list=ed.getAll();
//设置中文字符集
response.setContentType("text/html;charset=utf-8");
//显示/获得输出流
PrintWriter out=response.getWriter();
//代码和页面将显示在同一行
//out.print("1");
//out.print("2");
//代码换行页面中间加了空格
//out.println("1");
//out.println("1");
out.println("<table border='1' width='600'>");
out.println("<tr><th>编号</th><th>姓名</th><th>工资</th><th>操作</th></tr>");
//通过循环写内容
for (Emp e : list) {
out.println("<tr>"
+ "<td>"+e.getEmpno()+"</td>"
+ "<td>"+e.getEname()+"</td>"
+ "<td>"+e.getSal()+"</td>"
+ "</tr>");
}
out.println("</table>");
out.close();
}
}
- DBUtils类:获得数据连接的类,改变管理问题就像分类
3. Java文件的分类
可将上面业务中的java类分成几个类型:
-
dao类
访问数据库的java类
-
entity类
实体类,也叫domain或bean或pojo,包含承载信息用的属性构造和getters,setters,一般情况下一张表对应一个单独的实体类
-
controller类
控制器,控制请求和响应
-
utils类
工具类,业务中起辅助作用
实现简单删除和修改业务
1. 页面重定向
调用response.sendRedirect()方法进行页面的重定向
response.sendRedirect(request.getContextPath()+"/FindAllServlet");
2.实现删除业务
将findAllServlet代码修改如下:
package 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 dao.EmpDao;
import entity.Emp;
public class FindAllServlet extends HttpServlet {
//使用超链接访问的Servlet运行的是doGet方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
EmpDao ed=new EmpDao();
//调用查询全部员工的方法
List<Emp> list=ed.getAll();
//设置中文字符集
response.setContentType("text/html;charset=utf-8");
//显示/获得输出流
PrintWriter out=response.getWriter();
//代码和页面将显示在同一行
//out.print("1");
//out.print("2");
//代码换行页面中间加了空格
//out.println("1");
//out.println("1");
out.println("<table border='1' width='600'>");
out.println("<tr><th>编号</th><th>姓名</th><th>工资</th><th>操作</th></tr>");
//通过循环写内容
for (Emp e : list) {
out.println("<tr>"
+ "<td>"+e.getEmpno()+"</td>"
+ "<td>"+e.getEname()+"</td>"
+ "<td>"+e.getSal()+"</td>"
+ "<td><a href='DeleteServlet?empno="+e.getEmpno()+"'>删除</a> "
+ "<a href='UpdatePrepareServlet?empno="+e.getEmpno()+"'>修改</a></td>"
+ "</tr>");
}
out.println("</table>");
out.close();
}
}
删除业务的Servlet代码如下
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmpDao;
public class DeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String enoString=request.getParameter("empno");
Integer empno=Integer.parseInt(enoString);
//开始删除员工
EmpDao ed=new EmpDao();
ed.deleteEmpById(empno);
//删除完以后,可以显示所有用户,所以使用重定向,指向查询Servlet
response.sendRedirect(request.getContextPath()+"/FindAllServlet");
}
}
3.实现修改业务
修改业务分为两个步骤:
- 点击修改连接,进行按照empno执行查询员工信息的操作。出现修改页面
- 点击修改按钮,获得表单中的信息,执行修改操作,最后再重定向到全查的Servlet
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmpDao;
import entity.Emp;
public class UpdatePrepareServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Integer empno=Integer.parseInt(request.getParameter("empno"));
EmpDao ed=new EmpDao();
Emp e=ed.getEmpById(empno);
//获得emp对象,现在要输出一个页面,包含一个表单,并且把emp对象中的属性值显示到表单上
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println("<form action='UpdateActionServlet' method='post'>");
out.println("<input type='hidden' readonly='readonly' name='empno' value='"+e.getEmpno()+"'><br>");
out.println("<input type='text' name='ename' value='"+e.getEname()+"'><br>");
out.println("<input type='text' name='sal' value='"+e.getSal()+"'><br>");
out.println("<input type='submit' value='修改'><br>");
out.println("</form>");
out.close();
}
}
在Servlet中按empno查询出了一个员工的信息,并输出显示在一个表单里,点击这个表单的submit按钮,action指向了UpdateActionServlet来执行修改操作
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.EmpDao;
import entity.Emp;
public class UpdateActionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//修改字符集
request.setCharacterEncoding("utf-8");
Integer empno=Integer.parseInt(request.getParameter("empno"));
String ename=request.getParameter("ename");
Double sal=Double.parseDouble(request.getParameter("sal"));
Emp e=new Emp(empno,ename,sal);
EmpDao ed=new EmpDao();
ed.update(e);
//重定向到全查页面
response.sendRedirect(request.getContextPath()+"/FindAllServlet");
}
}
Thymeleaf基础
1. 什么是Thymeleaf
Thymeleaf是一个既可以显示静态页面又可以显示动态页面的服务器端模块引擎环境(官方网站:https://www.thymeleaf.org/)
2.为什么需要Thymeleaf
目的是为了将写在Servlet里面的html代码分离出去,写到单独的html,提高开发效率
3. Thymeleaf体验
在pom.xml文件中导入坐标
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
在src\main\resources目录下创建html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Thymeleaf1</title>
</head>
<body>
<ul>
<li>张飞</li>
<li>吕布</li>
<li>貂蝉</li>
<li th:text="${name}">曹操</li>
<li>马超</li>
</ul>
</body>
</html>
注意:现阶段要Thymeleaf访问的html页面必须放在src\main\resources目录下,否则无法访问,编写一个Servlet,按照格式替换上面li中的文本内容、
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
public class Th1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用Thymeleaf模板引擎将th1.html的副本输出
//实例化模板引擎对象
TemplateEngine te=new TemplateEngine();
//实例化一个模板引擎配置对象
ClassLoaderTemplateResolver resolver=new ClassLoaderTemplateResolver();
//设置字符集
resolver.setCharacterEncoding("utf-8");
//将配置在模板引擎上应用
te.setTemplateResolver(resolver);
//创建上下文对象,其中包含着要在页面上显示的信息
Context context=new Context();
//将想显示的数据放入到这个对象中(关键步骤)
context.setVariable("name", "刘备");
//使用模板引擎结合要显示在页面的信息,生成页面副本的字符串
String html=te.process("th1.html", context);
//将生成的字符串输出
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print(html);
out.close();
}
}
4. ThUtils类的编写
减少冗余,方便使用
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
public class ThUtils {
private static TemplateEngine te;
static {
te=new TemplateEngine();
ClassLoaderTemplateResolver r=new ClassLoaderTemplateResolver();
r.setCharacterEncoding("utf-8");
te.setTemplateResolver(r);
}
//编写一个方法将指定的html模板以及要替换的内容和response对象作为方法参数
//在这个方法中,直接输出页面结果
public static void print(String fileName,Context context,
HttpServletResponse response) throws IOException {
//获得根据模板生成的页面的字符串
String html=te.process(fileName, context);
//输出Html中的代码到页面
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print(html);
out.close();
}
}
于是乎,前一个Th1Servlet中代码就变成了这样:
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
public class Th2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建上下文对象,其中包含着要在页面上显示的信息
Context context=new Context();
//将想显示的数据放入到这个对象中(关键步骤)
context.setVariable("name", "周瑜");
ThUtils.print("th1.html", context, response);
}
}
5.Thymeleaf常用标记以及使用
- th:text 替换标签的文本内容
- th:utext 替换标签的html内容
- th:each “变量名:集合”遍历集合
- th:remove="all" 删除
- th:text中调用对象的属性
Person类:
package controller;
public class Person {
private String name;
private String gender;
private int age;
public Person() {
}
public Person(String name, String gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", gender=" + gender + ", age=" + age + "]";
}
}
html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>孙悟空</div>
<!-- 替换标签文本th:text -->
<div th:text="${msg}">猪八戒</div>
<!-- 替换标签html内容th:utext -->
<div th:utext="${info}">沙僧</div>
<div>
姓名:<span th:text="${name}">项羽</span><br>
性别:<span th:text="${gender}">男</span><br>
年龄:<span th:text="${age}">45</span><br>
</div>
<div>
<!-- p.name会自动调用p.getName方法,所以这种传递对象的方式必须要求实体对象有get方法 -->
姓名:<span th:text="${p.name}">项羽</span><br>
性别:<span th:text="${p.gender}">男</span><br>
年龄:<span th:text="${p.age}">45</span><br>
</div>
</body>
</html>
Servlet文件
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.context.Context;
public class Th3Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String msg="<h2>悟能</h2>";
String info="<h2>悟净</h2>";
String name="刘邦";
int age=55;
String gender="男";
Person p=new Person("虞姬", "女", 32);
Context context=new Context();
context.setVariable("msg", msg);
context.setVariable("info", info);
context.setVariable("name", name);
context.setVariable("age", age);
context.setVariable("gender", gender);
context.setVariable("p", p);
ThUtils.print("th2.html", context, response);
}
}
th:each和th:remove实现页面显示集合中的内容
html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- th:each遍历集合的用法 p代表集合中的每一个对象 -->
<ul th:each="p : ${list}">
<li th:text="${p.name}">刘德华</li>
<li th:text="${p.gender}">男</li>
<li th:text="${p.age}">45</li>
</ul>
<!-- th:remove删除当前标签以及内部的所有内容 -->
<ul th:remove="all">
<li>张学友</li>
<li>男</li>
<li>42</li>
</ul>
<ul th:remove="all">
<li>杨颖</li>
<li>女</li>
<li>22</li>
</ul>
</body>
</html>
Servlet文件
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.thymeleaf.context.Context;
public class Th4Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Person p1=new Person("刘备","男",35);
Person p2=new Person("黄忠","男",25);
Person p3=new Person("大乔","女",18);
List<Person> list=new ArrayList<Person>();
list.add(p1);
list.add(p2);
list.add(p3);
//实例化上下文对象,并且将这个集合存入上下文对象
Context context=new Context();
context.setVariable("list", list);
//输出模板
ThUtils.print("th3.html", context, response);
}
}