JavaWeb介绍
- java中,动态web资源开发技术
- web应用程序 -> Tomcat:服务器
- web应用程序编写完毕后,若想提供给外接访问,需要服务器统一管理
- 客户端 -> 请求 request -> 服务器 webServer
- 服务器 -> 响应 response -> 服务器
- 静态Web:WebServerPlugin -> WebServer -> FileSystem
- 动态Web: WebServerPlugin -> 动态Web资源
web服务器:处理请求、给用户响应信息
- ASP: 微软,HTML中嵌入VB脚本
- JSP/Servlet: B/S架构
tomcat:一个免费的开放源代码的Web 应用服务器
- tomcat 默认端口号:8080
- mysql:3306
- http:80
- https:443
- 默认主机名:localhost -> 127.0.0.1
- 默认网站应用存放位置:webapps
网站是如何进行访问的
- 输入域名, 回车
- 检查本机
C:WindowsSystem32driversetchosts
配置文件下有没有这个域名的映射,如果有直接返回对应的IP地址,可以直接访问;否则去DNS服务器(全世界的域名在此管理)找到返回。
如何发布一个网站
- 直接将自己的项目放在webapps下,就可以访问
HTTP:超文本传输协议,一个简单的请求-响应协议(403)
- http请求:客户端发起到服务器
- http响应:服务器响应到客户端
- 请求行方式:GET:一次能携带的参数较少,不安全,但高效/POST:携带参数无限制,安全不高效
- 消息头
- 响应状态码:200请求成功、3XX请求重定向、4XX找不到资源、5XX服务代码错误 502网关错误
Maven: 架构管理工具
- 核心思想:约定大于配置
注意:maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
Servlet:动态Web技术
- sun公司在API中提供一个接口:Servlet
- 编写一个类实现servlet接口
- 把开发好的java类部署到web服务器
- Servlet -> GenericServlet -> HttpServlet -> 自定义
Servlet原理
- 浏览器向web容器发起http请求
- 调用servlet中的service方法
- 自己实现类重写这些方法
- response返回请求之后的响应,web容器读取响应信息
- 将响应返回给客户端
mapping
- 一个servlet可以指定一个、多个、通用、后缀、前缀映射路径
<!-- 注册一个servlet -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zcs.helloservlet</servlet-class>
</servlet>
<!-- mapping -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<!-- url请求 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 优先级:固有的映射路径优先级最高,找不到会走默认的映射路径
ServletContext
web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,它代表当前web应用
- 共享数据:在此Servlet中保存的数据,可在另外一个Servlet中保存
String username = "zcs";
ServletContext context = req.getServletContext();
context.setAttribute("username", username);
- 获取初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
- 请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
//requestDispatcher.forward(req,resp); //调用forward实现请求转发;
context.getRequestDispatcher("/gp").forward(req,resp);
}
- 读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:
思路:需要一个文件流;
username=root12312
password=zxczxczxc
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
- 重定向和转发的区别?
相同点
- 页面都会实现跳转
不同点
- 请求转发的时候,url不会产生变化
- 重定向时候,url地址栏会发生变化;
session、cookie
- cookie: 客户端技术(请求、响应)
- session:服务器技术、可以保存会话信息
- 服务器给每个用户(浏览器)Session对象
- 一个Session会独占一个浏览器 -> 保存购物车信息
Session与Cookie区别:
JSP:Java Server Pages
- JSP中可以嵌入Java代码,为用户提供动态数据
<%%>
原理
- 浏览器向服务器发送请求,访问Servlet
- JSP最终会转换成一个Java类
- JSP本质就是一个Servlet类
- JSP页面 -> JSP转换成的Java文件 -> xxx_jsp.java -> xxx_jsp.class -> 返回给服务器
- JSP页面中java代码会原封不动输出、HTML代码会转换成
out.write(xxx)
基础语法、指令
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
- jsp脚本片段
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
脚本片段的再实现
<%
int x = 10;
out.println(x);
%>
<p>这是一个JSP文档</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--在代码嵌入HTML元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>Hello,World <%=i%> </h1>
<%
}
%>
- JSP声明
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void zcs(){
System.out.println("进入了方法Kuang!");
}
%>
JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!
在JSP,嵌入Java代码即可!
<%%>
<%=%>
<%!%>
<%--注释--%>
JSP的注释,不会在客户端显示,HTML就会!
- JSP指令
<%@page args.... %>
<%@include file=""%>
<%--@include会将两个页面合二为一--%>
<%@include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@include file="common/footer.jsp"%>
<hr>
<%--jSP标签
jsp:include:拼接页面,本质还是三个
--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
- 大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application 【SerlvetContext】 存东西
- config 【SerlvetConfig】
- out
- page ,不用了解
- exception
pageContext.setAttribute("name1","zcs1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","zcs2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","zcs3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","zcs4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
- JSP标签、JSTL标签、EL表达式
<!-- JSTL表达式的依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式: ${ }
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSP标签
<%--jsp:include--%>
<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="zcs"></jsp:param>
<jsp:param name="age" value="20"></jsp:param>
</jsp:forward>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
格式化标签
SQL标签
XML 标签
核心标签 (掌握部分)
JSTL标签库使用步骤
- 引入对应的 taglib
- 使用其中的方法
- 在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误
c:if
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
<%--
EL表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎您!"/>
</c:if>
<%--自闭合标签--%>
<c:out value="${isAdmin}"/>
</body>
c:choose c:when
<body>
<%--定义一个变量score,值为85--%>
<c:set var="score" value="55"/>
<c:choose>
<c:when test="${score>=90}">
你的成绩为优秀
</c:when>
<c:when test="${score>=80}">
你的成绩为一般
</c:when>
<c:when test="${score>=70}">
你的成绩为良好
</c:when>
<c:when test="${score<=60}">
你的成绩为不及格
</c:when>
</c:choose>
</body>
c:forEach
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"张三");
people.add(1,"李四");
people.add(2,"王五");
people.add(3,"赵六");
people.add(4,"田六");
request.setAttribute("list",people);
%>
<%--
var , 每一次遍历出来的变量
items, 要遍历的对象
begin, 哪里开始
end, 到哪里
step, 步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
<c:out value="${people}"/> <br>
</c:forEach>
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
一般用来和数据库的字段做映射 ORM;
MVC:view -> Controller -> Model
view
- 展示数据模型
- 提供用户操作
Controller
- 接收用户请求
- 交给业务层, 返回数据
- 视图跳转
Model: service Dao -> DataBase
- 业务处理(Service)
- 数据持久层(Dao)
Filter
实现Filter接口,重写对应的方法即可
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain : 链
/*
1. 过滤中的所有代码,在过滤特定请求的时候都会执行
2. 必须要让过滤器继续同行
chain.doFilter(request,response);
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前....");
chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
System.out.println("CharacterEncodingFilter执行后....");
}
//销毁:web服务器关闭的时候,过滤会销毁
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
- 在web.xml中配置 Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
</filter-mapping>