1、idea 创建 web 工程
- 创建一个普通工程
- 打开项目结构
- apply
- 将项目部署到 tomcat 里:
注:
- localhost本地服务器的地址
- 8080:本地服务器的端口号
- qy174_web03表示项目部署的上下文名称
- main.html:本地项目的资源名称
2. 设置默认首页:
- 找到 web.xml
- 增加代码
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
3. 动态网页
3.1. 什么是动态网页?
所谓动态网页,是指跟静态网页相对的一种网页编程技术。
静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改html页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。值得强调的是,不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。总之,动态网页是基本的html语法规范与Java、VB、VC等高级程序设计语言、数据库编程等多种技术的融合,以期实现对网站内容和风格的高效、动态和交互式的管理。因此,从这个意义上来讲,凡是结合了HTML以外的高级程序设计语言和数据库技术进行的网页编程技术生成的网页都是动态网页。
动态网页就是结合和java编程和数据库技术。而且动态网页中可以插入java代码。常用的动态网页
jsp,freemark,thymeleaf等这些都是常用的动态网页技术。 而我们这里主要讲解jsp.
3.2. 什么是 jsp
jsp 【Java server page】 Java 服务器网页。该网页经过服务器tomcat编译产生java代码.而且里面可以插入java代码。
3.3. jsp 中如何插入 Java 代码
<%
java 语法的代码
%>
3.4. Java 输出内容到网页中
有两种方式:
方式一、
<body>
<%
//这里定义的变量整个页面都可以使用
int a=15;
int b=15;
int c=a+b;
out.println("c=========="+c+" <br>");
out.println("a=========="+a);
%>
</body>
方式二、
<body>
c=================<%=c%><br>
a=================<%=a%>
</body>
4. 接收参数
表单提交和超链接传递参数时,我们需要接受传递过来的参数内容。并完成相应的业务功能。servlet中封装了HttpServletRequest类,该类可以操作所有的请求内容。而在jsp中内置了该类的对象request。[内置表示无需自己创建该类对象。就可以使用该类中的方法]
4.1. 接收表单数据
将 register 内容提交到 registerDo 中
<%--action:表单提交的路径 method:表单的提交方式--%>
<form action="registerDo.jsp" method="post">
账号:<input type="text" name="zh"/><br>
密码:<input type="text" name="pwd"/><br>
介绍:<textarea rows="3" cols="20" name="desc"></textarea><br>
国家:<select name="country">
<option>china</option>
<option>USA</option>
<option>JAPANESE</option>
</select><br>
性别:<input type="radio" name="sex" value="man">男
<input type="radio" name="sex" value="woman">女<br>
爱好:<input type="checkbox" name="hobby" value="swing"/>游泳
<input type="checkbox" name="hobby" value="reading"/>读书
<input type="checkbox" name="hobby" value="running"/>跑步<br>
<input type="submit" value="注册"/>
</form>
<%
//内置HttpServletRequest的对象
//接受请求的参数值
String zh=request.getParameter("zh");
String pwd = request.getParameter("pwd");
String desc = request.getParameter("desc");
String country = request.getParameter("country");
String sex = request.getParameter("sex");
//多选框--用getParameter只能拿到一个值。
// String hobby = request.getParameter("hobby");
String[] hobby = request.getParameterValues("hobby");
out.print("账号:"+zh+";密码:"+pwd+";介绍:"+desc+";国家:"+country+";性别:"+sex+";爱好:"+ Arrays.toString(hobby));
%>
注意:
如果获取的是复选框的值,使用getParamaterValues()方法.单选框必须给定value值,否则拿到的是on
如果idea无法在jsp中使用内置对象。
在web-inf下创建一个目录lib
放入jsp和servlet的jar包(包在 tamcat 的 lib 目录下 要添加到库)
(以后所有的 jar 包都要放到 WEB-INF 下面的 lib)
4.2. 解决中文乱码问题
当表单输入的内容为中文时,接受时出现了乱码文件。
调用request中setCharacterEncoding("utf-8")
而且要在最前面一开始就调用
4.3. 超链接传递参数
地址?key=value&key=value
<a href = "a.jsp?n=cet4&a=441">连接传参</a>
<body>
<%
//设置请求编码
request.setCharacterEncoding("utf-8");
//接受参数
String n= request.getParameter("n");
String a= request.getParameter("a");
out.println("n==========="+n+";a========="+a);
%>
</body>
5. 页面跳转
<body>
<%
String error = request.getParameter("error");
if("1".equals(error)){
out.print("<font color='red'>账号或密码错误</font>");
}
%>
<form action="loginDo.jsp" method="post">
账号:<input type="text" name="name"/>
密码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
<input type="button" value="注册"/>
</form>
</body>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
//代码写死了。
out.print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
if("admin".equals(name)&&"123".equals(password)){
//登录成功--response响应对象 sendRedirect("跳转的路径")
response.sendRedirect("main.html");
}else{
response.sendRedirect("login.jsp?error=1");
}
%>
</body>
6. jsp + dao
<%
String error = request.getParameter("error");
if("1".equals(error)){
out.print("<font color='red'>账号或密码错误</font>");
}
%>
<form action="loginDo.jsp" method="post">
账号:<input type="text" name="name"/>
密码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
<input type="button" value="注册" onclick="register()"/>
</form>
</body>
<script>
function register() {
location.href='register.jsp';
}
</script>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
//创建一个UserDao类对象: test测试主函数中内容一样。
UserDao userDao=new UserDao();
//调用里面的方法
User user = userDao.selectByNameAndPwd(name, password);
if(user!=null){
//登录成功
response.sendRedirect("success.jsp");
}else{
response.sendRedirect("login.jsp");
}
%>
</body>
在用❓传参数时如果是中文的话,会无法传递这时候用:
response.sendRedirect("success.jsp?username="+
java.net.URLEncoder.encode(username,"utf-8"));
7. session
什么是 session?
session对象表示浏览器与服务器交互的一个容器,该容器用于存放当前会话【登录者】的信息。
session容器中内容保存周期默认为30分钟,获取浏览器关闭。
session中里面常用的方法:
setAttribute(key,value); 往session会话中保存信息
getAttribute(key): 从session会话中获取指定的信息
removeAttribute(key): 从session会话中移除指定的信息
7.1. jsp 的 9 大内置对象
- out: 输出对象
print()输出方法
- request:请求对象
getParameter("参数名"): 接受请求的参数
setCharacterEncoding("编码"): 设置编码
getParameterValues(""): 接受数组参数值
getSession(): 获取session会话对象
getRemoteAddr(): 获取远程访问者的ip地址
getContextPath(): 获取上下文路径
- response:响应对象
sendRedirect("路径"):重定向到指定路径
- session:会话对象
setAttribute(key,value); 往session会话中保存信息
getAttribute(key): 从session会话中获取指定的信息
removeAttribute(key): 从session会话中移除指定的信息
- page:网页对象
每个网页都有一个page对象类似于this对象。
- pageContext:网页上下文对象
保存数据 只在当前页面有效
setAttribute(key,value); 往session会话中保存信息
getAttribute(key): 从session会话中获取指定的信息
removeAttribute(key): 从session会话中移除指定的信息
- config:配置对象
获取网页一些相关的配置
- exception:异常对象
异常对象Throwable。它只能再错误页面使用。
- application:应用对象
它是应用对象。里面保存的数据整个服务器都有效。只要服务器不重启就一直存在
变量名 | 真实类型 | 作用 |
pagecontext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpservletRequest | 一次请求访问的多个资源(转发) |
session | Httpsession | 一次会话的多个请求间 |
application | servletcontext | 所有用户间共享数据 |
response市 | HttpservletResponse | 响应对象 |
page | object | 当前页面(servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | Servletconfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
7.2. 页面的跳转
- 重定向跳转: redirect response.sendRedirect("地址")
- 请求转发跳转:forward request.getRequestDispatcher("地址").forward(req,resp)
7.2.1. 重定向:
发送了两次请求,地址栏显示最后一次请求的地址
7.2.2. 转发
发送一次请求,地址栏,不会改变,还是最初的请求地址
7.3. 四大域对象
这四个对象可以存放内容,但他们的有效期不同;
pageContext 有效期当前页面有效
request 有效期同一个请求有效(重定向无效转发有效)
session 有效期同一个会话有效
application 有效期同一个应用(只要服务器不重启就一直有效)
有效期越长越占用内存资源。 后期使用最多的是request和session.
session使用再保存当前用户信息
request:只能再转发的页面使用
7.4. EL 表达式
语法:${scope.key} 获取指定域中保存的数据
简写: ${key} 默认从PageContext扫描,如果找到对应的key则不会扫描了。扫描request对象中不存在,继续扫描session。
<!--注册过滤器-->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.ykq.filter.MyFilter</filter-class>
</filter>
<!--过滤规则-->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--
/*:表示拦截所有的请求
/views/*: 只拦截包含views/资源
/*.do: 拦截请求后缀未.do资源
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
8. 编码过滤器
public class EncodingFilter implements Filter {
private String encoding="gbk";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化---只会执行一次
encoding=filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(encoding); //ISO-8859-1 java源码一旦写完就无法修改
servletResponse.setCharacterEncoding(encoding);
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
//销毁方法--当服务器重启或关闭时
}
}
使用 web.xml 方式
<!--注册过滤器-->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.ykq.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!--过滤规则-->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--
/*:表示拦截所有的请求
/views/*: 只拦截包含views/资源
/*.do: 拦截请求后缀未.do资源
-->
<url-pattern>/*</url-pattern>
</filter-mapping>