Javaweb
安装 IDEA, 可以先用 -Ss
搜索intellij
来确定后面的版本号
1
| sudo pacman -S intellij-idea-ultimate-edition-2020.2.1-1
|
IDEA 使用技巧
Tomcat
安装
最好要去官网下载,
这样用户有执行权限,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 tomcat
和 sudo ctomcat
来打开和关闭
配置文件在 /etc/tomcat9/server.xml
tomcat: 8080 端口
https: 443 端口
默认网站存放位置 webapps
, 也就是
/usr/share/tomcat9/webapps
网站如何访问
输入域名
查看 hosts
配置文件里面有没有域名的映射
否则去 DNS 服务器
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 项目
然后填好名字后,把maven的配置改成自己的
然后看到下面 BUILD SUCCESS
就完成了
进去之后可以在设置里面的maven里面看到,因为有时候项目自动构建完成后,会使用默认的maven,可以在这里手动改。
然后里面可以建立源代码的文件夹
如果没有标记的话,可以右键文件夹 Mark Directory As
来定义文件夹的类型。
File
里面的 Project Structure
是项目结构设置,也可以在这里定义文件夹的属性
在IDEA中配置 Tomcat
点右上角的 Add Configuration
选择 Tomcat 9 Local
然后在
Application Server
设置一下自己的tomcat的路径,在Deployment里新建一个artifect
application context 可以直接设置为 /
然后配置好了点击 Run 可以看到Hello World的网站
然后在右边的Maven栏目可以控制Maven
关于生成的 web.xml
与版本不匹配的问题,可以从tomcat的web.xml复制一份
HelloServlet
首先可以去maven仓库里搜索 https://mvnrepository.com/
servlet
就能找到依赖,复制下面的到pom.xml
配置就好了
在 pom.xml
中加入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13
| <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>
<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
- 新建一个空项目,把
src
文件夹删掉
然后可以新建一个 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>
|
然后优化一下
Maven的环境,把maven的结构搭建完整。然后就可以编写一个 Servlet
了.
新建一个package,新建一个类
实现Servlet的接口,可以直接继承HttpServlet, 重写2 个方法
编写映射
为什么要映射:浏览器需要链接web服务器,所以要在web服务器中注册我们的程序
1 2 3 4 5 6 7 8 9 10
| <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.fyind.servlet.HelloServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
|
配置Tomcat 运行
启动测试
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 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 { String realPath = "/home/fyind/IdeaProjects/javaweb-02-servlet/servlet-03/src/main/resources/中文下载文件.txt"; String fileName = realPath.substring(realPath.lastIndexOf("/") + 1); 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 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 { 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; }
|
- 重定向