JavaWeb
什么是服务器
能对外提供服务的电脑就是服务器
网络通信的要素
- 网线
- IP:每台电脑在网络上的地址
- 端口:计算机数据的进出口
- 协议:传输中的数据包的格式
对外提供服务器所需要的东西
- 资源(任何文件)
- 开启端口
- 监听程序
JavaWeb资源的分类
- 静态资源:无论访问多少次,内容不变
- 动态资源:每次访问,结果都可能不一样
JavaWeb的文件目录说明
开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错
Tomcat
上面提到对外提供服务器中需要的第一个很简单,主要是后面两个,而有一个软件可以帮忙提供:Tomcat
什么是Tomcat
tomcat是一个轻量级的服务器软件,可以用于帮助我们开启端口和监听程序。
Tomcat的安装和使用
- 安装
通过上面的链接或者这个下载后解压即可,不要放到中文目录或频繁移动 - 卸载
找到文件夹删除即可
Tomcat目录信息
- bin:存放可执行文件(重点)
- conf:配置文件(重点)
- lib:第3方依赖
- logs:日志(重点)
- temp:用来临时文件
- webapps:存放应用程序(重点)
- work:工作目录,程序运行时一些文件放在这个目录
如何启动Tomcat
- 在文件夹下的bin目录中有一个shutup.bat文件,即为开始,shutdown即为关闭(在不选中任何东西时按Ctrl+C也可退出)
不要点下面的exe
不要点下面的exe
不要点下面的exe
- 点击开始后当出现下面划白线的文字时即为创建完成,红框处是访问的端口号
如果需要测试是否连接成功可以尝试打开浏览器,在地址栏输入测试
注意地址栏
测试自己的:http://localhost:端口号
测试别人的:http://别人的ip地址:端口号
当然现在大多数都是WiFi联网,因此同一个WiF或局域网内的需要互相访问需要输入内网的ip而不是公网的ip
如果是内网外的访问内网里面的网站,则需要使用到内网穿透,这边推荐cpolar,具体教程请看这里
启动时可以遇到的问题
点击开启后窗口一闪而过
以管理员身份运行的换成直接打开试试或者是下面这种情况
原因:没有正确配置JAVA_HOME环境变量
解决方法:正确配置JAVA_HOME环境变量,若确定环境变量没有问题则尝试在系统变量和用户变量中都添加JAVA_HOME环境变量
端口号被占用
图例:
-
暴力解决:找到占用的端口号,并且找到对应的进程,杀死该进程
-
使用命令
netstat –ano|findstr [指定端口号]
找到占用端口的进程 -
打开任务管理器->查看->选择列->然后勾选PID选项,回到任务管理器上可以查看到对应的pid,然后结束进程
-
-
温柔解决:修改自身的端口号
- 打开conf/server.xml 配置文件
- 搜索8080
- 找到这一段并修改port
将8080改掉即可
项目部署
既然开启关闭和可能会出现的问题都解决了,剩下的就是将我们要上传的资源导入到Tomcat中,以便别人使用
- 打开Tomcat目录下的webapps文件夹。并创建一个用于存放自己文件的文件夹
- 在这创建的文件夹中存放需要上传的文件
- 再次打开浏览器,输入访问地址/文件夹名/文件名即可访问
在IDEA中使用Tomcat
由于Tomcat无法运行java代码,在webapps里面创建java项目只会输出源码,所以我们需要在IDEA中连接Tomcat并使用
我这里使用的IDEA版本是2021.3.3,因此创建方式可能不同版本不适用,仅供参考
- 新建项目并选择Java项目
- 一直下一步到命名界面,更改名字后点击完成
-
右键项目文件选择Add Framework Support
-
勾选Web Application后确定
-
添加完成后选择右上角的Add Configuration
-
点击右上角加号,并选择Tomcat中的local
-
切换到Deployment选项卡下,点击+号并选择Artifact
8.此处的文字为需要访问此项目所输入的地址,建议为空 -
点击OK后即创建成功
用IDEA在Tomcat中部署Java项目
既然已经成功将Tomcat加到IDEA中了,那么怎么样才能将Java代码执行的结果输出到页面上呢?为此我们需要使用Servlet
Servlet
什么是Servlet
Servlet是运行在web上的一种应用程序,用来定义java类被浏览器访问时的规则
如何编写一个Servlet
- 编写一个普通的Java类
- 继承HttpServlet
- 重写service方法
- 配置@WebServlet注解,用于配置该Servlet的访问地址
案例:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//访问这个java类的地址
@WebServlet("/test")
//继承HttpServlet
public class Main extends HttpServlet {
@Override//重写service方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("啊啊啊");
resp.getWriter().write("hello world");
}
}
运行结果:
Servlet接收网页发送过来的数据
可以看到hello world上面的啊啊啊并没有输出,原因是上面使用的是java内部的控制台输出,运行时只会在IDEA内才能看到,Scanner同理,那么如何接收用户通过网页传输的数据内
我们可以看到在重写service方法时里面有两个参数,一个为HttpServletRequest(请求),另一个为HttpServletResponse(响应)
- HttpServletRequest:获取请求消息数据,即获取传输过来的数据
- HttpServletResponse:设置响应消息,即向用户返回的数据
通过这两个我们即可接收并根据用户的信息来返回了
具体案例:根据用户所输的账号密码来判断能否登录,数据源于数据库
html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<!--action:值返传到哪个页面,method:将表单的值传回时的类型-->
<form action="login" method="post">
//name:获取值时使用
账号:<input name="name"/><br/>
密码:<input name="pwd"/><br/>
<button>登录</button>
</form>
</body>
</html>
method中的参数一般为post或者get,详细请看这里
java代码:
import com.blb.utils.JdbcTemplateUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class loginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取网页表单传过来的对象
String name=req.getParameter("name");
String pwd=req.getParameter("pwd");
//判断用户名是否存在
JdbcTemplate jdbcTemplate = JdbcTemplateUtils.getJdbcTemplate();
String password = jdbcTemplate.queryForObject("select userPassword from user where userName=?", String.class, name);
if(password==null){
//响应
resp.getWriter().write("用户名不存在");
return;
}
if(!pwd.equals(password)){
resp.getWriter().write("密码错误");
return;
}
resp.getWriter().write("登录成功");
}
}
html运行界面:
登录运行结果
可以看到全都是问号,原因是字符编码不统一
乱码问题
1. html页面乱码
html本身乱码
解决方法:在html的<head>
中添加<meta charset="UTF-8">
2. request乱码
html传入Java时乱码
解决方法:在方法最前面添加req.setCharacterEncoding("UTF8");
必须在request.getParameter(String key)
获取request中的数据之前设置字符集不然还是乱码,所以最好写在方法最前面
3. 文件乱码
文件本身乱码
解决办法:将字符编码更改为UTF-8
4. jdbc乱码
数据传入数据库时乱码
解决方法:与数据库连接的URL后添加?useUnicode=true&characterEncoding=utf-8
5. 数据库乱码
数据库本身乱码
解决方法:更改数据库的编码格式更改为UTF8
6. 数据库表乱码
数据库表内数据乱码
解决方法:修改数据库的排序规则为utf8mb4_general_ci
7. tomcat日志乱码
解决方法:打开conf/logging.properties,将其中的UTF-8全部替换为GBK
8. response乱码
从Java转回web时乱码
解决方法:解决方法:在方法最前面添加下面两个
req.setCharacterEncoding("UTF8");
:设置服务器端的编码
resp.setContentType("text/html;charset=UTF-8");
:设置客户端所相应的类型和字符编码