Servlet
web服务器
- 负责建立底层的网络连接,负责将客户端请求的文件返回给客户端
- web服务软件又称为web容器,用于装Servlet组件,负责根据用户请求的路径判断出使用哪个Servlet进行响应。
Servlet
- 用于扩展Web服务软件业务功能的组件规范
- 每一种请求都需要有一个单独的Servlet进行处理
Eclipse安装/删除Tomcat
- 让Tomcat和eclipse进行关联:
- Window->Preperenes->Server->Runtime
- 删除原有的tomcat(如果有的话)
- Add->选择对应的Tomcat版本下一步 -> Browser找到tomcat下载的安装包文件夹->完成
- 在Eclipse中添加Tomcat服务器
- 显示servers窗口: window->show view->other->搜索ser
- 删除之前存在的Tomcat: 右键删除
- 点击No Servers超链接 选择对应的Tomcat版本 确定
- 双击添加的Tomcat 把单选改到中间install…位置 保存关闭
- 在添加的Tomcat上右键 start运行
- 打开浏览器在地址栏中输入 locahost:8080 回车 看到猫说明成功!
- 删除关联的Tomcat
- 在servers窗口中右键删除
- Window->Preperenes->Server->Runtime->把存在的Tomcat Remove掉
- 找到java文件夹把解压的文件夹删除 重新解压
Eclipse创建web工程
- 创建maven工程 把jar改成war
- 解决错误:首先将pakege Explorer改成Project Explorer 在工程中文件名最长的Deployment Descriptor:上右键点击Generate Demloyment Descriptor Stub,作用:生成web.xml配置文件
- 让工程和Tomcat关联:工程名右键properties->Targeted Runtimes->在Tomcat上面打钩关闭
- 在Java Resources里面的src/main/java上面右键新建一个Servlet 名字为HelloServlet
- 在工程上右键Run as-> Run on Server
如果显示读进度条 Refreshing server adapter list 点击后面的红色停止 - 测试: 访问localhost:8080/web_1_1/HelloServlet 如果显示的内容不是404则说明访问成功!
Servlet响应流程
- 首先请求从客户端发出
- 先由服务器的Web服务软件Tomcat拦截到
- Tomcat取出请求路径中的子地址(/HelloServlet)
- Tomcat拿着子地址去web.xml中找到处理此路径的Servlet的完整类名
- Tomcat软件里面通过反射技术实例化HelloServlet
- 调用里面的service方法,这样的话就能保证我们写在Servlet里面的代码可以执行
浏览器中发出请求的几种方式
- 在浏览器的地址栏写请求路径 回车后发出请求
- 在html页面中通过超链接发出请求
- 在html页面中通过表单发出请求
Tomcat7.0版本解决中文乱码问题
-
找到Servers工程中的server.xml文件
-
在65行左右位置 添加以下代码
<Connector URIEncoding="UTF-8"
Servlet简单示例:
package cn.servlet.demo;
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;
public class SayHelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取传递过来的参数
String name = req.getParameter("name");
// 设置响应类型
resp.setContentType("text/html;charset=utf-8");
// 获取输出对象
PrintWriter pw = resp.getWriter();
// 输出数据
pw.print("你好:"+name);
// 关闭资源
pw.close();
}
}
service方法不管是get请求还是post请求都会执行的
doGet、doPost方法
- web项目:在src/main/webapp下的页面如果是get请求则使用doGet方法,post请求则使用doPost方法
- doPost方法要先设置字符集 request.setCharacterEncoding(“UTF-8”);
重定向到某个Servlet
response.sendRedirect(request.getContextPath()+"/ListServlet");
package cn.tedu;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MethodServlet
*/
public class MethodServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("GET请求");
// 业务处理...
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("POST请求");
request.setCharacterEncoding("UTF-8");
// 业务处理...
}
}
中文乱码问题
-
如果返回给浏览器的数据有中文则需要在设置响应类型时指定字符集
resp.setContentType(“text/html;charset=utf-8”); -
如果发送get请求并且请求中有中文时,Tomcat8.0以上版本不需要做任何操作,以下版本在Servers工程中找到server.xml 的第65行左右添加 URIEncoding=“UTF-8”
-
如果发送post请求并且请求中有中文时需要在获取参数之前执行以下代码
request.setCharacterEncoding(“UTF-8”);
DAO
-
Data Access Object:数据访问对象
将数据库相关的业务操作专门写在一个类中,取名叫xxxDao.class
示例:package cn.demo.dao; import java.sql.Connection; import java.sql.PreparedStatement; import cn.demo.entity.Emp; import cn.demo.utils.DBUtils; public class EmpDao { public void deleteEmp(int empno) { try (Connection conn = DBUtils.getConn()) { String sql = "delete from emp where empno=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, empno); ps.executeUpdate(); System.out.println("删除成功,请验证数据库!"); } catch (Exception e) { e.printStackTrace(); } }
public class DelServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取传递过来的员工编号 String empno = request.getParameter("empno"); System.out.println("员工编号:"+empno); EmpDao dao = new EmpDao(); dao.deleteByEmpno(empno); // 重定向 默认根路径是localhost:8080 // request.getContextPath()方法得到的是工程名称 /web_3_1 response.sendRedirect(request.getContextPath()+"/ListServlet"); } }
Thymeleaf
Thymeleaf简介
- Thymeleaf是一个HTML模板引擎
- 功能是将一个HTML文件作为模板,并根据模板中的特定标记,对模板中的内容进行修改或替换,最后形成一个新的HTML。
为什么要使用Thymeleaf
- 现在我们使用Servlet接收用户提交的请求,但是使用Servlet输出响应内容非常麻烦
- 如果编写一个HTML作为模板,使用Thymeleaf修改或替换指定的内容,再输出这个页面,那么就可以响应出复杂的页面
Thymeleaf使用注意事项
- HTML模板文件中的html标签属性必须按照规定编写
- java代码中所有相关类均导包自org.thymeleaf包下
Thymeleaf运行原理
- java通过Thymeleaf模板引擎,先将HTML模板读取到java,然后将模板中带有"th:"的部分根据特定的含义修改或者替换为Context对象中对应的内容
示例:
将ht1.html中的最后一个张飞替换成赵云
pom.xml中引入jab包thymeleaf
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
src/main/resources/th1.html
<!DOCTYPE html>
<html lang="en">
<head