如有不会见chap2老师文件与视频文件
前台发送请求的三种方式
<body>
<p>前台发送请求的方式1:通过超链接</p>
<a href="http://www.baidu.com">指向互联网资源</a>
<a href="index.html">指向项目内部的页面资源</a>
<a href="/xxx">指向项目内部的Java资源</a>
<hr>
<p>前台发送请求的方式2:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>
<hr>
<p>前台发送请求的方式3:通过表单</p>
<form action="index.html" method="post">
账号:<input type="text" name="username"><br>
<input type="submit" value="提交">
</form>
<script>
document.getElementById("btn").onclick = function (){
location.href = "index.html";//本质依然是超链接
}
</script>
后台如何接受前台发出的请求---Servlet创建方式
<body>
<p>后台如何获取前台发来的请求</p>
<p>答:通过tomcat提供的Servlet类来实现</p>
<p>什么是Servlet:处理前台请求的一个类</p>
<p>如何去创建Servlet:</p>
<p>1.导入jar包---servet-api.jar 在tomcat的lib目录里面</p>
<p>2.在servlet的包下创建一个Servlet的类</p>
<p>2.1 Servlet的命名规范: XxxServlet 其中Xxx表示什么功能的Servlet </p>
<p>3.继承HttpServlet</p>
<p>4.重写父类的service方法,然后把默认的super删除</p>
<p>5.在类上添加@WebServlet("/Xxx") 注解。表示前台通过什么请求路径访问该类
一般和类名同名</p>
<p>测试如下Servlet</p>
<a href="/TestServlet">通过超链接访问Servlet</a>
<button id="btn">通过JS访问Servlet</button>
<script>
document.getElementById("btn").onclick = function (){
location.href = "/TestServlet";
}
</script>
</body>
前台如何发送带有数据的请求
<body>
<p>前台发送携带数据的请求的方式1:通过超链接</p>
<p>语法如下:在URL地址的后面加上?key=value&key=value&key=value的形式即可</p>
<p>注意事项:都是英文状态下的符号,如果含有中文的内容 也无需加引号</p>
<a href="index.html?id=123&name=张三">指向互联网资源</a>
<hr>
<p>前台发送携带数据的请求的方式1:通过JS</p>
<button id="btn">点击按钮发送一个请求</button>
<hr>
<p>前台发送请求的方式3:通过表单</p>
<p>注意事项:内部的表达元素都要加上name来修饰。因为后台都是通过name来获取值</p>
<p>注意事项:单选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:多选框:加上若干个相同的name即可,记得补充value</p>
<p>注意事项:下拉框:内部的option的value值可以省略的,但是你要知道
如果省略了以option标签的内部为准。如果没省略就以value为准</p>
<form action="/RegServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:
<input type="radio" name="sex" value="男" checked >男
<input type="radio" name="sex" value="女" >女<br>
爱好:
<input type="checkbox" name="likes" value="吃">吃
<input type="checkbox" name="likes" value="喝">喝
<input type="checkbox" name="likes" value="玩">玩
<input type="checkbox" name="likes" value="乐">乐
<br>
地址:
<select name="address">
<option>湖南</option>
<option value="123广东~">广东</option>
<option>云南</option>
</select> <br>
自我介绍:
<textarea name="jieshao">自我介绍:</textarea>
<br>
生日:<input type="date" name="birthday"><br>
<input type="submit" value="提交">
</form>
<script>
document.getElementById("btn").onclick = function (){
location.href = "index.html?id=456";//本质依然是超链接
}
</script>
</body>
后台如何接受前台的数据
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受数据的流程:
//1.设置编码
req.setCharacterEncoding("utf-8");
//收集单独独立的数据,例如账号密码性别年龄生日自我介绍等等
//xxx表示前台的参数名是什么 接受返回值全是String 需要自行转换
// String xxx = req.getParameter("xxx");
//收集多个数据:例如爱好 需要遍历 来一一取值
// String[] xxx = req.getParameterValues("xxx");
String username = req.getParameter("username");
System.out.println("账号为" + username);
String password = req.getParameter("password");
System.out.println("密码为" + password);
String sex = req.getParameter("sex");
System.out.println("sex为" + sex);
String[] likes = req.getParameterValues("likes");
String l = "";
for (int i = 0;i<likes.length;i++){
if(i==likes.length-1){
l = l + likes[i] ;
}else{
l = l + likes[i] + ",";
}
}
String birthday = req.getParameter("birthday");
System.out.println("birthday为" + birthday);
String address = req.getParameter("address");
System.out.println("address为" + address);
String jieshao = req.getParameter("jieshao");
System.out.println("jieshao为" + jieshao);
UserInfoDao ud = new UserInfoDao();
Userinfo userinfo = new Userinfo(null,username,password,sex , l ,address,jieshao,birthday);
boolean b = ud.regUserinfo(userinfo);
System.out.println(b);
}
}
实现用户注册基础版
实现用户注册进阶版
关于Web项目的缓存
web项目是存在缓存问题的:好处就是节省流量节省加载时间。
web项目是存在缓存问题的:坏处就是无法得到理想的正确的结果
Web缓存存在的两个地方 : 1.浏览器内部--更多工具--清除浏览数据
Web缓存存在的两个地方 : 2.idea项目内部的out目录(加载web项目的缓存目录)
演示servlet的生命周期
不会见chap3(更新版)
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
UserDao ud = null;
@Override
public void init() throws ServletException {
ud = new UserDao();
System.out.println("我被创建了,只会执行一次");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进来了");
//servlet的生命周期:
// 1.初始化调用init方法 只会执行一次 自动执行
// 2.执行 调用service方法,调用几次执行几次 需要手动调用
// 3.消亡调用destory方法 只会执行一次 自动执行 没啥用,一般是项目停止自动执行。
ud.say();
}
@Override
public void destroy() {
System.out.println("我死了");
}
}
演示servlet的跳转
servlet的跳转:
1.可以从servlet跳转到另外一个servlet(删除数据之后返回到刷新查询servlet)
2.可以从servlet跳转到前台页面(注册成功返回登录页面)
有两种方式: <br>
<a href="BServlet">通过转发跳转</a><br>
<a href="CServlet">通过重定向跳转</a><br>
转发跳转: 只需1次请求即可完成 效率高 URL地址不会改变 例如从B转发到A URL地址依然是B <br>
重定向跳转: 只需2次请求即可完成 效率低 URL地址会改变 例如从B定向到A URL地址就是A<br>
总结:能用转发就用转发。但是以下情况不推荐:涉及到敏感操作一定不能使用转发,
涉及到注册操作.涉及到增删改都推荐使用重定向
备注:超链接本质就是重定向跳转
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Bservlet");
//转发跳转:
// req.getRequestDispatcher("AServlet").forward(req,resp);
req.getRequestDispatcher("index.html").forward(req,resp);
}
}
演示转发跳转的弊端
演示重定向跳转
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Cservlet");
//重定向跳转:
// resp.sendRedirect("xxx");
resp.sendRedirect("index.html");
}
}
演示Servlet的四大作用域
<h3>Servlet的四大作用域</h3>
<p>有些情况下:我们需要实现后台servlet的数据共享(先掌握这里)</p>
<p>有些情况下:我们需要实现后台servlet和前台页面的数据共享(暂时不讲解)</p>
<p>比如:后台查询到了数据 需要丢给前台去渲染</p>
<p>四大作用域:pageContext < request < session < application </p>
<p>pageContext作用域:仅在当前页面有效,只要页面发生了跳转就失效。 所以不用</p>
<p>request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效,所以切忌使用重定向跳珠</p>
<p>session作用域:重点掌握:作用域一次回话有效。(浏览器打开到关闭为一次回话)</p>
<p>application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量</p>
request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效
@WebServlet("/FServlet")
public class FServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效
//如何存储数据 注意key要保证唯一,否则会被覆盖
// req.setAttribute("key","aa");
req.setAttribute("username","张三");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}
session作用域:重点掌握:作用域一次会话有效。浏览器关闭就失效
@WebServlet("/GServlet")
public class GServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// session作用域:重点掌握:作用域一次会话有效。浏览器关闭就失效
//如何存储数据 注意key要保证唯一,否则会被覆盖
//1.获取session对象
HttpSession session = req.getSession();
//2.存值
session.setAttribute("username","李四");
//简写req.getSession().setAttribute("aa,","xx");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}
application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量
@WebServlet("/HServlet")
public class HServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量
//如何存储数据 注意key要保证唯一,否则会被覆盖
//1.获取application对象
ServletContext context = req.getServletContext();
//2.存值
context.setAttribute("username","王五");
req.getRequestDispatcher("ZServlet").forward(req,resp);
// resp.sendRedirect("ZServlet");
}
}