JavaWeb入门到实战[狂神]-1
web基本概念
1.1
web开发:
web:网页的意思www.baidu.com
静态web
html.css(提供给所有人看的数据,不会变化)
动态web
提供给所有人的数据始终会发生变化 ,不同的时间,不同地点数据都不一样
技术栈:Servlet/JSP ,ASP ,PHP
在java中,动态web资源开发的技术统称为javaweb
1.2
web应用程序
web应用程序,可以提供给浏览器访问的程序:
1、a.html\b.html..多个web资源 ,这些资源可以被外界访问
2、访问的每一个页面或资源,都存在于世界上某一个角落的计算机
3、URL
4、这些统一web资源会被放在同一个文件夹,它就是web应用程序---》例如:Tomcat服务器
5、一个web应用由多部份组成(静态web,动态web)
--html,css,js
--jsp,servlet
--java程序
--jar包
--配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理
1.3静态web
html\htm都是网页的后缀,如果服务器上存在这些东西,我们就可以直接进行读取

缺点:
1、web页面无法动态更新,所有用户看到都是一个页面,所以为了能动起来(伪动态),用轮播图,点击特效,javaScript(实际开发),VBScript
2、无法和数据库交互(数据无法持久化,用户无法交互)
1.4动态web
页面动态展示,展示效果因人而异

缺点:
1、假如服务器动态web资源出现了错误,要重新编写后台程序,重新发布-停机维护
优点:
1、可以动态更新
2、可以和数据库交互(数据可以持久化:注册,商品信息,用户信息)
web服务器
技术讲解
ASP
--微软:国内最早流行
--在HTML中加入了VB的脚本,ASP+COM
--在ASP开发中,基本一个页面,有几千行的业务代码,维护成本高
--IIS
JSP/Servlet
--sun公司,主推的B/S架构
--基于JAVA语言,所有的大公司,或者一些开源的组件,都是用JAVA
--可以承载三高带来的影响(高并发,高可用,高性能)
--语法像ASP
PHP
--开发速度快,功能很强大,跨平台,代码简单
--无法承载大访问量
web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应
IIS
--微软:ASP,在window中自带的
Tomcat
--servlet\jsp
Tomcat
常见问题:
1、JAVA环境变量没有配置
2、闪退:需要配置兼容性
3、乱码问题:配置文件设置
服务器配置文件:conf/server.xml
--可以配置端口号:8080
--可以配置主机名称
默认的主机名:localhost-->127.0.0.1
默认网站应用存放的位置:webapps,8080默认是进入webapps-ROOT文件
--webapps:Tomcat服务器的web目录
--ROOT
--JJF:网站的目录名
--web-INF(一般放网站程序)
--class:java程序
--lib:web应用所依赖的jar包
--web.xml:网站的配置文件
--index.html
--static
--css
--js
--img

Http讲解
http(超文本传输协议)是一个简单的请求-响应协议,通过运行在TCP之上
--文本:html,字符串
--超文本:图片,音乐,视频,定位
--80
https:安全的
--443
HTTP请求
1、请求行
请求行中的方式:GET
请求方式:GET/POST,
---get:请求携带的参数比较少,大小有限制,会在浏览器显示数据内容,不安全,但高效
---post:和get相反
2、请求头
HTTP响应
1、响应体
2,响应状态码
200,请求成功
3XX:请求重定向
4XX:找不到资源
5XX:服务器代码错误 502:网关错误
Maven
目前用来就是方便导入jar包
Maven核心思想:约定大于配置
--有约束,不要去违反
--会规定你要如何去编写我们的java代码,要按照这个规范
注意,IDEA是有带maven插件,如果不在idea改启用maven的配置的话,是会将仓库放到默认地址C盘,如果确实要用idea的maven的话,要换镜像,要去idea的maven插件文件改配置表,如果要用自己安装的maven,先在配置里面改manven的启动来源,再建立maven项目,重点,改配置不要在设置那里改,在新建项目设置-为新项目设置,这里改maven的配置,不然每次新建项目又会恢复回idea自带的maven
1\下载安装
2、配置环境变量
3、阿里云仓库
4、本地仓库
--本地仓库,远程仓库
先改IDEA配置,再建项目


