web应用程序:可以提供浏览器访问的程序
*.htm, *.html 这些都是网页的后缀,如果服务器上一直=存在这些东西,我们就可以直接读取。通络:
静态web存在的缺点
web页面无法动态更新,所有用户看到的都是同一个页面
他无法和数据库交互(数据无法持久化,用户无法交互)
缺点
优点
新手村:---------->魔鬼训练----->PK场
ASP
PHP
JSP/Servlet
B/S:浏览器和服务器
C/S:客户端和服务器
IIS
微软的:ASP.......Windows
tomcat
你可能遇到的问题:
可以配置的端进号:
可以配置的主机名;
默认主机名:localhost-->127.0.0.1
默认网站存放位置webapps
<host name="www.localhost.com" appbase="webapps" unpackWARs="true" autoDeploy="true"
高难度面试题
请你谈谈网站是如何进行访问的;
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。
https:安全的
http1.0
http2.0
客户端-------->发送请求(Request)-------服务器
百度:
Request URL: https://sm.bdimg.com/static/wiseindex/img/favicon64.ico //请求地址 Request Method: GET //get/post方法 Status Code: 200 //状态码 200 代表ok Remote (远程)Address: 123.52.189.49:443 Host:主机名
Accept :告诉浏览器,它所支持的数据类型 Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accpet-language:告诉浏览器,他的语言环境 Cache-Control:缓存控制 Connection:告诉服务器,请求完成是断开还是保持链接
百度:
cache-control: max-age=2592000 //缓存控制 content--Encoding:gzip // 编码 content-type: image/x-icon //类型 connection:keep-Alive //连接
Accept :告诉浏览器,它所支持的数据类型 Accept-Encoding:支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accpet-language:告诉浏览器,他的语言环境 Cache-Control:缓存控制 Connection:告诉服务器,请求完成是断开还是保持链接 HOST:主机。。。。/。。。 Refresh:告诉客户端,多久刷新一次 Location:让网页重新定位;
200:请求响应成功
3**:请求重定向
4xx:找不到资源 404
5xx:服务器代码错误 500 502:网关错误
常见面试题:当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
在JavaWeb开发中,需要使用大量Jar包,我们手动导入;
如何能够让jar包只自动导入和配置
我们目前就是用来方便导入Jar包的
Maven的核心是思想:约定大于配置
Maven会规定好你改如如何编写Java代码,必须按照这个规范;
下载后解压即可
<mirror> <id>nexus-aliyun</id> <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
在Maven安装目录创建maven-repo文件
并在配置文件中指向该文件;
<localRepository>E:\Maven\apache-maven-3.8.1\maven-repo</localRepository>
Maven约定大与配置,我们之后可能会遇到我们写的配置文件,无法导出或者生效的问题,解决方案
<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> </build>
把实现了Servlet接口的Java程序叫做Servlet
构建一个普通的Maven项目,删掉里面的src目,以后我们学习就在这个项目建立moudel;这个空的工程就是Maven的主工程
关于Maven父子工程的理解:
在父项目中有
<modules> <module>lession-1</module> </modules>
在子项目中有
<parent> <artifactId>JavaWebBilibili</artifactId> <groupId>com.cxp</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java项目子项目可以直接使用
servlet是由web服务器调用,web服务器在收到浏览器请求后,会:
一个servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
一个Servlet可以指定多个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>hello/*</url-pattern> </servlet-mapping>
一个Servlet可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
一个Servlet可以指定的前缀
注意
可以在自定义后缀实现请求映射
*的前面不能加项目映射的路径“/”
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.cxp</url-pattern> </servlet-mapping>
优先级问题
指定了固定的映射路径优先级最高,如果找不到就会走默认的处理请求
web容器在启动时,他会为每个web程序都创建一个 对应的ServletContext对象,它代表了当前的web应用
我在这个Servlet中的数据可以在另一个servlet中使用
web.xml的配置
<context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/ssm</param-value> </context-param>
servlet的内容
ServletContext context=this.getServletContext(); String url = context.getInitParameter("url"); resp.getWriter().println(url);
ServletContext context=this.getServletContext(); /*RequestDispatcher getinit = context.getRequestDispatcher("getinit");//转发的请求路径 getinit.forward(req,resp);//调用forward方法实现请求转发*/ context.getRequestDispatcher("getinit").forward(req,resp);
Properties
发现:都被打包在同一个路径下:calsses,我们俗称这个路径为classpath
思路:需要一个文件流
username=root password=990901cxp..
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/aa.properties"); Properties props = new Properties(); props.load(is); String username = props.getProperty("username"); String password = props.getProperty("password"); resp.getWriter().println(username); resp.getWriter().println(password); }
访问测试即可
web服务器接受到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象。代表响应的httpServletresponse对象
1、简单分类
ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException;
void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setDateHeader(String var1, long var2); void addDateHeader(String var1, long var2); void setHeader(String var1, String var2); void addHeader(String var1, String var2); void setIntHeader(String var1, int var2); void addIntHeader(String var1, int var2);
int SC_CONTINUE = 100; int SC_SWITCHING_PROTOCOLS = 101; int SC_OK = 200; int SC_CREATED = 201; int SC_ACCEPTED = 202; int SC_NON_AUTHORITATIVE_INFORMATION = 203; int SC_NO_CONTENT = 204; int SC_RESET_CONTENT = 205; int SC_PARTIAL_CONTENT = 206; int SC_MULTIPLE_CHOICES = 300; int SC_MOVED_PERMANENTLY = 301; int SC_MOVED_TEMPORARILY = 302; int SC_FOUND = 302; int SC_SEE_OTHER = 303; int SC_NOT_MODIFIED = 304; int SC_USE_PROXY = 305; int SC_TEMPORARY_REDIRECT = 307; int SC_BAD_REQUEST = 400; int SC_UNAUTHORIZED = 401; int SC_PAYMENT_REQUIRED = 402; int SC_FORBIDDEN = 403; int SC_NOT_FOUND = 404; int SC_METHOD_NOT_ALLOWED = 405; int SC_NOT_ACCEPTABLE = 406; int SC_PROXY_AUTHENTICATION_REQUIRED = 407; int SC_REQUEST_TIMEOUT = 408; int SC_CONFLICT = 409; int SC_GONE = 410; int SC_LENGTH_REQUIRED = 411; int SC_PRECONDITION_FAILED = 412; int SC_REQUEST_ENTITY_TOO_LARGE = 413; int SC_REQUEST_URI_TOO_LONG = 414; int SC_UNSUPPORTED_MEDIA_TYPE = 415; int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; int SC_EXPECTATION_FAILED = 417; int SC_INTERNAL_SERVER_ERROR = 500; int SC_NOT_IMPLEMENTED = 501; int SC_BAD_GATEWAY = 502; int SC_SERVICE_UNAVAILABLE = 503; int SC_GATEWAY_TIMEOUT = 504; int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2 、常见应用
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // 1. 要获取下载的文件路径 String realPath ="E:\\IDE\\JavaWebBilibili\\Respinse\\target\\classes\\1.jpg"; System.out.println("下载文件的路径"+realPath); // 2. 下载的文件名 String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3. 设置想办法让浏览器(conrtext-Disposition)能够支持下载我们需要的东西 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8")); // 4. 获取下载文件的输入流 FileInputStream fileIn = new FileInputStream(realPath); // 5. 创建缓冲区 int length=0; byte[] buffer = new byte[1024]; //6. 获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); // 7. 将FileOutputStream流写入到buffer缓冲区, 8. 使用OutputStream将缓冲区中的数据输出到客户端! while ((length=fileIn.read(buffer))>0){ out.write(buffer,0,length); } //关闭流 fileIn.close(); out.close(); }
验证码功能
验证码怎么来的
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //让浏览器几秒刷新一次 resp.setHeader("refresh","5"); //在内存中创造一个图片 BufferedImage image = new BufferedImage(500,200,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D peng = (Graphics2D) image.getGraphics();// 笔 //设置图片颜色 peng.setColor(Color.white); peng.fillRect(0,0,500,200); //给图片写数据 peng.setColor(Color.black); peng.setFont(new Font(null, Font.BOLD,30)); peng.drawString(makeNum(),200,50); //告诉浏览器这个请求用图片打开 resp.setContentType("image/jpeg"); //网站存在缓存,不让浏览器缓存 resp.addDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片给浏览器 boolean write = ImageIO.write(image, "jpg",resp.getOutputStream()); } //生成随机数 private String makeNum(){ Random random=new Random(); String num = random.nextInt(9999999) + ""; StringBuffer sb = new StringBuffer(); //判断数字是否为为7为不够用“0来拼接” for (int i=0 ;i < 7-num.length();i++){ sb.append("0"); } num = sb.toString() + num; return num; }
常见场景:
用户登录
void sendRedirect(String var1) throws IOException;v
面试题:请你聊聊重定向和转发的区别?
相同点:
不同点: