1. Servlet
sun公司制定的一种用于扩展web服务器的功能的组件规范。
-
web服务器通常只能处理静态的资源(html , css , img , js…) , 为了解决一些动态的处理数据 ,就需要对 web服务器的功能进行扩展,servlet就是用于处理动态数据的组件规范。
-
组件: 符号一定规范 ,完成部分功能的软件模块。这些软件模块需要放在容器中进行运行。 比如:servlet , jsp就属于组件, tomcat就属于容器。 servlet必须放在tomcat容器中进行运行。 必须先启动tomcat, 然后才能访问到servlet , jsp.
-
容器:符号一定规范 , 能够运行组件的一种软件。 比如:tomcat …
-
servlet规范: 使用servlet的时候,自定义的类是HttpServlet的子类 ,那么就是符合servlet的规范。
2. Servlet的开发步骤
-
新建符合java web项目的工程
-
servlet 类 继承 HttpServlet
-
重写service方法
- service(HttpservletRequest request , HttpServletResponse)
- request : 请求
- response :响应
-
java web工程中的web.xml文件
- web.xml 的文件名不能修改(tomcat找web.xml)
- 将java的类 和 浏览器访问的地址做一个映射
- 浏览器没法办法直接访问java类中的方法 , 所以需要java类映射到一个浏览器能访问的url地 址。
-
打包(idea帮助完成)
- 把web项目运行需要的文件内容按指定文件结构保存。
- 部署(在idea中可以完成)
- 把打包好的web程序放到tomcat容器中,然后运行tomcat容器的时候,才能访问我们的web 程序。
-
启动容器, 然后可以通过浏览器访问访问web程序。
3. maven web项目的创建
-
选择maven项目 ,选择项目的模板为maven-archetype-webapp.
-
设置项目的名字等信息
-
设置maven的路径
4. 项目创建之后的修改
-
找到项目结构,添加java, resources目录
-
新建文件夹,设置文件夹类型
-
删除原来低版本的web.xml文件
-
增加4.0版本的web.xml
-
安装配置tomcat 服务器
java web项目运行,需要运行在支持java web项目的服务器上,常见的java web服务器: tomcat、JBoss、Resin、Jetty
-
单击右侧的add configuration , 打开配置窗口
-
选择tomcat
-
选择tomcat的路径
-
部署项目
-
修改项目的请求路径
-
项目启动成功之后,访问的url:
-
修改控制台乱码:
5. servlet & servlet的配置
- servlet
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
// 设置编码方式
String name = req.getParameter("name");
String password = req.getParameter("password");
// 获取用户名与密码
BookUserDao dao = new BookUserDao();
BookUser user = dao.getUserByNameAndPassword(name,password);
PrintWriter writer = resp.getWriter();
// 输出流
String html;
if(user == null){
html = "<html><body><h2>用户名或密码错误</h2></body></html>";
}else{
html = "<html><body><h2>"+ name +",恭喜你登录成功。</h2></body></html>";
}
// 拼接html
writer.println(html);
// 输出信息
}
}
- web.xml
<servlet>
<servlet-name>atry</servlet-name>
<servlet-class>action.TryServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>atry</servlet-name>
<!--
/*:所有地址都会被匹配到
/:除了jsp和精确地址,都会被匹配到
/url:精确地址
*.xx:按后缀名进行匹配
-->
<url-pattern>/try</url-pattern>
</servlet-mapping>
-
接收前端提交的数据
- http://localhost:8080/webapp/servlet-url?key=value&k1=v1&k2=v2…
- request对象getParameter(key) , 获取请求参数
- getParameter 方法的返回值是String类型,使用的时候需要注意数据类型的转换
- 如果前端没有提交该参数, getParameter 返回值是null
- 如果前端提交的中文出现乱码, 设置编码为utf-8:request.setCharacterEncoding(“utf-8”)
-
响应结果
- 通过response对象的getWriter() 方法,得到输出流
- 通过输出流,输出字符串内容,作为响应结果
- 设置响应结果的类型 和字符编码:resp.setContentType(“text/html;charset=UTF-8”)
- text/html , 这个是浏览器能解析的html格式
- application/json , 这个是浏览器能解析的json格式 (后期在ajax中使用)
- 浏览器对不能解析的格式,就提示你下载(test/html , 就是浏览器不能解析的格式,就 提示下载。)
6. servlet的url映射方式
tomcat 优先查找servlet ,如果没有符合的servlet ,那么就找静态资源,如果也没有静态资源被找到, 就404.
-
/life : 精确地址 ,没有扩展名, 以/开始
-
/life.do: 精确地址, 有扩展名, 以 / 开始 .do , 通配符 + 扩展名, 所有以.do结尾的请求,都会被拦截, 不能以/开始。
- / , 拦截所有请求, 但不拦截jsp
- /* , 拦截所有请求
7. jsp的使用
jsp是一种运行在服务器端的页面, 它里面包含html , 嵌入一些java语言, 在服务器(tomcat)上经过 解析转换, 输出为html页面。
jsp不需要配置, 直接用它的路径和文件名进行访问。
jsp是sun公司制定的一种用于服务器动态页面的技术规范 , 也是一种组件, 依赖于tomcat进行运行。
-
servlet + html : 数据的处理和数据的显示
-
servlet + jsp: 数据处理(servlet) , 数据展示(jsp-- 嵌套java使用)
- servlet 做数据显示的时候,不方便(编写, 维护都不方便)
- jsp:让数据的处理和数据的展示进行分离
7.1 基本结构
jsp文件的扩展名:.jsp
page指令:第一行是指定页面的类型和页面的编码方式
通过jsp文件的路径,进行访问: http://localhost:8080/webemp/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
7.2 jsp页面写Java相关内容
添加需要包,避免jsp内置对象使用的时候,不提示对应函数
7.3 jsp的运行
jsp的本质是servlet。
-
当第一个访问一个jsp页面的时候, 会将jsp文件, 对应生成一个servlet类。
-
html , js , css这种内容就用输出语句拼接。
-
其他和java相关的内容,就按java的方式转换。
7.4 jsp实例
<%@ page import="java.util.List" %>
<%@ page import="entity.Emp" %>
<%--
Created by IntelliJ IDEA.
User: yzxh
Date: 2022/9/6
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
Object emps = request.getAttribute("emps");
List<Emp> list = null;
if (emps != null) {
if (emps instanceof List) {
list = (List<Emp>) emps;
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>员工列表</title>
<style>
html,body{
padding: 0;
margin: 0;
width: 100%;
height: 100%;
min-width: 680px;
min-height: <%= 26.3*list.size() + 100 %>px;
}
body{
display: flex;
justify-content: center;
align-items: center;
}
h3{
text-align: center;
}
a{
text-decoration: none;
}
div>a{
width: 100%;
text-align: center;
display: inline-block;
}
table{
text-align: center;
}
tr td:nth-last-child(1){
width: 130px;
display: flex;
justify-content: space-evenly;
align-items: center;
}
</style>
</head>
<body>
<div>
<a href="<%=request.getContextPath()%>/jsp/addEmp.jsp">增加员工</a>
<hr>
<table border="1" cellspacing="0">
<tr>
<th>员工编号</th><th>员工姓名</th><th>工作岗位</th><th>部门经理编号</th><th>入职日期</th><th>员工工资</th><th>部门编号</th><th>操作</th>
</tr>
<%
for (Emp e : list) {
%>
<tr>
<td><%=e.getEno()%>
</td>
<td><%=e.getEname()%>
</td>
<td><%=e.getEjob()%>
</td>
<td><%=e.getEmanager()%>
</td>
<td><%=e.getEhiredate()%>
</td>