-----------------------------------------JavaWeb------------------------------------------
tomcat乱码问题处理,
tomcat闪退问题:兼容性问题
在tomcat文件夹中
conf下的server.xml可以配置启动端口号,主机名称(改host、C/windows/sys32/driver/etc/host)
端口号
tomcat:8080
mysql:3306
http:80
https:443
网站是如何进行访问的
1)域名访问,发出请求
2)检查C/windows/sys32/driver/etc/host有没有域名映射,有就直接返回对应IP地址
没有,去DNS服务器找(DNS就是管理全世界域名,专门域名IP一一针对)
----------------------------------HTTP-------------------------------
http:(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
https:安全的,443
请求行
请求方式
GET:传递数据内容能够看到,不安全,但是高效,请求携带参数比较少
POST:安全,不高效,请求参数没有限制
相应状态码:
200:响应成功 200
3**:请求重定向,请求新位置
4XX:找不到资源 404
5XX:服务器代码错误 500
网关错误 502
----------------------------------MAVEN------------------------------
maven:javaweb中需要使用大量的jar包,需要手动去导入,如何实现自动导入jar包?
MAVEN是一个架构管理工具
核心思想:约定大于配置
https://maven.apache.org/
boot放的一些依赖包
MAVEN的环境变量配置
M2_HOME maven目录下的bin目录
MAVEN_HOME maven的目录
系统的path中配置 %MAVEN_HOME%\bin
cmd控制台查看maven版本:mvn -version
修改镜像mirrors:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
本地仓库/远程仓库
建立一个本地仓库:
localRepository
在conf下的settings.xml中找到settings,加一个
<localRepository>E:\Maven\apache-maven-3.6.3\maven-repo</localRepository>
IDEA中使用Maven
勾选,代表了使用maven模板,选择apache-webapp的模板,
groupID 公司
artifactID 项目
Idea中的maven设置
(目前使用的2019.2版本,问题较多,今天试图回退一个版本)
在E:\Maven\apache-maven-3.6.3\conf\settings.xml中配置好本地仓库地址,并且IDEA中–settings----maven中已修改本地仓库地址的情况下Repositories中仍然没有本地仓库信息,并且update无法点击??
------------E:\Maven\apache-maven-3.6.3\maven-repo--------------
这是idea2019版本的bug,换到2018的版本就好了。当然不换也可以,只是在写Pom.xml配置文件的时候不会按照本地仓库去智能提示你,只要你输入正确,没其他的影响。
选中文件夹,mark标记即可,变更文件夹的功能
在IDEA中配置tomcat
添加一个tomcat时,提示要fix,这里其实是要指定一个文件夹,否则IDEA不会去寻找相关项目,
在Deployment中添加一个就可以,其中:
Application context中写的名字,就是localhost:8080/*****的内容
不写的话,项目跑起来就是localhost:8080
Maven在IDEA中边栏功能操作
命令行操作
插件
依赖
POM文件
POM.XML是maven的核心配置文件
GUI、properties是配置、dependencies是相关依赖、building是项目相关结构目录
Maven的资源导出问题(一个很重要的问题):
<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>
IDEA如何查看日志?
Help-------------Show log in Explore
-----------------------------------------------Servlet-----------------------------------------
开发动态web
编写一个类实现Servlet接口,开发好的类部署到web服务器中
开发流程:
新建一个项目,空的,不用IDEA的maven模板,删掉Main文件夹
以后的学习都在这个项目里建立model,这个空的工程就是maven主工程
去api网站上
https://mvnrepository.com/
找相应api的maven依赖 粘贴到中,会自动从阿里的中心仓库中寻找相应jar包以及关联jar包,或者可以自己下相应jar包丢到自己的本地仓库中,也可以达到效果(针对无法从中心仓库中下载到的)
关于maven项目的父子工程
父工程的pom.xml中有
<modules>
<module>servlet-01</module>
</modules>
修改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">
</web-app>
maven环境优化:
修改web.xml为最新的、将maven结构搭建完整(java、resources)
----------Servlet--------
servlet有两个默认的实现类:HttpServlet
继承后需要重写doget()、dopost()方法
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
编写servlet的映射--------需要通过浏览器访问,浏览器需要连接web服务器,所以需要在web服务中注册写的servlet
<!-- 注册servlet -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-----配置tomcat—注意配置项目发布路径
--------------------------Servlet执行原理---------------------------
servlet是由web服务器调用,服务器收到请求后作出响应
浏览器向服务器发送Http请求,web容器(tomcat)收到请求后,根据请求、请求头、请求体,
带着request、response找servlet,servlet调用service(Request res,Response rsp),收到请求后,
我们编写的实现类重写servlet的方法处理请求,并给出响应信息,封装到response中返回
Mapping问题
一个servlet指定一个映射路径
一个servlet指定多个映射路径
一个servlet指定通用路径(用通配符*,不要这么写,会覆盖一切路径)
指定了固有的servlet的映射路径,优先级最高
如果找不到那就走通配符的定制404页面
public class ErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>这是我的404界面</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>Error</servlet-name>
<servlet-class>com.wang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Error</servlet-name>
<url-pattern>/Error/*</url-pattern>
</servlet-mapping>
---------------------ServletContext---------------------
上下文:web容器启动的时候,它会为每个web程序都创建一个对应的servletcontext对象,代表当前应用
功能一):保存数据
上下文中放置数据:
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取上下文对象
ServletContext servletContext = this.getServletContext();
String username = "wang" ;
servletContext.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
取出上下文中保存的数据
public class getServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext01 = this.getServletContext();
String username = (String) servletContext01.getAttribute("username");
//网页编码的设置,避免乱码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("姓名是"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
XML中servlet配置:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>gerServlet</servlet-name>
<servlet-class>com.wang.servlet.getServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gerServlet</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
功能二):获取初始化参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String s = servletContext.getInitParameter("url");
resp.getWriter().print(s);
}
<servlet-mapping>
<servlet-name>Demo03</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>
功能三):请求转发
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//转发的请求路径
servletContext.getRequestDispatcher("/test").forward(req,resp);
System.out.println("这里走的其实是转发路径,这里根本不是Demo03");
}
<servlet>
<servlet-name>Demo04</servlet-name>
<servlet-class>com.wang.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo04</servlet-name>
<url-pattern>/forward</url-pattern>
</servlet-mapping>
转发跟重定向:
转发虽然页面转向了第三方页面,但是实际地址不会变
功能四):读取资源文件
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(inputStream);
String str1 = properties.getProperty("username");
String str2 = properties.getProperty("password");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("<h1>您当前用户是'"+str1+"',您的密码是'"+str2+"'。</h1>");
}
要注意:这里读取的配置文件路径是根据IDEA编译后的,properties文件所在位置,而不是正在开发过程中的位置
一定要先编译一下,查清它的位置,一般写在resources文件夹里的配置文件最后都是被放在了/WEB-INF/classes/下,这个文件的位置统一称为classpath