文章目录
- 一、javaweb简介
- 二、Tomcat
- 三、Maven
- 四、Servlet简介和HelloWorld
- 五、Servlet原理
- 六、Mapping映射
- 七、ServletContext
- 八、请求转发
- 九、读取资源文件properties
一、javaweb简介
在java中,动态web资源开发的技术成为javaweb
人们访问到的任何一个网页和资源,都存在于这个世界的某一个角落的计算机上
二、Tomcat
解压,直接使用
文件夹的作用:
bin:文件里面装的是启动关闭的一些脚本文件
conf:装的配置文件
lib:装的依赖的jar包
logs:装的日志
webapps:存放网站
work:工作目录
con\sever.xml是服务器核心配置文件
webapp中的index.jsp存的就是首页
修改端口号
网站访问的流程
1、输入域名
2、检查本机C:\Windows\System32\drivers\etc\hosts配置文件下有没有域名映射,有则直接访问,没有需要找DNS服务器
3、可以配置环境变量
网站应该有的结构
--webapps:
-ROOT
-WEB-INF
-classes:java程序
-lib:web应用所依赖的jar包
-web.xml:网页配置文件
-index.xml 默认的首页
-static
-css
-js
-img
IDEA中对tomcat的配置;
必须要添加一个artifaces
因为访问一个网站,必须要指定个文件夹名字
虚拟路径映射
三、Maven
Maven是一种项目架构管理工具
简化导入jar包的过程,帮助我们自动导入和配置jar包
下载网址:https://maven.apache.org/
下载完成后解压即可(解压bin)
配置文件在conf中的setting.xml 可以在mirror中增加阿里云的镜像
web.xml是web配置文件
配置环境变量
M2_HOME 对应bin目录
MAVEN_HOME Maven的目录
在Path中,配一个%MAVEN_HOME%\bin
在cmd中输入mvn -version测试Maven是否安装成功
在localRepository标签下设置本地仓库
在DIEA中Maven的使用
1、启动IDEA
2、创建一个Maven项目(常用webapp)
3、查看相关的Maven设置
设置目录
也可以在这里配置
Maven约定比较严格,所以可能会导致出现无法被导出或者生效的问题
父子项目
父项目中的java子项目可以直接使用
<parent>
<artifactId>javax.servlet-api</artifactId>
<groupId>javax.servlet</groupId>
<version>3.1.0</version>
</parent>
子项目有
四、Servlet简介和HelloWorld
1、编写一个普通类,继承HttpServlet
2、web.xml编写映射
写的是java程序,但是需要浏览器访问,浏览器需要链接web服务器,所以我们需要在web服务器注册我们的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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置返回的类型
resp.setContentType("text/html");
// 获取响应的输出流 写完还要去web.xml中注册servlet
PrintWriter out=resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello KERWIN!</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 注册servlet-->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<!-- 一个Servlet对应一个Mappping映射-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!-- 设置请求路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
五、Servlet原理
servlet是由web服务器调用,web服务器在收到浏览器的请求之后
浏览器把HTTP请求发送给web容器,容器来首次访问servlet
带着请求和响应调用servlet的Service方法,调用自己编写的实现类,重写对应的方法(接收请求并给出响应)
Request从Service中拿到请求,然后把请求交给Response
六、Mapping映射
1、一个servlet可以指定一个映射路径
<!-- 一个Servlet对应一个Mappping映射-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!-- 设置请求路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2、一个servlet可以指定多个映射路径
<!-- 一个Servlet对应一个Mappping映射-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!-- 设置请求路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<!-- 设置请求路径-->
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
3、一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4、默认请求路径
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5、自定义后缀请求路径
<!-- 自定义后缀实现映射
*前面不能加项目路径
-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>*.kerwin</url-pattern>
</servlet-mapping>
<!-- 自定义前缀实现映射-->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/kerwin*</url-pattern>
</servlet-mapping>
6、优先级
指定了固定的映射路径优先级最高,如果找不到则会走默认的路径请求
七、ServletContext
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;
/*
web容器启动的时候,会为每个web程序都创建一个对应的ServletContext对象
代表了当前的web应用
数据共享:在这个servlet中保存的数据,可以在另外一个servlet拿到
*/
public class SetContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
ServletContext context = this.getServletContext();//获得servlet上下文
String url = context.getInitParameter("url");//初始化参数 在web.xml中的context-param设置参数
this.getServletConfig();//获得servlet配置
String name="wantfly";
System.out.println(url);
context.setAttribute("name",name);//将数据key-value形式保存在ServletContext中
context.setAttribute("url",url);
}
}
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;
import java.io.PrintWriter;
public class GetContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
String name = (String) context.getAttribute("name");
String url = (String) context.getAttribute("url");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<script>alert('"+name+url+"')</script>");
}
}
八、请求转发
A从C请求资源
请求转发:A先去找B,然后B找C,C把资源给B,B传给A
重定向:A去找B,B告诉A去找C,然后A去找C,C把资源传给A
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 DispatcherServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
// 请求转发后路径不变
context.getRequestDispatcher("/getContext").forward(req,resp);//转发的请求路径
}
}
九、读取资源文件properties
<!-- 在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>
<finalName>MyJava02</finalName>
</build>
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;
import java.io.InputStream;
import java.util.Properties;
public class DispatcherServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
java和resources都称为classpath db.properties在对应的目录下
在java目录下创建properties和在resources目录下创建properties都被打包到classes下俗称为classpath
主要思想:需要个文件流
*/
ServletContext context = getServletContext();
Properties properties=new Properties();
InputStream in = context.getResourceAsStream("WEB-INF/db.properties");
properties.load(in);
String username = properties.getProperty("username");
System.out.println(username);
// 请求转发后路径不变
context.getRequestDispatcher("/getContext").forward(req,resp);//转发的请求路径
}
}