JavaWeb
-
get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址显示数据内容,不安全,但是高效
-
post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址显示数据内容,安全,但不高效
-
删除Maven的src文件,构建一个主工程,可以再里边新建Module子文件,聚合模块项目,这样父pom.xml配置过得子模块可以直接使用
-
编写Servlet的映射:我们写的是java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以需要在web服务中注册我们写的Servlet,还需给它一个浏览器能够访问到的路径
<!--注册的servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.juntao.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
//固有的映射路径优先级最高,如果找不到就会走默认的处理请求 /*请求最先执行
- Servlet是由Web服务器调用,web服务器在收到浏览器请求之后
ServletContext
web容器在启动的时候,它会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用,它在所有Servlet之上,是由web容器创建的
共享数据:在这个Servlet中保存的数据(例如:账号信息),可以在另外一个Servlet中获取,它提供了最简单的Servlet之间通信的方式
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
//获取ServletContext对象
ServletContext context = this.getServletContext();
String name = "zjt";
//将数据存入ServletContext中,key为name,值为name
context.setAttribute("name",name);
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//源码 public Object getAttribute(String name);用的String所以强转一下
//HelloServlet存入了name的值,GetServlet才能取得到,否则先访问get结果为 名字null
String name = (String)servletContext.getAttribute("name");
//将编码方式和字符集更改
resp.setContentType("text/html;charset=utf-8");
//调用getWriter.print喷到页面上
resp.getWriter().print("名字"+name);
}
<servlet>
<servlet-name>hello</servlet-name><!--请求name-->
<servlet-class>com.juntao.servlet.HelloServlet</servlet-class><!--请求class-->
</servlet>
<servlet-mapping> <!--请求路径-->
<servlet-name>hello</servlet-name><!--请求name-->
<url-pattern>/hello</url-pattern><!--请求url-->
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.juntao.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
请求转发
public class ServlerDome02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了ServlerDome02");
ServletContext context = this.getServletContext();
//转发的请求路径,和调用forward实现请求转发
context.getRequestDispatcher("/url").forward(req,resp);
}
}
重定向
web资源B收到客户端A的请求后,它会通知A客户端去访问另一个web资源C,这个过程叫做重定向
//重定向,状态值302
resp.sendRedirect("/r/hello");
重定向和转发的区别在于,页面都会实现跳转,不同点在于,请求在转发的时候,url不会产生变化,重定向时候,url地址栏会发生变化
保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中!
常见场景:网站登录之后,下次不用再登录了,第二次访问直接就上去了!
Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
1.Cookie[] cookies = req.getCookies();//获得cookie
2.cookie.getName()//获取cookie中的key
3.cookie.getValue()//获取cookie中的值
4.new Cookie("lastLoginTime", System.currentTimeMillis() + "");//新建一个cookie
5.cookie.setMaxAge(24*60*60);//设置cookie有效期
6.resp.addCookie(cookie);//响应给客户端一个cookie
cookie一般会保存在本地的用户目录下appdata;
Session
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没关闭,这个Session就存在
- 用户登录之后,整个网站它都可以访问!–>保存用户的信息;保存购物车的信息……
- 在整个网站中,经常会使用的数据,我们将它保存在Session中
Session和Cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码
resp.setContentType("text/html;charset=utf-8");
//得到一个session
HttpSession session = req.getSession();
//存入session
session.setAttribute("name","zjt");
//获取s的id
String sessionid = session.getId();
//判断是不是新创建的s
if (session.isNew()){
resp.getWriter().write("session创建成功,ID为:"+sessionid);
}else {
resp.getWriter().write("session已经在服务器存在了,ID为:"+sessionid);
}
//s创建时候做了什么事情
// Cookie cookie = new Cookie("JSESSIONID",sessionid);
//resp.addCookie(cookie);
}
//得到Session
HttpSession session = req.getSession();
Entity entity = (Entity) session.getAttribute("name");
HttpSession session = req.getSession();
//移除属性
session.removeAttribute("name");
//手动注销session
session.invalidate();
会话自动过期:web.xml配置
<!--设置session的自动过期,默认失效时间-->
<session-config>
<!--以分钟为单位-->
<session-timeout>15/session-timeout>
</session-config>
JSP
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换为一个Java类!
JSP本质上就是一个Servlet
public void _jspInit() {
} //初始化
//销毁
public void _jspDestroy() {
}
//JSPservlet
public void _jspService(HttpServletRequest request,HttpServletResponse response)
1.判断请求
2.内置一些对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前
HttpServletRequest request //请求
HttpServletResponse response //响应
在JSP页面中,只要是JAVA代码就会原封不动的输出,如果是HTML代码,就会被转换为:out.write("\r\n"),这样的格式,喷到前段
常用作用域
保存的数据只在一个页面中有效
pageContext.setAttribute("name","zjt");
保存的数据只在一次请求中有效,请求转发会携带这个数据
request.setAttribute("name","zjt2");
保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
session.setAttribute("name","zjt3");
保存的数据只在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name","zjt4");
request:客户端向服务器发送的请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送的请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送的请求,产生的数据,一个用户用完了,其他用户还可能使用
MVC
过滤器Filter
Filter:过滤网站数据,处理中文乱码,登陆验证…
import javax.servlet.*;//这个包的过滤器
public class Filter01 implements Filter {
//过滤器随着web服务器一起初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前...");
//让请求继续向下执行,如果不写,程序到这里就被拦截停止
chain.doFilter(request,response);
System.out.println("CharacterEncodingFilter执行后...");
}
//web服务器关闭时,过滤器随着销毁
public void destroy() {
System.out.println("销毁");
}
}
<filter>
<filter-name>Filter01</filter-name>
<filter-class>com.zjt.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter01</filter-name>
<!--只要是/servlet下的任何请求经过都会被过滤-->
<url-pattern>/servlet/*</url-pattern>
<!--<url-pattern>/*</url-pattern>-->
</filter-mapping>