ログイン
如果出现は:错误时FlushMode.COMMIT / AUTOにあなたのセッションを回すか、トランザクション定義から「読み取り専用」のマーカーを削除します。操作は読み取り専用モード(FlushMode.MANUAL)で許可されていません書きます。
時間を変更、削除、データベースたら必要に応じて、ビジネス層でトランザクションを開く必要があります
1.休止構成ファイル内のトランザクションマネージャを設定し、トランザクションエンハンスメント(オープンコメント)
<!--配置事务管理器-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--开启注解 增强-->
<tx:annotation-driven transaction-manager="transactionManager"/>
2.ビジネスクラスに直接注釈を追加します。
@Transactional
public class CategoryServiceImpl implements CategoryService {
@Setter
private CategoryDao categoryDao;
@Override
public void addCategory(Category category) {
categoryDao.addCategory(category);
}
}
分類
正しいへのJSONのjarパッケージ
データ-IDを使用して=「」idが持ち越されてもよい場合、送信要求IDバインドボタン
<a href="#" class="updatebtn" data-id="<s:property value="#category.cid"/>">
<img class="img_icon" src="${pageContext.request.contextPath}/images/edit_icon.png" alt="">
</a>
アヤックス(フロントエンド技術)がウェブ層に要求を送信する使用
$.post("${pageContext.request.contextPath}/category/category_updateUI.action",{"cid":cid},function (data) {
},"json");
直接抽出層ウェブページ表示データ
//将取出的数据转化为json类型
JSONArray jsonArray = JSONArray.fromObject(oneCategory, jsonConfig);
System.out.println(jsonArray.toString());
//将数数据打印到页面
ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
ServletActionContext.getResponse().getWriter().println(jsonArray.toString());
データは直接JSONでデータを透過し、そのライン上で直接データを取るための時間を得ることができます
$.post("${pageContext.request.contextPath}/category/category_updateUI.action",{"cid":cid},function (data) {
console.log("-------json------");
console.log(data);
/!*把json数据展示到文本框 *!/
$("#parentid2").val(data[0].cparentid);
$("#cname2").val(data[0].cname);
},"json");
注:ボタンのIDは、のみ表現するときのidので、クラスを使用する際にイテレータを使用してマークを使用することはできません
<s:iterator value="categoryList" var="category">
<ul class="list_goods_ul">
<li><s:property value="#category.cparentid"/> </li>
<li><s:property value="#category.cname"/></li>
<li>
<a href="#" class="updatebtn" data-id="<s:property value="#category.cid"/>">
<img class="img_icon" src="${pageContext.request.contextPath}/images/edit_icon.png" alt="">
</a>
</li>
<li><a href="#"><img class="img_icon" src="${pageContext.request.contextPath}/images/delete_icon.png" alt=""></a></li>
</ul>
</s:iterator>
絶対パスを使用してスタイルのアドレス:$ {} pageContext.request.contextPath
記事
リレーショナルマッピング点を確立注意:外部キーは内部のドメインに対応する外部キーのオブジェクトを作成することも注意を払う必要があります
、多対多のか、設定ファイルで設定を取得、設定方法を説明するために、
private Integer article_id;
private String article_title;
private String article_content;
private Integer article_time;
private String article_pic;
private String article_desc;
//外键
private Category category;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.blog.domain.Article" table="article" >
<!--建立类属性哪一个是主键 还要跟数据库当中主键进行对象-->
<id name="article_id" column="article_id" >
<generator class="native"/>
</id>
<!--建立类中的普通属性与数据库当中字段进行关联-->
<property name="article_title" column="article_title" />
<property name="article_content" column="article_content"/>
<property name="article_time" column="article_time"/>
<property name="article_pic" column="article_pic"/>
<property name="article_desc" column="article_desc"/>
<many-to-one name="category" class="com.blog.domain.Category" column="article_cid"></many-to-one>
</class>
</hibernate-mapping>
注意点:
エラーが発生した場合:
org.hibernate.LazyInitializationException:プロキシ[com.blog.domain.Category#2]初期化できませんでした - いいえセッションを
セッションが発見されたエラーを報告しませんようにトランザクションがあるため、遅延ロードを使用するのでは、開閉時にビジネス層である、とのtoStringカテゴリプロパティで覆われているので
ソリューション:
<!--配置延迟加载-->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
トランザクションはまた、Web層で開かれているように、遅延読み込みフィルターを設定するファイルのweb.xml、注意を払う:フロントストラット内の設定のロードを遅延する必要性を
ページング
必要なデータ:現在のページ番号(currentPageに)ページには、データの断片(pageSizeを)の数を示します
総数の現在のページのクエリ添字(インデックス)(totalCountプロパティ)レコードポイントの総ページ数(TOTALPAGE)
現在のデータ(pageList)ページ
場所データベースクエリ=(currentPageに-1)*のpageSize
総ページ数= totalCountプロパティ* 1.0 / TOTALPAGEは切り上げ(切り上げ)
サンプルコード:
package com.blog.domain;
import java.util.List;
public class PageBean<T> {
/*当前页*/
private Integer currentPage;
/*一页有多少条数据*/
private Integer pageSize;
/*当前查询的角标*/
private Integer index;
/*总的记录数*/
private Integer totalCount;
/*总页数*/
private Integer totalPage;
/*当前页的数据*/
private List<T> pageList;
/*如果当前页没有设置,默认设置为第1页*/
public void setCurrentPage(Integer currentPage) {
if (currentPage == null) {
currentPage = 1;
}
this.currentPage = currentPage;
}
/*如果没有设置当前页总记录数据,设置默认记录数为一页5条*/
public void setPageSize(Integer pageSize) {
if (pageSize == null) {
pageSize = 5;
}
this.pageSize = pageSize;
}
/*计算当前页从数据库当中查询的位置*/
public Integer getIndex() {
return (currentPage-1)*pageSize;
}
/*计算总页数*/
public Integer getTotalPage() {
double ceil = Math.ceil(totalCount * 1.0 / pageSize);
return (int)ceil;
}
}
記事のページネーション注:
1. PageBeanを作成します。
2.アクションJSPアドレスを送信することによって、アクションメソッドを作成します。
3.web層は、ビジネス層、データ処理を呼び出し、オフラインクエリを作成し、パラメータを受け取り、データはスタックの値に書き込まれ、転送を要求します
public class ArticleAction extends ActionSupport implements ModelDriven<Article> {
@Override
public Article getModel() {
return article;
}
@Setter
private Article article;
@Setter
private ArticleService articleService;
public String list(){
List<Article> list = articleService.list();
ActionContext.getContext().getValueStack().set("list",list);
return "list";
}
public String add(){
System.out.println(article.getArticle_title());
return null;
}
@Setter
private Integer currentPage;
@Setter
private String keyWord;
public String pageList(){
//离线条件查询
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Article.class);
//添加查询条件这也是为什么要把离线条件查询直接写在web的原因
if (keyWord!=null){
detachedCriteria.add(Restrictions.like("article_title","%"+ keyWord+ "%"));
}
PageBean<Article> pageBean=articleService.getPageList(detachedCriteria,currentPage,5);
ActionContext.getContext().getValueStack().push(pageBean);
return "list";
}
}
pageBeanにプロパティ、クエリデータの呼び出しDAO層、ウェブ層のリターンを設定する4. pagebeanビジネス層
public PageBean<Article> getPageList(DetachedCriteria detachedCriteria, Integer currentPage, int pageSize) {
//设置数据,查询数据库
//1.设置当前页
pageBean.setCurrentPage(currentPage);
//2.设置一页显示的个数
pageBean.setPageSize(pageSize);
/* //3.设置数据库查询的位子
pageBean.setIndex(pageBean.getIndex());*/
//4.设置总的记录数 需要从数据库中查找
Integer totalCount=articleDao.getTotalCount(detachedCriteria);
pageBean.setTotalCount(totalCount);
//5.设置总页数
pageBean.setTotalPage(pageBean.getTotalPage());
//6.设置每页的数据 需要从数据库中查找
List<Article> pageList=articleDao.getTotalList(detachedCriteria,pageBean.getIndex(),pageBean.getPageSize());
pageBean.setPageList(pageList);
return pageBean;
}
ニーズに基づいて5.dao層は、ビジネス層にデータをチェックしてください
@Override
public Integer getTotalCount(DetachedCriteria detachedCriteria) {
//使用setProjection(Projections.rowCount());查询出总的记录数,别的数据不需要
//要注意的是查询出来的结果是一个Long类型的集合
detachedCriteria.setProjection(Projections.rowCount());
List<Long> list = ( List<Long>)this.getHibernateTemplate().findByCriteria(detachedCriteria);
if(list.size()>0){
return list.get(0).intValue();
}
return 0;
}
@Override
public List<Article> getTotalList(DetachedCriteria detachedCriteria, Integer index, Integer pageSize) {
//由于之前使用过 detachedCriteria.setProjection(Projections.rowCount());所以要把他里面的条件清空
//否者查询的还是之前的条件
detachedCriteria.setProjection(null);
List<Article> list = (List<Article>)this.getHibernateTemplate().findByCriteria(detachedCriteria, index, pageSize);
return list;
}
キーワード検索:
1. -----エコーので、リクエストが期限パラメータに行われるスタックの値に保存された非ルートゾーンパラメータのパラメータは、#記号でなければなりません
<input type="text" class="am-form-field" id="input_search" value="<s:property value="#parameters.keyWord"/>" />
データの実装を可能にするために2次------バインドパラメータを使用して、また、ウェブ層に渡されたパラメータをエコーする必要があり、次を見つけるためにページングすることができます
次のページを表示することができない何人も、クエリデータにつながりません
//分页
$("#page").paging({
pageNo:<s:property value="currentPage"/>,
totalPage: <s:property value="totalPage"/>,
totalSize: <s:property value="totalCount"/>,
callback: function(num) {
var keyWord = $("#input_search").val();
$(window).attr('location','${ctx}/article/article_pageList.action?currentPage='+num+"&keyWord="+keyWord);
}
});
開発者モード
<constant name="struts.devMode" value="true"></constant>
<package name="Article" extends="struts-default" namespace="/article">
<action name="article_*" class="articleAction" method="{1}">
<result name="list" >/mgr_main.jsp</result>
<allowed-methods>list,add,pageList</allowed-methods>
</action>
</package>
Strutsの開発者モードを開く必要の前のプラス
デバッグJSPを参照する必要がプラス
<s:debug></s:debug>
あなたは、デバッグデータ値が内部スタック参照してくださいするにはここをクリックすることができます
写真をアップロード
ステップ:
1.モニターリリースボタン
$("#send").click(function () {
$("#blog_form").submit();
})
2.設定フォームフォームフォームフォームは、背後のプロパティを(ファイルアップロードを)のenctype = "multipart / form-data" を追加します
<form id="blog_form" action="${pageContext.request.contextPath}/article/article_add.action" method="post" enctype="multipart/form-data">
</form>
3.処理ファイル内のアクションをアップロード
3.1ファイルのアップロード設定に必要な属性は、注射を来ました
@Setter
private String uploadFileName; // 文件名称
@Setter
private File upload; // 上传文件 upload 临时文件
@Setter
private String uploadContentType; // 文件类型
3.2アップロードファイルの処理方法を
public String add() throws IOException {
//上传图片
/* System.out.println(uploadFileName);
System.out.println(upload);
System.out.println(uploadContentType);*/
//1.判断文件临时文件是否存在
if (upload!=null){
/* 临时文件存在就开始处理*/
//2.设置文件的上传路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
/*对文件名称进行处理*/
/* 截取文件后缀名*/
//3.获取截取角标
int index = uploadFileName.lastIndexOf(".");
//4开始截取
String suffixName = uploadFileName.substring(index);
//5.生成随机的名字并去除里面的‘-’
String uuidFileName = UUID.randomUUID().toString().replace("-", "")+suffixName;
//6.判断上传路径是否存在,不存在就创建一个
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//7.上传文件
File dictFile = new File(path + "/" + uuidFileName);
FileUtils.copyFile(upload,dictFile);
}
return null;
}
ファイルアップロードの処理工程:
まず、(!= NULLをアップロード){}プロセスに存在する場合、ファイルが存在するかどうかを判断します
()getRealPath( "/アップロード")パスServletActionContext.getServletContext 2.設定ファイルをアップロードします;
3.ランダムに生成されたファイル名
傍受の添字ファイルを取得する3.1
int型のインデックス= uploadFileName.lastIndexOf( "");
3.2接尾辞は、ファイルを傍受しました
ストリングsuffixName = uploadFileName.substring(インデックス)
3.3ランダムに生成されたファイル名と接尾辞ともスプライスの内部「 - 」削除
文字列uuidFileName = UUID.randomUUID()のtoString()を置き換える( " - "、「」)+ suffixName。。。
パスがない場合は4裁判官をアップロード作成するために存在します
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
5.ファイルのアップロード
File dictFile = new File(path + "/" + uuidFileName);
FileUtils.copyFile(upload,dictFile);
注意:インポートされたファイルのパッケージには、java.io.Fileにインポートする必要があります。
[カテゴリ]ドロップダウンボックス
親ブロック(フロント)
1.非同期ロードのJSONの方法を使用して、親クラスの表示プロパティの画面に記事を追加
第1のデータベース分類データから取得したアクション、搬送cparentid = 0パラメータを送信します
cparentidに応じて1.1ファインダー。
1.2 JSONコード化文字セット内とで反転表示機能()に応答してデータのフォーマットを知ることができます。
public String getCategory() throws IOException {
List<Category> list=articleService.getCategory(cparentid);
//把list转化为json格式回显
JSONArray jsonArray = JSONArray.fromObject(list,new JsonConfig());
//设置响应字符编码
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
ServletActionContext.getResponse().getWriter().println(jsonArray.toString());
return null;
}
2.エコー機能(データ)にデータを取得し、内部のオプションを横断するデータを書き込みます。
$.post("${ctx}/article/article_getCategory.action",{"cparentid":0},function (data) {
console.log(data);
//遍历
$(data).each(function (i, obj) {
$("#category_select").append("<option value="+obj.cid+">"+obj.cname+"</option>");
})
//一进来出发事件
$("#category_select").trigger("change");
},"json");
サブフレーム(以下、A)
1.変更イベントを登録
2親クラスのオプション値、VARのCID = $( "#のcategory_select")のval()から削除;
3.に従って親クラス値の親カテゴリのサブクラスに対応するデータベースから検索
前記カテゴリは、サブフレーム内に表示されています
注意:
1.サブカテゴリーは、$(「#のskill_select」)のサブフレームで()空の;.何人も、すべてのサブクラスを起こさないでしょうオーバーレイを空にするために、データ内のお金ボックスを表示する必要があります
彼らが来る人はサブクラスをロードされません変更イベントを開始する親である必要はないインターフェイスを入力するとき2.記事を追加
//一进来出发事件
$("#category_select").trigger("change");
//监听分类改变
$("#category_select").on("change",function () {
var cid = $("#category_select").val();
$.post("${ctx}/article/article_getCategory.action",{"cparentid":cid},function (data) {
$("#skill_select").empty();
$(data).each(function (i, obj) {
$("#skill_select").append("<option value="+obj.cid+">"+obj.cname+"</option>");
})
},"json")
})