创建一个原生的maven项目

标记文件夹
文件夹右键-将目录标记为
或

pom.xml就maven的核心配置表
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 上面是MAVEN的版本和文件 -->
<!-- 下面是配置的GAV -->
<groupId>org.example</groupId>
<artifactId>maventest2</artifactId>
<!-- 下面是包的打包方式,war包是java web的打包方式,jar包是java应用的打包方式 -->
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>maventest2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 这里是项目的依赖信息 -->
<dependencies>
<!-- 依赖的jar包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 这里是项目的构建信息 -->
<build>
<finalName>maventest2</finalName>
</build>
</project>
如果建立一个干净的项目,pom.xml表是没有依赖的信息的,此时右边maven也没有任何依赖项,如果xml写了依赖的信息,右边就会有
maven的高级之处在于它能导入这个jar包所依赖的其他jar包

由于Maven是约定大于配置,有时可能在把文件放在不规定的文件中会导致导出不了,这时要在配置文件中,更新下buildr的信息
Servlet
-servlet是sun公司开发动态web的一门技术
-sun公司在这些API提供了一个接口叫servlet,如果你想开发一个servlet程序,只需要完成两个步骤
1,编写一个类,实现servlet接口
2,把开发好的java类部署到web服务器
把实现servlet接口的java程序(java类)叫做servlet
HelloServlet

1,构建一个maven项目,删除src,在这个项目建立Moudel(模块),这个空的工程就是主工程,在里面建立子maven
导入javax.servlet-api和javax.servlet.jsp,两个maven依赖,如果xml文件报红,要加上
2、关于maven父子工程的理解
--父项目xml会有
<modules>
<module>servlet-01</module>
</modules>
--子项目xml会有
<parent>
<groupId>com.cjj</groupId>
<artifactId>javaweb-02-servlet</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目的java包,子项目可以直接使用
3、Maven环境优化
--修改web.xml为最新的,用tomcat的xml
--将maven的结构搭建完整,加一个java文件夹
4、编写一个servlet程序
--编写一个普通类
--实现servlet接口,这里直接继承httpServlet,GenericServlet 这里是直接写好的类已经继承了servlet接口
package com.jj.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
//由于get和post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5、编写Servlet的映射
为什么需要映射,我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们要在web服务中注册我们写的servlet,还需要给他一个目标浏览器能够访问的路径
就是web-xml改配置内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!--注册Servlet,class就是java中的servlet类-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.jj.servlet.HelloServlet</servlet-class>
</servlet>
<!--注册Servlet请求路径-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6、配置tomcat



注意:配置项目发布的路径就可以了
7、启动测试
Servlet原理
servlet是由web服务器调用,web服务器在收到浏览器的请求之后

