Javaweb

安装 IDEA, 可以先用 -Ss 搜索intellij 来确定后面的版本号

1
sudo pacman -S intellij-idea-ultimate-edition-2020.2.1-1

IDEA 使用技巧

  • 别打开老项目

    settings 里面 system settings了里面别勾选 Reopen

    image-20200906194355077
  • Ctrl + 鼠标左键可以查看源代码

  • Alt + Shift + v 新建局部变量

Tomcat

安装

1
sudo pacman -S tomcat9

最好要去官网下载, 这样用户有执行权限,pacman 下载的运行要家sudo, 在idea里会报错

启动

可以在zshrc里面加入

1
2
alias tomcat="sudo zsh /usr/share/tomcat9/bin/startup.sh"
alias ctomcat="sudo zsh /usr/share/tomcat9/bin/shutdown.sh"

然后可以 sudo tomcatsudo ctomcat 来打开和关闭

配置文件在 /etc/tomcat9/server.xml

tomcat: 8080 端口

https: 443 端口

默认网站存放位置 webapps, 也就是 /usr/share/tomcat9/webapps

网站如何访问

  1. 输入域名

  2. 查看 hosts 配置文件里面有没有域名的映射

    否则去 DNS 服务器

Maven

1
sudo pacman -S maven

输入 mvn -version 可以看到 maven home/opt/maven

然后配置一下环境变量

1
2
3
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=$M2_HOME/bin:$PATH

打开后在自己家目录的某处新建一个 maven-reop文件夹放 jar包,然后在conf/settings.xml 复制到家目录的.m2里面设置一下路径

1
<localRepository>/home/.m2/maven-repo</localRepository>

新建一个javaweb 项目

image-20200904110251919

然后填好名字后,把maven的配置改成自己的

image-20200904121437830

然后看到下面 BUILD SUCCESS 就完成了

image-20200904110909251

进去之后可以在设置里面的maven里面看到,因为有时候项目自动构建完成后,会使用默认的maven,可以在这里手动改。

image-20200904121807084

然后里面可以建立源代码的文件夹

image-20200904122612964

如果没有标记的话,可以右键文件夹 Mark Directory As 来定义文件夹的类型。

File 里面的 Project Structure 是项目结构设置,也可以在这里定义文件夹的属性

image-20200904123046640

在IDEA中配置 Tomcat

点右上角的 Add Configuration

选择 Tomcat 9 Local

然后在 Application Server设置一下自己的tomcat的路径,在Deployment里新建一个artifect

image-20200905062648924
image-20200905062826588

application context 可以直接设置为 /

然后配置好了点击 Run 可以看到Hello World的网站

image-20200905065015356

然后在右边的Maven栏目可以控制Maven

image-20200905064927031

关于生成的 web.xml 与版本不匹配的问题,可以从tomcat的web.xml复制一份

HelloServlet

首先可以去maven仓库里搜索 https://mvnrepository.com/ servlet 就能找到依赖,复制下面的到pom.xml 配置就好了

image-20200905072648642

pom.xml 中加入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>

然后更新一下包。更新不了的可以去设置里看一下remote repository

java 源文件夹里面加入一个类 HelloServlet

然后按 Alt + Insert 打开代码生成器重写2个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 {
super.doGet(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

然后在get函数里加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}

Servlet

  1. 新建一个空项目,把src 文件夹删掉
image-20200906190712237
  1. 然后可以新建一个 Module, 勾选 webapp 的模板,于是这个新的module就是一个子项目,子项目可以使用父项目.

    子项目的 pom.xml加入

    1
    2
    3
    4
    5
    <parent>
    <groupId>org.fyind</groupId>
    <artifactId>javaweb-02-servlet</artifactId>
    <version>1.0-SNAPSHOT</version>
    </parent>
  2. 然后优化一下 Maven的环境,把maven的结构搭建完整。然后就可以编写一个 Servlet 了.

  3. 新建一个package,新建一个类

  4. 实现Servlet的接口,可以直接继承HttpServlet, 重写2 个方法

  5. 编写映射

    为什么要映射:浏览器需要链接web服务器,所以要在web服务器中注册我们的程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!--  Servlet 注册-->
    <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.fyind.servlet.HelloServlet</servlet-class>
    </servlet>
    <!-- Servlet 请求路径-->
    <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  6. 配置Tomcat 运行

  7. 启动测试

ServletContext

这是一个在所有servlet之上的东西,他可以存一些东西,来实现servlet之间的共享。

在设置的类里面

1
2
3
4
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("username", "myusername");
}

在使用的类里面

1
2
3
4
5
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
PrintWriter writer = resp.getWriter();
writer.println(servletContext.getAttribute("username"));
}

Response

  1. 下载文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取下载路径
String realPath = "/home/fyind/IdeaProjects/javaweb-02-servlet/servlet-03/src/main/resources/中文下载文件.txt";
String fileName = realPath.substring(realPath.lastIndexOf("/") + 1);
// 3. 设置浏览器支持下载
resp.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//获得下载文件输入流
FileInputStream fileInputStream = new FileInputStream(realPath);
// 创建缓冲区
int len = 0;
byte[] bytes = new byte[1024];
ServletOutputStream outputStream = resp.getOutputStream();
while ((len=fileInputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, len);
}
fileInputStream.close();
outputStream.close();
}

  1. 生产验证码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 让浏览器 3秒刷新一次
resp.setHeader("refresh", "3");
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D) image.getGraphics();

graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
graphics.setColor(Color.BLUE);
graphics.setFont(new Font(null, Font.BOLD, 20));
graphics.drawString(makeNum(), 0, 20);

// 告诉浏览器 这个请求用图片的方式打开
resp.setContentType("image/jpg");
// 取消网站缓存
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
//把图片写给浏览器
ImageIO.write(image, "jpg",resp.getOutputStream());
}

private String makeNum() {
Random random = new Random();
String nextInt = random.nextInt(999999) + "";
for (int i = 0;i < 6 - nextInt.length(); ++i) nextInt += "0";
return nextInt;
}
  1. 重定向