一、Oracle
1.oracle数据库创建用户
因为hr用户里面已经有很多表了,新建的项目会跟以前的表冲突,我们可以创建一个新用户,来做新项目,这样新项目跟老项目的表就不会冲突了。
--创建出王五用户,密码为王五,需要注意,新创建的用户不能登录到系统中。因为没有权限。
create user wangwu identified by wangwu;
--给wangwu赋权,赋了connect和resource权利
grant connect,resource to wangwu;
二、JDBC
1.事务控制使用条件:单纯的查询可以不用设置 手动提交和事务回滚
public Person getOnePerson(Integer id) {
Connection conn = null;
try{
//1.创建连接
conn = JdbcUtil.getConn();
//2.设置手动提交
//conn.setAutoCommit(false);
//3.调用dao层方法
Person p = pdao.findOneById(id);
//4.事务提交
conn.commit();
return p;
}catch(Exception e){
//try {
//4.事务回滚
//conn.rollback();
//} catch (Exception e1) {
//throw new RuntimeException(e1);
//}
throw new RuntimeException(e);
}finally{
//5.释放资源
JdbcUtil.release(null, conn, null);
}
}
三、Servlet
1.描述forword和sendRedirect的区别。
1)forward:地址栏不变,转发页面和转发到的页面是同一次请求,共享request里面的数据,并且只能转同意web应用中的资源
2)senRedirect:地址栏发生改变,转发页面和转发到的页面是多次请求,不共享request里面的数据,但是可以访问站外资源。
四、JSP
1.<c:forEach>的几种遍历方式
<%
// 测试数据
User u1 = new User("tom", "111111");
User u2 = new User("jerry", "222222");
User u3 = new User("huxz", "333333");
List<User> list = new ArrayList<User>();
list.add(u1);
list.add(u2);
list.add(u3);
Map<String,User> map = new HashMap<String,User>();
map.put("cat", u1);
map.put("haozi", u2);
map.put("cto", u3);
request.setAttribute("list", list); // action存命名属性
request.setAttribute("map", map);
%>
1.对集合的遍历:
<!-- 集合遍历 -->
<c:forEach items="${requestScope.list }" var="user" varStatus="s">
${user.username }, ${user.password }, 循环状态:${s.count },${s.index },${s.first },${s.last }<br/>
</c:forEach>
2.对map的遍历:
<!-- map的遍历 -->
<c:forEach items="${requestScope.map }" var="m" varStatus="s">
${m.key},${m.value.username },${s.count }<br/>
</c:forEach><hr/>
3.简单for循环
<!-- 简单for循环 -->
<c:forEach var="i" begin="10" end="15" step="1" varStatus="s">
hello ${i } , 循环状态:${s.count }<br/>
</c:forEach>
2.Servlet中的三大作用域对象,并分别标明作用范围。
request
开始:client与server建立连接开始
结束:响应回cient结束
session:
开始:client向server发请求,第1次遇到getSession(true)
结束:超时、server停止、手动销毁
ServletContext:
开始:server启动
结束:server停止
3.JSP中的9个隐藏域对象
作用域对象(4个):pageContext request session application
响应相关(2个):response out
特殊(1个):exception
打酱油(2个):page config
4.JSP、Servlet中几个作用域的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHvnkqFt-1594618246966)(C:\Users\Wang Yuheng\Desktop\Myfile\arduino\截图_2020-04-03_11-28-53.png)]
五、struts2
1.简述Struts2的核心过滤器(前端控制器)的主要作用
StrutsPrepareAndExecuteFilter主要作用有2个: struts2框架和启动初始化相关工作、对client的所有请求进行处理
2.简述Struts2的action控制器和servlet控制器的主要区别(至少3个)
action控制器 | servlet控制器 |
---|---|
实现Action或继承ActionSupport | 实现Servlet接口或继承HttpServlet |
配置struts.xml用action标签 | 配置web.xml用servlet和servlet-mapping标签 |
多例 | 单例 |
效率低 | 效率高 |
多线程中数据安全 | 多线程中数据不安全 |
自动解决post的utf-8 | 自己写代码、filter |
3.简述Action程序成员变量的作用有哪些
1>使用成员变量自动收参,获取client请求数据
2>替换request作用域
4.Struts2中是如何收集客户端参数的,具体有哪些形式及使用注意事项
struts2使用成员成量自动收参,具体有3种形式: |
---|
①使用零散数据:请求参数名 和 成员变量名 必须相同 |
②对象形式: 请求参数名是 对象名.属性名 |
③数组或集合: 用于对复选框收参,即可以是零散数据也可以是对象形式 |
5.struts2中的跳转方式有哪些,分别是什么?
4种,
1> action-->jsp
转发: <result name="" type="dispatcher">
重定向:<result name="" type="redirect">
2> action-->action
转发: <result name="" type="chain">
重定向:<result name="" type="redirectAction">
六、 MyBatis
1.拦截器
(一)、自定义拦截器
public class LoginInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation ai) throws Exception {
Admin adminDB = (Admin) ServletActionContext.getRequest().getSession().getAttribute("adminDB");
if (adminDB != null){
ai.invoke();//放行
return null;
}
return "login";
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VG4qGmGE-1594618246975)(C:\Users\Wang Yuheng\AppData\Roaming\Typora\typora-user-images\image-20200618094904883.png)]
(二)、配置拦截器struts.xml
<package name="person" extends="struts-default" namespace="/person">
<interceptors>
<!-- 声明拦截器 -->
<interceptor name="i1" class="com.wyh.interceptor.LoginInterceptor"></interceptor>
</interceptors>
<!-- 整合:添加,修改,刪除,批量刪除,查所有,查一个 -->
<action name="*" method="{1}" class="com.wyh.action.PersonAction">
<!-- 引用拦截器 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="i1" />
<result name="queryByPageJsp" type="dispatcher">/jsp/queryByPage.jsp</result>
<result name="updateQueryPersonDetailJsp" type="dispatcher">/jsp/updateQueryPersonDetailJsp.jsp</result>
<result name="queryByPage" type="redirectAction">queryByPage</result>
<result name="queryPersonDetailJsp" type="dispatcher">/jsp/queryPersonDetailJsp.jsp</result>
<result name="catchError">/NotFound.html</result>
</action>
</package>
2.使用插件进行分页
mybatis为了简化分页的开发,提供了一个插件,可以简化分页的步骤。
具体用法:
-
引入mybatis的插件依赖。
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</version> </dependency>
-
在mybatis的配置文件中配置使用插件。
需要在mybatis-config.xml里面进行配置。下面的配置要写在实体类起别名和数据库连接信息之间。
<!-- 分页的插件 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins>
-
在dao中写一个查询全部的方法。
跟以前一样,没有区别。定义dao接口中的方法,为这个方法到mapper文件中进行配置。
-
在业务类中调用dao的方法,然后把结果封装到插件中的PageInfo里面。
public class TeaServcieImpl implements TeaService { @Override public PageInfo<Tea> selectByPage(int curPage, int pageSize) { //通过PageHelper设置要查询的页的信息。 PageHelper.startPage(curPage, pageSize); SqlSession session = MyBatisUtil.openSession(); TeaDao td = session.getMapper(TeaDao.class); List<Tea> teaList = td.selectTea(); //把查询到的集合放入到PageInfo里面 PageInfo<Tea> pi=new PageInfo<>(teaList); MyBatisUtil.close(session); return pi; } }
PageInfo里面有分页的所有信息,我们可以通过pageInfo获取想要的数据。
public void testSelectAll() { TeaService ts=new TeaServcieImpl(); PageInfo<Tea> pi = ts.selectByPage(1, 10); List<Tea> list = pi.getList(); list.forEach(System.out::println); //获取总页数 int totalPage=pi.getPages(); System.out.println(totalPage); System.out.println("下一页的页号:"+pi.getNextPage()); System.out.println("是否有下一页:"+pi.isHasNextPage()); System.out.println("总条数:"+pi.getTotal()); }