Mapping问题
配置web-xml文件
1、一个servlet可以指定一个映射路径、
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2、一个servlet可以指定多个路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3、一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4、默认请求路径
5、自定义后缀实现请求映射
6、优先级问题
指定了固定有映射路径优先级最高,如果找不到就会走默认的处理请求
像404也是可以指定请求页面,然后用/*表示路径,如果没页面,请响应指定的页面
ServletContext-共享对象
web容器(tomcat)启动的时候,它会为每个web程序创建一个对应的servletContext对象,代表当前的web应用:

相当于servletContext成为了可以共享的对象,你可以往一个java程序中的servletContext放东西,从另一个java程序取出来
第一步:往一个java程序中的sevletContext放东西
package com.jj.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello ");
//this.getInitParameter(); 初始化参数
//this.getServletConfig(); 获取Servlet配置信息
//this.getServletContext(); servlet上下文
ServletContext context = this.getServletContext();
String username="cccccj";//数据
context.setAttribute("username", username);//将一个数据存入到ServletContext中,名字为username,值为ccccc
}
}
第二步,往一个java程序中的sevletContext取东西
package com.jj.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
response.setContentType("text/html");
response.getWriter().println("Welcome " + username + "!");
}
}
第三步:配置好web-xml文件,当访问GetServlet所对应的路径时,就能用于访问HelloServle丢进去的内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Archetype Created Web Application</display-name>
<!--注册Servlet,class就是java中的servlet类-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.jj.servlet.HelloServlet</servlet-class>
</servlet>
<!--注册Servlet请求路径-->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.jj.servlet.GetServlet</servlet-class>
</servlet>
<!--注册Servlet请求路径-->
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
</web-app>
ServletContext-获取初始化参数
先在web-xml定义参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<display-name>Archetype Created Web Application</display-name>
定义一个类,然后注册到web.xml可以访问
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
response.getWriter().println("url: " + url);
}
}
ServletContext-请求转发
访问时跳到另一个页面,但是路径不会变
不像重定向,重定向路径会变

上面是请求转发原理
下面是重定向
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
public class ServletDemo04 extends HttpServlet {
@Override
public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
ServletContext context = this.getServletContext();
System.out.println("ServletDemo04 进入了");
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径,demo03的请求路径
requestDispatcher.forward(request, response);//调用forward实现请求转发
}
}
ServletContext-读取资源文件
在java中配置了resources但是发现没被打包,可以在配置文件中加上
<!--在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>false</filtering>
</resource>
</resources>
</build>
配置完可以先clean,然后再重启一下tomcat
就会发现target中class有properties文件,需要从target读取资源文件
package com.jj.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().println("Username: " + user + password);
HttpServletResponse
web服务器接收到客户端的请求,针对这个请求,分别创建一个代表请求的httpservletrequest对象,代表响应的一个httpservletresponse
--如果要获取客户端请求过来的参数:找httpservletquest(会将客户端的响应信息封装到这个对象中,如果需要对象的信息就用它的方法
--如果要给客户端响应一些信息:找httpservletresponse(如果要向浏览器响应的信息,用这个对象封装好信息进行响应
1,简单分类
负责向浏览器发送数据的方法
负责给浏览器发送响应头的方法
2、常见应用
向浏览器输出消息(上面的案例)
下载文件
--要获取下载文件的路径
--下载的文件名是啥
--设置想办法让浏览器支持下载我们需要的东西
--获取下载文件的输入流
--创建缓冲区
--获取outputstream对象
--将fileoutputstream流写入到buffer缓冲区
--使用Outputstream将缓冲区中的数据输出到客户端
t javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// --要获取下载文件的路径
String realPath = "D:\\learn\\idea\\javaweb-02-servlet\\response\\target\\response\\WEB-INF\\classes\\1.png";
System.out.println("下载文件的路径:"+realPath);
// --下载的文件名是啥
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
// --设置想办法让浏览器支持下载我们需要的东西
resp.setHeader("Content-Disposition", "attachment;filename="+fileName);
// --获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// --创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// --获取outputstream对象
ServletOutputStream out = resp.getOutputStream();
// --将fileoutputstream流写入到buffer缓冲区
// --使用Outputstream将缓冲区中的数据输出到客户端
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
}
生成验证码
实现重定向
一个web资源收到客户端请求后,会通知客户端去访问另一个web资源,这个过程叫重定向
不同上面的转发,转发是web资源自动转,不会跳其它链接
常见场景:
--用户登录
package com.cjf.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("r/down");
}
}
重定向和转发的区别
相同点:页面都会实现跳转
不同点:请求转发时候,URL不会变化;重定向,链接会发生变化
404说明是找不到页面资源,500是说明代码有问题了
定义一个登陆主页请求到后台,同时实现重定向
web.xml记得加上servlet的地址
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
package com.cjf.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + " " + password);
resp.sendRedirect("test.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
1、获取请求的参数,请求转发
package com.cjf.www;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
//通过请求转发
//这里的/是指当前web应用
req.getRequestDispatcher("/success.jsp").forward(req, resp);
}
}

浙公网安备 33010602011771号